org.apache.maven.plugins
diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetColumns.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetColumns.sql
index c932e6676..2c3c2e476 100644
--- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetColumns.sql
+++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetColumns.sql
@@ -74,7 +74,7 @@ SELECT TABLE_CATALOG AS "TABLE_CAT", TABLE_SCHEMA AS "TABLE_SCHEM", TABLE_NAME A
ELSE 'YES'
END AS "IS_GENERATEDCOLUMN"
FROM INFORMATION_SCHEMA.COLUMNS C
-WHERE UPPER(C.TABLE_CATALOG) LIKE ?
+WHERE UPPER(COALESCE(C.TABLE_CATALOG, '')) LIKE ?
AND UPPER(C.TABLE_SCHEMA) LIKE ?
AND UPPER(C.TABLE_NAME) LIKE ?
AND UPPER(C.COLUMN_NAME) LIKE ?
diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetCrossReferences.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetCrossReferences.sql
index d7542ca6e..33b398dae 100644
--- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetCrossReferences.sql
+++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetCrossReferences.sql
@@ -20,12 +20,12 @@ SELECT PARENT.TABLE_CATALOG AS "PKTABLE_CAT", PARENT.TABLE_SCHEMA AS "PKTABLE_SC
3 AS "DELETE_RULE", CONSTRAINTS.CONSTRAINT_NAME AS "FK_NAME", CONSTRAINTS.UNIQUE_CONSTRAINT_NAME AS "PK_NAME",
7 AS "DEFERRABILITY"
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONSTRAINTS
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON CONSTRAINTS.CONSTRAINT_CATALOG=CHILD.CONSTRAINT_CATALOG AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG=PARENT.CONSTRAINT_CATALOG AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
-WHERE UPPER(PARENT.TABLE_CATALOG) LIKE ?
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
+WHERE UPPER(COALESCE(PARENT.TABLE_CATALOG, '')) LIKE ?
AND UPPER(PARENT.TABLE_SCHEMA) LIKE ?
AND UPPER(PARENT.TABLE_NAME) LIKE ?
- AND UPPER(CHILD.TABLE_CATALOG) LIKE ?
+ AND UPPER(COALESCE(CHILD.TABLE_CATALOG, '')) LIKE ?
AND UPPER(CHILD.TABLE_SCHEMA) LIKE ?
AND UPPER(CHILD.TABLE_NAME) LIKE ?
ORDER BY CHILD.TABLE_CATALOG, CHILD.TABLE_SCHEMA, CHILD.TABLE_NAME, CHILD.ORDINAL_POSITION
diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetExportedKeys.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetExportedKeys.sql
index 7c04349e5..f2a9fb2f6 100644
--- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetExportedKeys.sql
+++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetExportedKeys.sql
@@ -23,9 +23,9 @@ SELECT PARENT.TABLE_CATALOG AS "PKTABLE_CAT", PARENT.TABLE_SCHEMA AS "PKTABLE_SC
CONSTRAINTS.CONSTRAINT_NAME AS "FK_NAME", CONSTRAINTS.UNIQUE_CONSTRAINT_NAME AS "PK_NAME",
7 AS "DEFERRABILITY" -- 7 = importedKeyNotDeferrable
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONSTRAINTS
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON CONSTRAINTS.CONSTRAINT_CATALOG=CHILD.CONSTRAINT_CATALOG AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG=PARENT.CONSTRAINT_CATALOG AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
-WHERE UPPER(PARENT.TABLE_CATALOG) LIKE ?
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
+WHERE UPPER(COALESCE(PARENT.TABLE_CATALOG, '')) LIKE ?
AND UPPER(PARENT.TABLE_SCHEMA) LIKE ?
AND UPPER(PARENT.TABLE_NAME) LIKE ?
ORDER BY CHILD.TABLE_CATALOG, CHILD.TABLE_SCHEMA, CHILD.TABLE_NAME, CHILD.ORDINAL_POSITION
diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetImportedKeys.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetImportedKeys.sql
index 44481deb0..c921b1c10 100644
--- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetImportedKeys.sql
+++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetImportedKeys.sql
@@ -23,9 +23,9 @@ SELECT PARENT.TABLE_CATALOG AS "PKTABLE_CAT", PARENT.TABLE_SCHEMA AS "PKTABLE_SC
CONSTRAINTS.CONSTRAINT_NAME AS "FK_NAME", CONSTRAINTS.UNIQUE_CONSTRAINT_NAME AS "PK_NAME",
7 AS "DEFERRABILITY" -- 7 = importedKeyNotDeferrable
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONSTRAINTS
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON CONSTRAINTS.CONSTRAINT_CATALOG=CHILD.CONSTRAINT_CATALOG AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
- INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG=PARENT.CONSTRAINT_CATALOG AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
-WHERE UPPER(CHILD.TABLE_CATALOG) LIKE ?
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CHILD ON COALESCE(CONSTRAINTS.CONSTRAINT_CATALOG, '')=COALESCE(CHILD.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.CONSTRAINT_SCHEMA= CHILD.CONSTRAINT_SCHEMA AND CONSTRAINTS.CONSTRAINT_NAME= CHILD.CONSTRAINT_NAME
+ INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE PARENT ON COALESCE(CONSTRAINTS.UNIQUE_CONSTRAINT_CATALOG, '')=COALESCE(PARENT.CONSTRAINT_CATALOG, '') AND CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA=PARENT.CONSTRAINT_SCHEMA AND CONSTRAINTS.UNIQUE_CONSTRAINT_NAME=PARENT.CONSTRAINT_NAME AND PARENT.ORDINAL_POSITION=CHILD.POSITION_IN_UNIQUE_CONSTRAINT
+WHERE UPPER(COALESCE(CHILD.TABLE_CATALOG, '')) LIKE ?
AND UPPER(CHILD.TABLE_SCHEMA) LIKE ?
AND UPPER(CHILD.TABLE_NAME) LIKE ?
ORDER BY PARENT.TABLE_CATALOG, PARENT.TABLE_SCHEMA, PARENT.TABLE_NAME, CHILD.ORDINAL_POSITION
diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetIndexInfo.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetIndexInfo.sql
index 7bffd40bc..7fc7e4a76 100644
--- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetIndexInfo.sql
+++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetIndexInfo.sql
@@ -24,11 +24,11 @@ SELECT IDX.TABLE_CATALOG AS "TABLE_CAT", IDX.TABLE_SCHEMA AS "TABLE_SCHEM", IDX.
NULL AS "FILTER_CONDITION"
FROM INFORMATION_SCHEMA.INDEXES IDX
INNER JOIN INFORMATION_SCHEMA.INDEX_COLUMNS COL
- ON IDX.TABLE_CATALOG=COL.TABLE_CATALOG
+ ON COALESCE(IDX.TABLE_CATALOG, '')=COALESCE(COL.TABLE_CATALOG, '')
AND IDX.TABLE_SCHEMA=COL.TABLE_SCHEMA
AND IDX.TABLE_NAME=COL.TABLE_NAME
AND IDX.INDEX_NAME=COL.INDEX_NAME
-WHERE UPPER(IDX.TABLE_CATALOG) LIKE ?
+WHERE UPPER(COALESCE(IDX.TABLE_CATALOG, '')) LIKE ?
AND UPPER(IDX.TABLE_SCHEMA) LIKE ?
AND UPPER(IDX.TABLE_NAME) LIKE ?
AND UPPER(IDX.INDEX_NAME) LIKE ?
diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetPrimaryKeys.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetPrimaryKeys.sql
index de9214c64..d8ad2e8c6 100644
--- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetPrimaryKeys.sql
+++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetPrimaryKeys.sql
@@ -18,12 +18,12 @@ SELECT IDX.TABLE_CATALOG AS "TABLE_CAT", IDX.TABLE_SCHEMA AS "TABLE_SCHEM", IDX.
COLS.COLUMN_NAME AS "COLUMN_NAME", ORDINAL_POSITION AS "KEY_SEQ", IDX.INDEX_NAME AS "PK_NAME"
FROM INFORMATION_SCHEMA.INDEXES IDX
INNER JOIN INFORMATION_SCHEMA.INDEX_COLUMNS COLS
- ON IDX.TABLE_CATALOG=COLS.TABLE_CATALOG
+ ON COALESCE(IDX.TABLE_CATALOG, '')=COALESCE(COLS.TABLE_CATALOG, '')
AND IDX.TABLE_SCHEMA=COLS.TABLE_SCHEMA
AND IDX.TABLE_NAME=COLS.TABLE_NAME
AND IDX.INDEX_NAME=COLS.INDEX_NAME
WHERE IDX.INDEX_TYPE='PRIMARY_KEY'
- AND UPPER(IDX.TABLE_CATALOG) LIKE ?
+ AND UPPER(COALESCE(IDX.TABLE_CATALOG, '')) LIKE ?
AND UPPER(IDX.TABLE_SCHEMA) LIKE ?
AND UPPER(IDX.TABLE_NAME) LIKE ?
ORDER BY COLS.ORDINAL_POSITION
\ No newline at end of file
diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetSchemas.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetSchemas.sql
index 5b93ef433..b645f46bf 100644
--- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetSchemas.sql
+++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetSchemas.sql
@@ -16,6 +16,6 @@
SELECT SCHEMA_NAME AS "TABLE_SCHEM", CATALOG_NAME AS "TABLE_CATALOG"
FROM INFORMATION_SCHEMA.SCHEMATA
-WHERE UPPER(CATALOG_NAME) LIKE ?
+WHERE UPPER(COALESCE(CATALOG_NAME, '')) LIKE ?
AND UPPER(SCHEMA_NAME) LIKE ?
ORDER BY CATALOG_NAME, SCHEMA_NAME
diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetTables.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetTables.sql
index 911616cff..9ddbb0585 100644
--- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetTables.sql
+++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetTables.sql
@@ -19,7 +19,7 @@ SELECT TABLE_CATALOG AS "TABLE_CAT", TABLE_SCHEMA AS "TABLE_SCHEM", TABLE_NAME A
NULL AS "REMARKS", NULL AS "TYPE_CAT", NULL AS "TYPE_SCHEM", NULL AS "TYPE_NAME",
NULL AS "SELF_REFERENCING_COL_NAME", NULL AS "REF_GENERATION"
FROM INFORMATION_SCHEMA.TABLES AS T
-WHERE UPPER(TABLE_CATALOG) LIKE ?
+WHERE UPPER(COALESCE(TABLE_CATALOG, '')) LIKE ?
AND UPPER(TABLE_SCHEMA) LIKE ?
AND UPPER(TABLE_NAME) LIKE ?
AND (
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/ITAbstractJdbcTest.java b/src/test/java/com/google/cloud/spanner/jdbc/ITAbstractJdbcTest.java
deleted file mode 100644
index 1a8a6adea..000000000
--- a/src/test/java/com/google/cloud/spanner/jdbc/ITAbstractJdbcTest.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright 2019 Google LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.cloud.spanner.jdbc;
-
-import com.google.cloud.spanner.Database;
-import com.google.cloud.spanner.Dialect;
-import com.google.cloud.spanner.GceTestEnvConfig;
-import com.google.cloud.spanner.IntegrationTestEnv;
-import com.google.cloud.spanner.connection.AbstractSqlScriptVerifier;
-import com.google.cloud.spanner.connection.ConnectionOptions;
-import com.google.cloud.spanner.connection.ITAbstractSpannerTest;
-import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier.JdbcGenericConnection;
-import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Arrays;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-
-/** Base class for all JDBC integration tests. */
-public class ITAbstractJdbcTest {
- protected class ITJdbcConnectionProvider
- implements com.google.cloud.spanner.connection.AbstractSqlScriptVerifier
- .GenericConnectionProvider {
- public ITJdbcConnectionProvider() {}
-
- @Override
- public JdbcGenericConnection getConnection() {
- try {
- return JdbcGenericConnection.of(createConnection(getDialect()));
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- @ClassRule
- public static IntegrationTestEnv env =
- new IntegrationTestEnv() {
- @Override
- protected void after() {
- super.after();
- ConnectionOptions.closeSpanner();
- }
- };
-
- private static final String DEFAULT_KEY_FILE = null;
- private static Database googleStandardSqlDatabase;
- private static Database postgresDatabase;
-
- protected static String getKeyFile() {
- return System.getProperty(GceTestEnvConfig.GCE_CREDENTIALS_FILE, DEFAULT_KEY_FILE);
- }
-
- protected static boolean hasValidKeyFile() {
- return getKeyFile() != null && Files.exists(Paths.get(getKeyFile()));
- }
-
- protected static IntegrationTestEnv getTestEnv() {
- return env;
- }
-
- protected static Database getDatabase() {
- return getDatabase(Dialect.GOOGLE_STANDARD_SQL);
- }
-
- protected static Database getDatabase(Dialect dialect) {
- if (dialect == Dialect.POSTGRESQL) {
- return postgresDatabase;
- }
- return googleStandardSqlDatabase;
- }
-
- @BeforeClass
- public static void setup() {
- googleStandardSqlDatabase = env.getTestHelper().createTestDatabase();
- postgresDatabase = env.getTestHelper().createTestDatabase(Dialect.POSTGRESQL, Arrays.asList());
- }
-
- @AfterClass
- public static void teardown() {
- ConnectionOptions.closeSpanner();
- }
-
- /**
- * Creates a new default JDBC connection to a test database. Use the method {@link
- * ITAbstractJdbcTest#appendConnectionUri(StringBuilder)} to append additional connection options
- * to the connection URI.
- *
- * @return The newly opened JDBC connection.
- */
- public CloudSpannerJdbcConnection createConnection(Dialect dialect) throws SQLException {
- // Create a connection URL for the generic connection API.
- StringBuilder url =
- ITAbstractSpannerTest.extractConnectionUrl(
- env.getTestHelper().getOptions(), getDatabase(dialect));
- // Prepend it with 'jdbc:' to make it a valid JDBC connection URL.
- url.insert(0, "jdbc:");
- if (hasValidKeyFile()) {
- url.append(";credentials=").append(getKeyFile());
- }
- appendConnectionUri(url);
-
- return DriverManager.getConnection(url.toString() + ";dialect=" + dialect.name())
- .unwrap(CloudSpannerJdbcConnection.class);
- }
-
- public CloudSpannerJdbcConnection createConnection() throws SQLException {
- return createConnection(Dialect.POSTGRESQL);
- }
-
- protected void appendConnectionUri(StringBuilder uri) {}
-
- /**
- * Override this method to instruct the test to create a default test table in the form:
- *
- *
- * CREATE TABLE TEST (ID INT64 NOT NULL, NAME STRING(100) NOT NULL) PRIMARY KEY (ID)
- *
- *
- * Note that the table is not re-created for each test case, but is preserved between test cases.
- * It is the responsibility of the test class to either empty the table at the end of each test
- * case, or keep track of the state of the test table and execute the test cases in a specific
- * order.
- *
- * @return true if the default test table should be created.
- */
- protected boolean doCreateDefaultTestTable() {
- return false;
- }
-
- protected boolean doCreateMusicTables() {
- return false;
- }
-
- @Before
- public void createTestTable() throws SQLException {
- if (doCreateDefaultTestTable()) {
- try (Connection connection = createConnection(getDialect())) {
- connection.setAutoCommit(true);
- if (!tableExists(connection, "TEST")) {
- connection.setAutoCommit(false);
- String createTableDdl;
- if (getDialect() == Dialect.GOOGLE_STANDARD_SQL) {
- createTableDdl =
- "CREATE TABLE TEST (ID INT64 NOT NULL, NAME STRING(100) NOT NULL) PRIMARY KEY (ID)";
- } else {
- createTableDdl =
- "CREATE TABLE TEST (ID BIGINT PRIMARY KEY, NAME VARCHAR(100) NOT NULL)";
- }
- connection.createStatement().execute("START BATCH DDL");
- connection.createStatement().execute(createTableDdl);
- connection.createStatement().execute("RUN BATCH");
- }
- }
- }
- }
-
- public Dialect getDialect() {
- return Dialect.GOOGLE_STANDARD_SQL;
- }
-
- public String getDefaultCatalog() {
- if (getDialect() == Dialect.POSTGRESQL) {
- return getDatabase(Dialect.POSTGRESQL).getId().getDatabase();
- }
- return "";
- }
-
- public String getDefaultSchema() {
- if (getDialect() == Dialect.POSTGRESQL) {
- return "public";
- }
- return "";
- }
-
- @Before
- public void createMusicTables() throws SQLException {
- if (doCreateMusicTables()) {
- try (Connection connection = createConnection(getDialect())) {
- connection.setAutoCommit(true);
- if (!tableExists(connection, "Singers")) {
- String scriptFile = "CreateMusicTables.sql";
- if (getDialect() == Dialect.POSTGRESQL) {
- scriptFile = "CreateMusicTables_PG.sql";
- }
- if (EmulatorSpannerHelper.isUsingEmulator()) {
- scriptFile = "CreateMusicTables_Emulator.sql";
- }
- for (String statement :
- AbstractSqlScriptVerifier.readStatementsFromFile(scriptFile, getClass())) {
- connection.createStatement().execute(statement);
- }
- }
- }
- }
- }
-
- protected boolean tableExists(Connection connection, String table) throws SQLException {
- try (ResultSet rs =
- connection.getMetaData().getTables(getDefaultCatalog(), getDefaultSchema(), table, null)) {
- if (rs.next()) {
- if (rs.getString("TABLE_NAME").equalsIgnoreCase(table)) {
- return true;
- }
- }
- }
- return false;
- }
-
- protected boolean indexExists(Connection connection, String table, String index)
- throws SQLException {
- Preconditions.checkArgument(!Strings.isNullOrEmpty(index));
- try (PreparedStatement ps =
- connection.prepareStatement(
- "SELECT INDEX_NAME FROM INFORMATION_SCHEMA.INDEXES WHERE UPPER(TABLE_NAME)=? AND UPPER(INDEX_NAME)=?")) {
- ps.setString(1, table);
- ps.setString(2, index);
- try (ResultSet rs = ps.executeQuery()) {
- return rs.next();
- }
- }
- }
-}
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITAbstractJdbcTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITAbstractJdbcTest.java
new file mode 100644
index 000000000..b6fb245c7
--- /dev/null
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITAbstractJdbcTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.spanner.jdbc.it;
+
+import com.google.cloud.spanner.Database;
+import com.google.cloud.spanner.Dialect;
+import com.google.cloud.spanner.GceTestEnvConfig;
+import com.google.cloud.spanner.connection.AbstractSqlScriptVerifier;
+import com.google.cloud.spanner.connection.ITAbstractSpannerTest;
+import com.google.cloud.spanner.jdbc.CloudSpannerJdbcConnection;
+import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier.JdbcGenericConnection;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.stream.Collectors;
+
+/** Base class for all JDBC integration tests. */
+public class ITAbstractJdbcTest {
+ protected class ITJdbcConnectionProvider
+ implements com.google.cloud.spanner.connection.AbstractSqlScriptVerifier
+ .GenericConnectionProvider {
+ private final JdbcIntegrationTestEnv env;
+ private final Database database;
+
+ public ITJdbcConnectionProvider(JdbcIntegrationTestEnv env, Database database) {
+ this.env = env;
+ this.database = database;
+ }
+
+ @Override
+ public JdbcGenericConnection getConnection() {
+ try {
+ return JdbcGenericConnection.of(createConnection(env, database));
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ private static final String DEFAULT_KEY_FILE = null;
+
+ protected static String getKeyFile() {
+ return System.getProperty(GceTestEnvConfig.GCE_CREDENTIALS_FILE, DEFAULT_KEY_FILE);
+ }
+
+ protected static boolean hasValidKeyFile() {
+ return getKeyFile() != null && Files.exists(Paths.get(getKeyFile()));
+ }
+
+ /**
+ * Creates a new default JDBC connection to a test database. Use the method {@link
+ * ITAbstractJdbcTest#appendConnectionUri(StringBuilder)} to append additional connection options
+ * to the connection URI.
+ *
+ * @return The newly opened JDBC connection.
+ */
+ public CloudSpannerJdbcConnection createConnection(JdbcIntegrationTestEnv env, Database database)
+ throws SQLException {
+ // Create a connection URL for the generic connection API.
+ StringBuilder url =
+ ITAbstractSpannerTest.extractConnectionUrl(env.getTestHelper().getOptions(), database);
+ // Prepend it with 'jdbc:' to make it a valid JDBC connection URL.
+ url.insert(0, "jdbc:");
+ if (hasValidKeyFile()) {
+ url.append(";credentials=").append(getKeyFile());
+ }
+ appendConnectionUri(url);
+
+ return DriverManager.getConnection(url.toString()).unwrap(CloudSpannerJdbcConnection.class);
+ }
+
+ protected void appendConnectionUri(StringBuilder uri) {}
+
+ static Collection getTestTableDdl(Dialect dialect) {
+ switch (dialect) {
+ case POSTGRESQL:
+ return Collections.singleton(
+ "CREATE TABLE TEST (ID BIGINT PRIMARY KEY, NAME VARCHAR(100) NOT NULL)");
+ case GOOGLE_STANDARD_SQL:
+ default:
+ return Collections.singleton(
+ "CREATE TABLE TEST (ID INT64 NOT NULL, NAME STRING(100) NOT NULL) PRIMARY KEY (ID)");
+ }
+ }
+
+ static Collection getMusicTablesDdl(Dialect dialect) {
+ String scriptFile;
+ switch (dialect) {
+ case POSTGRESQL:
+ scriptFile = "CreateMusicTables_PG.sql";
+ break;
+ case GOOGLE_STANDARD_SQL:
+ default:
+ scriptFile = "CreateMusicTables.sql";
+ }
+ if (EmulatorSpannerHelper.isUsingEmulator()) {
+ scriptFile = "CreateMusicTables_Emulator.sql";
+ }
+ return AbstractSqlScriptVerifier.readStatementsFromFile(scriptFile, ITAbstractJdbcTest.class)
+ .stream()
+ .filter(sql -> !(sql.contains("START BATCH") || sql.contains("RUN BATCH")))
+ .collect(Collectors.toList());
+ }
+
+ public Dialect getDialect() {
+ return Dialect.GOOGLE_STANDARD_SQL;
+ }
+
+ public String getDefaultCatalog(Database database) {
+ if (getDialect() == Dialect.POSTGRESQL) {
+ return database.getId().getDatabase();
+ }
+ return "";
+ }
+
+ public String getDefaultSchema() {
+ if (getDialect() == Dialect.POSTGRESQL) {
+ return "public";
+ }
+ return "";
+ }
+
+ protected boolean tableExists(Connection connection, String table) throws SQLException {
+ try (ResultSet rs = connection.getMetaData().getTables(null, getDefaultSchema(), table, null)) {
+ if (rs.next()) {
+ if (rs.getString("TABLE_NAME").equalsIgnoreCase(table)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ protected boolean indexExists(Connection connection, String table, String index)
+ throws SQLException {
+ Preconditions.checkArgument(!Strings.isNullOrEmpty(index));
+ try (PreparedStatement ps =
+ connection.prepareStatement(
+ "SELECT INDEX_NAME FROM INFORMATION_SCHEMA.INDEXES WHERE UPPER(TABLE_NAME)=? AND UPPER(INDEX_NAME)=?")) {
+ ps.setString(1, table);
+ ps.setString(2, index);
+ try (ResultSet rs = ps.executeQuery()) {
+ return rs.next();
+ }
+ }
+ }
+}
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcConnectTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcConnectTest.java
index 90a7ea8a1..c81a63338 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcConnectTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcConnectTest.java
@@ -20,10 +20,11 @@
import com.google.auth.oauth2.AccessToken;
import com.google.auth.oauth2.GoogleCredentials;
+import com.google.cloud.spanner.Database;
+import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.SpannerOptions;
import com.google.cloud.spanner.jdbc.CloudSpannerJdbcConnection;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.jdbc.JdbcDataSource;
import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import java.io.FileInputStream;
@@ -32,8 +33,11 @@
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Collections;
import java.util.Properties;
import javax.sql.DataSource;
+import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -53,13 +57,21 @@
@Category(ParallelIntegrationTest.class)
@RunWith(JUnit4.class)
public class ITJdbcConnectTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
+ private Database database;
+
+ @Before
+ public void setup() {
+ database = env.getOrCreateDatabase(Dialect.GOOGLE_STANDARD_SQL, Collections.emptyList());
+ }
private String createBaseUrl() {
StringBuilder url = new StringBuilder("jdbc:cloudspanner:");
if (EmulatorSpannerHelper.isUsingEmulator()) {
url.append("//").append(System.getenv("SPANNER_EMULATOR_HOST"));
}
- url.append("/").append(getDatabase().getId().getName());
+ url.append("/").append(database.getId().getName());
if (EmulatorSpannerHelper.isUsingEmulator()) {
url.append(";usePlainText=true");
}
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcDatabaseMetaDataTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcDatabaseMetaDataTest.java
index a8a09fab7..ea7c236a4 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcDatabaseMetaDataTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcDatabaseMetaDataTest.java
@@ -27,8 +27,8 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.ParallelIntegrationTest;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -37,7 +37,8 @@
import java.sql.Types;
import java.util.Arrays;
import java.util.List;
-import org.junit.BeforeClass;
+import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -56,15 +57,13 @@ public class ITJdbcDatabaseMetaDataTest extends ITAbstractJdbcTest {
private static final String TABLE_WITH_ALL_COLS = "TableWithAllColumnTypes";
private static final String TABLE_WITH_REF = "TableWithRef";
- @BeforeClass
- public static void skipOnEmulator() {
- assumeFalse(
- "foreign keys are not supported on the emulator", EmulatorSpannerHelper.isUsingEmulator());
- }
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
+ private Database database;
- @Override
- protected boolean doCreateMusicTables() {
- return true;
+ @Before
+ public void setup() {
+ database = env.getOrCreateDatabase(getDialect(), getMusicTablesDdl(getDialect()));
}
private static final class Column {
@@ -171,7 +170,7 @@ private Column(
@Test
public void testGetColumns() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
@@ -241,7 +240,7 @@ public void testGetColumns() throws SQLException {
@Test
public void testGetCrossReferences() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
@@ -517,7 +516,7 @@ private IndexInfo(
@Test
public void testGetIndexInfo() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
@@ -557,7 +556,7 @@ public void testGetIndexInfo() throws SQLException {
@Test
public void testGetExportedKeys() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
@@ -573,7 +572,7 @@ public void testGetExportedKeys() throws SQLException {
@Test
public void testGetImportedKeys() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
@@ -772,7 +771,7 @@ private void assertKeysAlbumsSongs(ResultSet rs) throws SQLException {
@Test
public void testGetPrimaryKeys() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection.getMetaData().getPrimaryKeys(DEFAULT_CATALOG, DEFAULT_SCHEMA, SINGERS_TABLE)) {
assertThat(rs.next(), is(true));
@@ -807,7 +806,8 @@ public void testGetPrimaryKeys() throws SQLException {
@Test
public void testGetViews() throws SQLException {
- try (Connection connection = createConnection()) {
+ assumeFalse("Emulator does not yet support views", EmulatorSpannerHelper.isUsingEmulator());
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs = connection.getMetaData().getTables("", "", null, new String[] {"VIEW"})) {
assertTrue(rs.next());
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
@@ -820,7 +820,7 @@ public void testGetViews() throws SQLException {
@Test
public void testGetSchemas() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs = connection.getMetaData().getSchemas()) {
assertThat(rs.next(), is(true));
assertThat(rs.getString("TABLE_SCHEM"), is(equalTo(DEFAULT_SCHEMA)));
@@ -828,9 +828,12 @@ public void testGetSchemas() throws SQLException {
assertThat(rs.next(), is(true));
assertThat(rs.getString("TABLE_SCHEM"), is(equalTo("INFORMATION_SCHEMA")));
assertThat(rs.getString("TABLE_CATALOG"), is(equalTo(DEFAULT_CATALOG)));
- assertThat(rs.next(), is(true));
- assertThat(rs.getString("TABLE_SCHEM"), is(equalTo("SPANNER_SYS")));
- assertThat(rs.getString("TABLE_CATALOG"), is(equalTo(DEFAULT_CATALOG)));
+ if (!EmulatorSpannerHelper.isUsingEmulator()) {
+ assertThat(rs.next(), is(true));
+ assertThat(rs.getString("TABLE_SCHEM"), is(equalTo("SPANNER_SYS")));
+ assertThat(rs.getString("TABLE_CATALOG"), is(equalTo(DEFAULT_CATALOG)));
+ }
+ assertFalse(rs.next());
}
}
}
@@ -861,10 +864,13 @@ private Table(String name, String type) {
@Test
public void testGetTables() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection.getMetaData().getTables(DEFAULT_CATALOG, DEFAULT_SCHEMA, null, null)) {
for (Table table : EXPECTED_TABLES) {
+ if (EmulatorSpannerHelper.isUsingEmulator() && table.name.equals("SingersView")) {
+ continue;
+ }
assertTrue(rs.next());
assertEquals(DEFAULT_CATALOG, rs.getString("TABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcDdlTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcDdlTest.java
index 1833fbbd0..5273cb4d3 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcDdlTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcDdlTest.java
@@ -16,14 +16,20 @@
package com.google.cloud.spanner.jdbc.it;
+import static org.junit.Assume.assumeFalse;
+
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.ParallelIntegrationTest;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import com.google.common.collect.ImmutableMap;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
+import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -35,6 +41,8 @@
@Category(ParallelIntegrationTest.class)
@RunWith(Parameterized.class)
public class ITJdbcDdlTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
@Parameters(name = "Dialect = {0}")
public static List data() {
List params = new ArrayList<>();
@@ -52,6 +60,16 @@ public static List data() {
@Parameter public DialectTestParameter dialect;
+ private Database database;
+
+ @Before
+ public void setup() {
+ assumeFalse(
+ "Emulator does not support PostgreSQL",
+ dialect.dialect == Dialect.POSTGRESQL && EmulatorSpannerHelper.isUsingEmulator());
+ database = env.getOrCreateDatabase(getDialect(), Collections.emptyList());
+ }
+
@Override
public Dialect getDialect() {
return dialect.dialect;
@@ -59,8 +77,9 @@ public Dialect getDialect() {
@Test
public void testSqlScript() throws Exception {
- JdbcSqlScriptVerifier verifier = new JdbcSqlScriptVerifier(new ITJdbcConnectionProvider());
+ JdbcSqlScriptVerifier verifier =
+ new JdbcSqlScriptVerifier(new ITJdbcConnectionProvider(env, database));
verifier.verifyStatementsInFile(
- dialect.executeQueriesFiles.get("TEST_DDL"), ITAbstractJdbcTest.class, false);
+ dialect.executeQueriesFiles.get("TEST_DDL"), JdbcSqlScriptVerifier.class, false);
}
}
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java
index e9b682a20..af258ba9e 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java
@@ -23,9 +23,9 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.ParallelIntegrationTest;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -34,7 +34,9 @@
import java.sql.Types;
import java.util.Arrays;
import java.util.List;
+import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.ClassRule;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -45,6 +47,8 @@
@Category(ParallelIntegrationTest.class)
@RunWith(JUnit4.class)
public class ITJdbcPgDatabaseMetaDataTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
private static final String DEFAULT_SCHEMA = "public";
private static final String SINGERS_TABLE = "Singers";
private static final String ALBUMS_TABLE = "Albums";
@@ -60,9 +64,15 @@ public static void skipOnEmulator() {
EmulatorSpannerHelper.isUsingEmulator());
}
- @Override
- protected boolean doCreateMusicTables() {
- return true;
+ private Database database;
+
+ @Before
+ public void setup() {
+ database = env.getOrCreateDatabase(getDialect(), getMusicTablesDdl(getDialect()));
+ }
+
+ public Dialect getDialect() {
+ return Dialect.POSTGRESQL;
}
private static final class Column {
@@ -130,21 +140,17 @@ private Column(
null),
new Column("colnumeric", Types.NUMERIC, "numeric", 15, 16383, 10, false, null));
- public Dialect getDialect() {
- return Dialect.POSTGRESQL;
- }
-
@Test
public void testGetColumns() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
- .getColumns(getDefaultCatalog(), DEFAULT_SCHEMA, TABLE_WITH_ALL_COLS, null)) {
+ .getColumns(getDefaultCatalog(database), DEFAULT_SCHEMA, TABLE_WITH_ALL_COLS, null)) {
int pos = 1;
for (Column col : EXPECTED_COLUMNS) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
assertEquals("tablewithallcolumntypes", rs.getString("TABLE_NAME"));
assertEquals(col.name, rs.getString("COLUMN_NAME"));
@@ -205,24 +211,24 @@ public void testGetColumns() throws SQLException {
@Test
public void testGetCrossReferences() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
.getCrossReference(
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
SINGERS_TABLE,
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
ALBUMS_TABLE)) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("singers", rs.getString("PKTABLE_NAME"));
assertEquals("singerid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("albums", rs.getString("FKTABLE_NAME"));
assertEquals("singerid", rs.getString("FKCOLUMN_NAME"));
@@ -238,18 +244,18 @@ public void testGetCrossReferences() throws SQLException {
connection
.getMetaData()
.getCrossReference(
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
ALBUMS_TABLE,
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
SONGS_TABLE)) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("albums", rs.getString("PKTABLE_NAME"));
assertEquals("singerid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("songs", rs.getString("FKTABLE_NAME"));
assertEquals("singerid", rs.getString("FKCOLUMN_NAME"));
@@ -262,11 +268,11 @@ public void testGetCrossReferences() throws SQLException {
(short) DatabaseMetaData.importedKeyNotDeferrable, rs.getShort("DEFERRABILITY"));
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("albums", rs.getString("PKTABLE_NAME"));
assertEquals("albumid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("songs", rs.getString("FKTABLE_NAME"));
assertEquals("albumid", rs.getString("FKCOLUMN_NAME"));
@@ -285,18 +291,18 @@ public void testGetCrossReferences() throws SQLException {
connection
.getMetaData()
.getCrossReference(
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
SINGERS_TABLE,
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
CONCERTS_TABLE)) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("singers", rs.getString("PKTABLE_NAME"));
assertEquals("singerid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("concerts", rs.getString("FKTABLE_NAME"));
assertEquals("singerid", rs.getString("FKCOLUMN_NAME"));
@@ -315,19 +321,19 @@ public void testGetCrossReferences() throws SQLException {
connection
.getMetaData()
.getCrossReference(
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
TABLE_WITH_ALL_COLS,
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
TABLE_WITH_REF)) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("tablewithallcolumntypes", rs.getString("PKTABLE_NAME"));
assertEquals("colfloat64", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("tablewithref", rs.getString("FKTABLE_NAME"));
assertEquals("reffloat", rs.getString("FKCOLUMN_NAME"));
@@ -339,11 +345,11 @@ public void testGetCrossReferences() throws SQLException {
(short) DatabaseMetaData.importedKeyNotDeferrable, rs.getShort("DEFERRABILITY"));
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("tablewithallcolumntypes", rs.getString("PKTABLE_NAME"));
assertEquals("colstring", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("tablewithref", rs.getString("FKTABLE_NAME"));
assertEquals("refstring", rs.getString("FKCOLUMN_NAME"));
@@ -361,10 +367,10 @@ public void testGetCrossReferences() throws SQLException {
connection
.getMetaData()
.getCrossReference(
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
ALBUMS_TABLE,
- getDefaultCatalog(),
+ getDefaultCatalog(database),
DEFAULT_SCHEMA,
ALBUMS_TABLE)) {
assertFalse(rs.next());
@@ -439,19 +445,19 @@ private IndexInfo(
@Test
public void testGetIndexInfo() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
- .getIndexInfo(getDefaultCatalog(), DEFAULT_SCHEMA, null, false, false)) {
+ .getIndexInfo(getDefaultCatalog(database), DEFAULT_SCHEMA, null, false, false)) {
for (IndexInfo index : EXPECTED_INDICES) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
assertEquals(index.tableName, rs.getString("TABLE_NAME"));
assertEquals(index.nonUnique, rs.getBoolean("NON_UNIQUE"));
- assertEquals(getDefaultCatalog(), rs.getString("INDEX_QUALIFIER"));
+ assertEquals(getDefaultCatalog(database), rs.getString("INDEX_QUALIFIER"));
// Foreign key index names are automatically generated.
if (!"FOREIGN_KEY".equals(index.indexName) && !"GENERATED".equals(index.indexName)) {
@@ -476,17 +482,17 @@ public void testGetIndexInfo() throws SQLException {
@Test
public void testGetExportedKeys() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
- .getExportedKeys(getDefaultCatalog(), DEFAULT_SCHEMA, SINGERS_TABLE)) {
+ .getExportedKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, SINGERS_TABLE)) {
assertExportedKeysSingers(rs);
}
try (ResultSet rs =
connection
.getMetaData()
- .getExportedKeys(getDefaultCatalog(), DEFAULT_SCHEMA, ALBUMS_TABLE)) {
+ .getExportedKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, ALBUMS_TABLE)) {
assertKeysAlbumsSongs(rs);
}
}
@@ -494,35 +500,35 @@ public void testGetExportedKeys() throws SQLException {
@Test
public void testGetImportedKeys() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
- .getImportedKeys(getDefaultCatalog(), DEFAULT_SCHEMA, SINGERS_TABLE)) {
+ .getImportedKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, SINGERS_TABLE)) {
assertImportedKeysSingers(rs);
}
try (ResultSet rs =
connection
.getMetaData()
- .getImportedKeys(getDefaultCatalog(), DEFAULT_SCHEMA, ALBUMS_TABLE)) {
+ .getImportedKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, ALBUMS_TABLE)) {
assertImportedKeysAlbums(rs);
}
try (ResultSet rs =
connection
.getMetaData()
- .getImportedKeys(getDefaultCatalog(), DEFAULT_SCHEMA, CONCERTS_TABLE)) {
+ .getImportedKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, CONCERTS_TABLE)) {
assertImportedKeysConcerts(rs);
}
try (ResultSet rs =
connection
.getMetaData()
- .getImportedKeys(getDefaultCatalog(), DEFAULT_SCHEMA, SONGS_TABLE)) {
+ .getImportedKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, SONGS_TABLE)) {
assertKeysAlbumsSongs(rs);
}
try (ResultSet rs =
connection
.getMetaData()
- .getImportedKeys(getDefaultCatalog(), DEFAULT_SCHEMA, TABLE_WITH_REF)) {
+ .getImportedKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, TABLE_WITH_REF)) {
assertImportedKeysTableWithRef(rs);
}
}
@@ -534,11 +540,11 @@ private void assertImportedKeysSingers(ResultSet rs) throws SQLException {
private void assertImportedKeysTableWithRef(ResultSet rs) throws SQLException {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("tablewithallcolumntypes", rs.getString("PKTABLE_NAME"));
assertEquals("colfloat64", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("tablewithref", rs.getString("FKTABLE_NAME"));
assertEquals("reffloat", rs.getString("FKCOLUMN_NAME"));
@@ -550,11 +556,11 @@ private void assertImportedKeysTableWithRef(ResultSet rs) throws SQLException {
assertEquals(DatabaseMetaData.importedKeyNotDeferrable, rs.getInt("DEFERRABILITY"));
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("tablewithallcolumntypes", rs.getString("PKTABLE_NAME"));
assertEquals("colstring", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("tablewithref", rs.getString("FKTABLE_NAME"));
assertEquals("refstring", rs.getString("FKCOLUMN_NAME"));
@@ -570,11 +576,11 @@ private void assertImportedKeysTableWithRef(ResultSet rs) throws SQLException {
private void assertImportedKeysAlbums(ResultSet rs) throws SQLException {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("singers", rs.getString("PKTABLE_NAME"));
assertEquals("singerid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("albums", rs.getString("FKTABLE_NAME"));
assertEquals("singerid", rs.getString("FKCOLUMN_NAME"));
@@ -590,11 +596,11 @@ private void assertImportedKeysAlbums(ResultSet rs) throws SQLException {
private void assertImportedKeysConcerts(ResultSet rs) throws SQLException {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("singers", rs.getString("PKTABLE_NAME"));
assertEquals("singerid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("concerts", rs.getString("FKTABLE_NAME"));
assertEquals("singerid", rs.getString("FKCOLUMN_NAME"));
@@ -609,11 +615,11 @@ private void assertImportedKeysConcerts(ResultSet rs) throws SQLException {
private void assertExportedKeysSingers(ResultSet rs) throws SQLException {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("singers", rs.getString("PKTABLE_NAME"));
assertEquals("singerid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("albums", rs.getString("FKTABLE_NAME"));
assertEquals("singerid", rs.getString("FKCOLUMN_NAME"));
@@ -625,11 +631,11 @@ private void assertExportedKeysSingers(ResultSet rs) throws SQLException {
assertEquals(DatabaseMetaData.importedKeyNotDeferrable, rs.getInt("DEFERRABILITY"));
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("singers", rs.getString("PKTABLE_NAME"));
assertEquals("singerid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("concerts", rs.getString("FKTABLE_NAME"));
assertEquals("singerid", rs.getString("FKCOLUMN_NAME"));
@@ -645,11 +651,11 @@ private void assertExportedKeysSingers(ResultSet rs) throws SQLException {
private void assertKeysAlbumsSongs(ResultSet rs) throws SQLException {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("albums", rs.getString("PKTABLE_NAME"));
assertEquals("singerid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("songs", rs.getString("FKTABLE_NAME"));
assertEquals("singerid", rs.getString("FKCOLUMN_NAME"));
@@ -661,11 +667,11 @@ private void assertKeysAlbumsSongs(ResultSet rs) throws SQLException {
assertEquals(DatabaseMetaData.importedKeyNotDeferrable, rs.getInt("DEFERRABILITY"));
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("PKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("PKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("PKTABLE_SCHEM"));
assertEquals("albums", rs.getString("PKTABLE_NAME"));
assertEquals("albumid", rs.getString("PKCOLUMN_NAME"));
- assertEquals(getDefaultCatalog(), rs.getString("FKTABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("FKTABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("FKTABLE_SCHEM"));
assertEquals("songs", rs.getString("FKTABLE_NAME"));
assertEquals("albumid", rs.getString("FKCOLUMN_NAME"));
@@ -681,13 +687,13 @@ private void assertKeysAlbumsSongs(ResultSet rs) throws SQLException {
@Test
public void testGetPrimaryKeys() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
- .getPrimaryKeys(getDefaultCatalog(), DEFAULT_SCHEMA, SINGERS_TABLE)) {
+ .getPrimaryKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, SINGERS_TABLE)) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
assertEquals("singers", rs.getString("TABLE_NAME"));
assertEquals("singerid", rs.getString("COLUMN_NAME"));
@@ -699,16 +705,16 @@ public void testGetPrimaryKeys() throws SQLException {
try (ResultSet rs =
connection
.getMetaData()
- .getPrimaryKeys(getDefaultCatalog(), DEFAULT_SCHEMA, ALBUMS_TABLE)) {
+ .getPrimaryKeys(getDefaultCatalog(database), DEFAULT_SCHEMA, ALBUMS_TABLE)) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
assertEquals("albums", rs.getString("TABLE_NAME"));
assertEquals("singerid", rs.getString("COLUMN_NAME"));
assertEquals(1, rs.getInt("KEY_SEQ"));
assertEquals("PRIMARY_KEY", rs.getString("PK_NAME"));
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
assertEquals("albums", rs.getString("TABLE_NAME"));
assertEquals("albumid", rs.getString("COLUMN_NAME"));
@@ -723,13 +729,14 @@ public void testGetPrimaryKeys() throws SQLException {
@Ignore("Views are not yet supported for PostgreSQL")
@Test
public void testGetViews() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection
.getMetaData()
- .getTables(getDefaultCatalog(), DEFAULT_SCHEMA, null, new String[] {"VIEW"})) {
+ .getTables(
+ getDefaultCatalog(database), DEFAULT_SCHEMA, null, new String[] {"VIEW"})) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
assertEquals("SingersView", rs.getString("TABLE_NAME"));
assertFalse(rs.next());
@@ -739,18 +746,18 @@ public void testGetViews() throws SQLException {
@Test
public void testGetSchemas() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs = connection.getMetaData().getSchemas()) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CATALOG"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CATALOG"));
assertEquals("information_schema", rs.getString("TABLE_SCHEM"));
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CATALOG"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CATALOG"));
assertEquals("public", rs.getString("TABLE_SCHEM"));
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CATALOG"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CATALOG"));
assertEquals("spanner_sys", rs.getString("TABLE_SCHEM"));
assertFalse(rs.next());
@@ -785,12 +792,14 @@ private Table(String name, String type) {
@Test
public void testGetTables() throws SQLException {
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
- connection.getMetaData().getTables(getDefaultCatalog(), DEFAULT_SCHEMA, null, null)) {
+ connection
+ .getMetaData()
+ .getTables(getDefaultCatalog(database), DEFAULT_SCHEMA, null, null)) {
for (Table table : EXPECTED_TABLES) {
assertTrue(rs.next());
- assertEquals(getDefaultCatalog(), rs.getString("TABLE_CAT"));
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CAT"));
assertEquals(DEFAULT_SCHEMA, rs.getString("TABLE_SCHEM"));
assertEquals(table.name, rs.getString("TABLE_NAME"));
assertEquals(table.type, rs.getString("TABLE_TYPE"));
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgNumericTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgNumericTest.java
index 0c5159686..57b3e8982 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgNumericTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgNumericTest.java
@@ -25,8 +25,8 @@
import com.google.cloud.spanner.DatabaseAdminClient;
import com.google.cloud.spanner.DatabaseId;
import com.google.cloud.spanner.Dialect;
-import com.google.cloud.spanner.IntegrationTest;
import com.google.cloud.spanner.IntegrationTestEnv;
+import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.Value;
import com.google.cloud.spanner.connection.ConnectionOptions;
import com.google.cloud.spanner.jdbc.JdbcSqlExceptionFactory.JdbcSqlExceptionImpl;
@@ -51,7 +51,7 @@
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-@Category(IntegrationTest.class)
+@Category(ParallelIntegrationTest.class)
@RunWith(JUnit4.class)
public class ITJdbcPgNumericTest {
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPreparedStatementTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPreparedStatementTest.java
index 364ce628b..49491332f 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPreparedStatementTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPreparedStatementTest.java
@@ -27,10 +27,10 @@
import static org.junit.Assume.assumeFalse;
import com.google.cloud.ByteArray;
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.Value;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.jdbc.JsonType;
import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import com.google.common.base.Strings;
@@ -58,6 +58,8 @@
import java.util.Scanner;
import java.util.TimeZone;
import java.util.UUID;
+import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -72,6 +74,7 @@
@RunWith(Parameterized.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ITJdbcPreparedStatementTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
@Parameters(name = "Dialect = {0}")
public static List data() {
@@ -83,6 +86,16 @@ public static List data() {
@Parameter public DialectTestParameter dialect;
+ private Database database;
+
+ @Before
+ public void setup() {
+ assumeFalse(
+ "Emulator does not support PostgreSQL",
+ dialect.dialect == Dialect.POSTGRESQL && EmulatorSpannerHelper.isUsingEmulator());
+ database = env.getOrCreateDatabase(getDialect(), getMusicTablesDdl(getDialect()));
+ }
+
@Override
public Dialect getDialect() {
return dialect.dialect;
@@ -327,14 +340,9 @@ private int getConcertExpectedParamCount(Dialect dialect) {
return 6;
}
- @Override
- protected boolean doCreateMusicTables() {
- return true;
- }
-
@Test
public void test01_InsertTestData() throws SQLException {
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
connection.setAutoCommit(false);
try (PreparedStatement ps =
connection.prepareStatement(
@@ -402,7 +410,7 @@ public void test01_InsertTestData() throws SQLException {
@Test
public void test02_VerifyTestData() throws SQLException {
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs =
connection.createStatement().executeQuery("SELECT COUNT(*) FROM Singers")) {
assertTrue(rs.next());
@@ -502,7 +510,7 @@ public void test03_Dates() throws SQLException {
calendars.add(Calendar.getInstance(TimeZone.getTimeZone("CET")));
calendars.add(Calendar.getInstance(TimeZone.getTimeZone("PST")));
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
for (Calendar testCalendar : calendars) {
int index = 0;
for (Date testDate : testDates) {
@@ -599,7 +607,7 @@ public void test04_Timestamps() throws SQLException {
calendars.add(Calendar.getInstance(TimeZone.getTimeZone("CET")));
calendars.add(Calendar.getInstance(TimeZone.getTimeZone("PST")));
- try (Connection connection = createConnection()) {
+ try (Connection connection = createConnection(env, database)) {
for (Calendar testCalendar : calendars) {
for (Timestamp testTimestamp : testTimestamps) {
try (PreparedStatement ps =
@@ -664,8 +672,8 @@ public void test04_Timestamps() throws SQLException {
@Test
public void test05_BatchUpdates() throws SQLException {
for (boolean autocommit : new boolean[] {true, false}) {
- try (Connection con1 = createConnection(getDialect());
- Connection con2 = createConnection(getDialect())) {
+ try (Connection con1 = createConnection(env, database);
+ Connection con2 = createConnection(env, database)) {
con1.setAutoCommit(autocommit);
int[] updateCounts;
String[] params = new String[] {"A%", "B%", "C%"};
@@ -723,8 +731,8 @@ public void test05_BatchUpdates() throws SQLException {
@Test
public void test06_BatchUpdatesWithException() throws SQLException {
for (boolean autocommit : new boolean[] {true, false}) {
- try (Connection con1 = createConnection(getDialect());
- Connection con2 = createConnection(getDialect())) {
+ try (Connection con1 = createConnection(env, database);
+ Connection con2 = createConnection(env, database)) {
con1.setAutoCommit(autocommit);
String[] params = new String[] {"A%", "B%", "C%", "D%"};
// Statement number three will fail because the value is too long for the column.
@@ -756,7 +764,7 @@ public void test06_BatchUpdatesWithException() throws SQLException {
@Test
public void test07_StatementBatchUpdateWithException() throws SQLException {
- try (Connection con = createConnection(getDialect())) {
+ try (Connection con = createConnection(env, database)) {
// The following statements will fail because the value is too long.
try (Statement statement = con.createStatement()) {
statement.addBatch(
@@ -806,21 +814,12 @@ public void test08_InsertAllColumnTypes() throws SQLException {
assumeFalse(
"TableWithAllColumnTypes type is not supported on POSTGRESQL dialect",
dialect.dialect == Dialect.POSTGRESQL);
- String sql;
- if (EmulatorSpannerHelper.isUsingEmulator()) {
- sql =
- "INSERT INTO TableWithAllColumnTypes ("
- + "ColInt64, ColFloat64, ColBool, ColString, ColStringMax, ColBytes, ColBytesMax, ColDate, ColTimestamp, ColCommitTS, ColNumeric, "
- + "ColInt64Array, ColFloat64Array, ColBoolArray, ColStringArray, ColStringMaxArray, ColBytesArray, ColBytesMaxArray, ColDateArray, ColTimestampArray, ColNumericArray"
- + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, PENDING_COMMIT_TIMESTAMP(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
- } else {
- sql =
- "INSERT INTO TableWithAllColumnTypes ("
- + "ColInt64, ColFloat64, ColBool, ColString, ColStringMax, ColBytes, ColBytesMax, ColDate, ColTimestamp, ColCommitTS, ColNumeric, ColJson, "
- + "ColInt64Array, ColFloat64Array, ColBoolArray, ColStringArray, ColStringMaxArray, ColBytesArray, ColBytesMaxArray, ColDateArray, ColTimestampArray, ColNumericArray, ColJsonArray"
- + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, PENDING_COMMIT_TIMESTAMP(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
- }
- try (Connection con = createConnection()) {
+ String sql =
+ "INSERT INTO TableWithAllColumnTypes ("
+ + "ColInt64, ColFloat64, ColBool, ColString, ColStringMax, ColBytes, ColBytesMax, ColDate, ColTimestamp, ColCommitTS, ColNumeric, ColJson, "
+ + "ColInt64Array, ColFloat64Array, ColBoolArray, ColStringArray, ColStringMaxArray, ColBytesArray, ColBytesMaxArray, ColDateArray, ColTimestampArray, ColNumericArray, ColJsonArray"
+ + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, PENDING_COMMIT_TIMESTAMP(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ try (Connection con = createConnection(env, database)) {
try (PreparedStatement ps = con.prepareStatement(sql)) {
int index = 0;
ps.setLong(++index, 1L);
@@ -833,9 +832,8 @@ public void test08_InsertAllColumnTypes() throws SQLException {
ps.setDate(++index, new Date(System.currentTimeMillis()));
ps.setTimestamp(++index, new Timestamp(System.currentTimeMillis()));
ps.setBigDecimal(++index, BigDecimal.TEN);
- if (!EmulatorSpannerHelper.isUsingEmulator()) {
- ps.setObject(++index, "{\"test_value\": \"foo\"}", JsonType.INSTANCE);
- }
+ ps.setObject(++index, "{\"test_value\": \"foo\"}", JsonType.INSTANCE);
+
ps.setArray(++index, con.createArrayOf("INT64", new Long[] {1L, 2L, 3L}));
ps.setArray(++index, con.createArrayOf("FLOAT64", new Double[] {1.1D, 2.2D, 3.3D}));
ps.setArray(
@@ -864,12 +862,10 @@ public void test08_InsertAllColumnTypes() throws SQLException {
ps.setArray(
++index,
con.createArrayOf("NUMERIC", new BigDecimal[] {BigDecimal.ONE, null, BigDecimal.TEN}));
- if (!EmulatorSpannerHelper.isUsingEmulator()) {
- ps.setArray(
- ++index,
- con.createArrayOf(
- "JSON", new String[] {"{\"test_value\": \"foo\"}", "{}", "[]", null}));
- }
+ ps.setArray(
+ ++index,
+ con.createArrayOf(
+ "JSON", new String[] {"{\"test_value\": \"foo\"}", "{}", "[]", null}));
assertEquals(1, ps.executeUpdate());
}
try (ResultSet rs =
@@ -887,9 +883,8 @@ public void test08_InsertAllColumnTypes() throws SQLException {
assertNotNull(rs.getTimestamp(++index));
assertNotNull(rs.getTime(++index)); // Commit timestamp
assertEquals(BigDecimal.TEN, rs.getBigDecimal(++index));
- if (!EmulatorSpannerHelper.isUsingEmulator()) {
- assertEquals("{\"test_value\":\"foo\"}", rs.getString(++index));
- }
+ assertEquals("{\"test_value\":\"foo\"}", rs.getString(++index));
+
assertArrayEquals(new Long[] {1L, 2L, 3L}, (Long[]) rs.getArray(++index).getArray());
assertArrayEquals(
new Double[] {1.1D, 2.2D, 3.3D}, (Double[]) rs.getArray(++index).getArray());
@@ -908,11 +903,9 @@ public void test08_InsertAllColumnTypes() throws SQLException {
assertArrayEquals(
new BigDecimal[] {BigDecimal.ONE, null, BigDecimal.TEN},
(BigDecimal[]) rs.getArray(++index).getArray());
- if (!EmulatorSpannerHelper.isUsingEmulator()) {
- assertArrayEquals(
- new String[] {"{\"test_value\":\"foo\"}", "{}", "[]", null},
- (String[]) rs.getArray(++index).getArray());
- }
+ assertArrayEquals(
+ new String[] {"{\"test_value\":\"foo\"}", "{}", "[]", null},
+ (String[]) rs.getArray(++index).getArray());
assertFalse(rs.next());
}
}
@@ -924,7 +917,7 @@ public void test09_MetaData_FromQuery() throws SQLException {
"TableWithAllColumnTypes type is not supported on POSTGRESQL dialect",
dialect.dialect == Dialect.POSTGRESQL);
assumeFalse("The emulator does not support PLAN mode", isUsingEmulator());
- try (Connection con = createConnection()) {
+ try (Connection con = createConnection(env, database)) {
try (PreparedStatement ps =
con.prepareStatement("SELECT * FROM TableWithAllColumnTypes WHERE ColInt64=?")) {
ResultSetMetaData metadata = ps.getMetaData();
@@ -963,7 +956,7 @@ public void test10_MetaData_FromDML() throws SQLException {
assumeFalse(
"TableWithAllColumnTypes type is not supported on POSTGRESQL dialect",
dialect.dialect == Dialect.POSTGRESQL);
- try (Connection con = createConnection()) {
+ try (Connection con = createConnection(env, database)) {
try (PreparedStatement ps =
con.prepareStatement(
"UPDATE TableWithAllColumnTypes SET ColBool=FALSE WHERE ColInt64=?")) {
@@ -978,21 +971,12 @@ public void test11_InsertDataUsingSpannerValue() throws SQLException {
assumeFalse(
"TableWithAllColumnTypes type is not supported on POSTGRESQL dialect",
dialect.dialect == Dialect.POSTGRESQL);
- String sql;
- if (EmulatorSpannerHelper.isUsingEmulator()) {
- sql =
- "INSERT INTO TableWithAllColumnTypes ("
- + "ColInt64, ColFloat64, ColBool, ColString, ColStringMax, ColBytes, ColBytesMax, ColDate, ColTimestamp, ColCommitTS, ColNumeric, "
- + "ColInt64Array, ColFloat64Array, ColBoolArray, ColStringArray, ColStringMaxArray, ColBytesArray, ColBytesMaxArray, ColDateArray, ColTimestampArray, ColNumericArray"
- + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, PENDING_COMMIT_TIMESTAMP(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
- } else {
- sql =
- "INSERT INTO TableWithAllColumnTypes ("
- + "ColInt64, ColFloat64, ColBool, ColString, ColStringMax, ColBytes, ColBytesMax, ColDate, ColTimestamp, ColCommitTS, ColNumeric, ColJson, "
- + "ColInt64Array, ColFloat64Array, ColBoolArray, ColStringArray, ColStringMaxArray, ColBytesArray, ColBytesMaxArray, ColDateArray, ColTimestampArray, ColNumericArray, ColJsonArray"
- + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, PENDING_COMMIT_TIMESTAMP(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
- }
- try (Connection con = createConnection()) {
+ String sql =
+ "INSERT INTO TableWithAllColumnTypes ("
+ + "ColInt64, ColFloat64, ColBool, ColString, ColStringMax, ColBytes, ColBytesMax, ColDate, ColTimestamp, ColCommitTS, ColNumeric, ColJson, "
+ + "ColInt64Array, ColFloat64Array, ColBoolArray, ColStringArray, ColStringMaxArray, ColBytesArray, ColBytesMaxArray, ColDateArray, ColTimestampArray, ColNumericArray, ColJsonArray"
+ + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, PENDING_COMMIT_TIMESTAMP(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ try (Connection con = createConnection(env, database)) {
try (PreparedStatement ps = con.prepareStatement(sql)) {
int index = 1;
ps.setObject(index++, Value.int64(2L));
@@ -1006,9 +990,8 @@ public void test11_InsertDataUsingSpannerValue() throws SQLException {
ps.setObject(
index++, Value.timestamp(com.google.cloud.Timestamp.ofTimeSecondsAndNanos(99999L, 99)));
ps.setObject(index++, Value.numeric(BigDecimal.TEN));
- if (!EmulatorSpannerHelper.isUsingEmulator()) {
- ps.setObject(index++, Value.json("{\"test_value\": \"foo\"}"));
- }
+ ps.setObject(index++, Value.json("{\"test_value\": \"foo\"}"));
+
ps.setObject(index++, Value.int64Array(new long[] {1L, 2L, 3L}));
ps.setObject(index++, Value.float64Array(new double[] {1.1D, 2.2D, 3.3D}));
ps.setObject(index++, Value.boolArray(Arrays.asList(Boolean.TRUE, null, Boolean.FALSE)));
@@ -1036,11 +1019,9 @@ public void test11_InsertDataUsingSpannerValue() throws SQLException {
Arrays.asList(com.google.cloud.Timestamp.ofTimeSecondsAndNanos(99999L, 99), null)));
ps.setObject(
index++, Value.numericArray(Arrays.asList(BigDecimal.ONE, null, BigDecimal.TEN)));
- if (!EmulatorSpannerHelper.isUsingEmulator()) {
- ps.setObject(
- index++,
- Value.jsonArray(Arrays.asList("{\"key1\": \"val1\"}", null, "{\"key2\": \"val2\"}")));
- }
+ ps.setObject(
+ index++,
+ Value.jsonArray(Arrays.asList("{\"key1\": \"val1\"}", null, "{\"key2\": \"val2\"}")));
assertEquals(1, ps.executeUpdate());
}
try (ResultSet rs =
@@ -1066,9 +1047,8 @@ public void test11_InsertDataUsingSpannerValue() throws SQLException {
rs.getObject(index++, Value.class));
assertNotNull(rs.getObject(index++, Value.class)); // Commit timestamp
assertEquals(Value.numeric(BigDecimal.TEN), rs.getObject(index++, Value.class));
- if (!EmulatorSpannerHelper.isUsingEmulator()) {
- assertEquals(Value.json("{\"test_value\":\"foo\"}"), rs.getObject(index++, Value.class));
- }
+ assertEquals(Value.json("{\"test_value\":\"foo\"}"), rs.getObject(index++, Value.class));
+
assertEquals(Value.int64Array(new long[] {1L, 2L, 3L}), rs.getObject(index++, Value.class));
assertEquals(
Value.float64Array(new double[] {1.1D, 2.2D, 3.3D}),
@@ -1102,11 +1082,9 @@ public void test11_InsertDataUsingSpannerValue() throws SQLException {
assertEquals(
Value.numericArray(Arrays.asList(BigDecimal.ONE, null, BigDecimal.TEN)),
rs.getObject(index++, Value.class));
- if (!EmulatorSpannerHelper.isUsingEmulator()) {
- assertEquals(
- Value.jsonArray(Arrays.asList("{\"key1\":\"val1\"}", null, "{\"key2\":\"val2\"}")),
- rs.getObject(index++, Value.class));
- }
+ assertEquals(
+ Value.jsonArray(Arrays.asList("{\"key1\":\"val1\"}", null, "{\"key2\":\"val2\"}")),
+ rs.getObject(index++, Value.class));
assertFalse(rs.next());
}
}
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcQueryOptionsTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcQueryOptionsTest.java
index b637a299b..4cdd0e9c8 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcQueryOptionsTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcQueryOptionsTest.java
@@ -23,11 +23,11 @@
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeFalse;
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.SpannerOptions;
import com.google.cloud.spanner.connection.SpannerPool;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.jdbc.JdbcSqlException;
import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import com.google.rpc.Code;
@@ -36,10 +36,12 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import javax.annotation.Nonnull;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -62,6 +64,8 @@
@Category(ParallelIntegrationTest.class)
@RunWith(Parameterized.class)
public class ITJdbcQueryOptionsTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
private String connectionUriSuffix;
@Before
@@ -91,6 +95,16 @@ public static List data() {
@Parameter public DialectTestParameter dialect;
+ private Database database;
+
+ @Before
+ public void setup() {
+ assumeFalse(
+ "Emulator does not support PostgreSQL",
+ dialect.dialect == Dialect.POSTGRESQL && EmulatorSpannerHelper.isUsingEmulator());
+ database = env.getOrCreateDatabase(getDialect(), Collections.emptyList());
+ }
+
@Override
public Dialect getDialect() {
return dialect.dialect;
@@ -109,7 +123,7 @@ private void verifyOptimizerVersion(Connection connection, String expectedVersio
@Test
public void connectionUrl() throws SQLException {
this.connectionUriSuffix = ";optimizerVersion=1";
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
verifyOptimizerVersion(connection, "1");
try (ResultSet rs = connection.createStatement().executeQuery("SELECT 1")) {
assertThat(rs.next()).isTrue();
@@ -124,7 +138,7 @@ public void connectionUrlWithInvalidOptimizerVersion() throws SQLException {
assumeFalse(
"optimizer version is ignored on emulator", EmulatorSpannerHelper.isUsingEmulator());
this.connectionUriSuffix = ";optimizerVersion=9999999";
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs = connection.createStatement().executeQuery("SELECT 1")) {
fail("missing expected exception");
} catch (SQLException e) {
@@ -137,7 +151,7 @@ public void connectionUrlWithInvalidOptimizerVersion() throws SQLException {
@Test
public void setOptimizerVersion() throws SQLException {
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
verifyOptimizerVersion(connection, "");
connection.createStatement().execute("SET OPTIMIZER_VERSION='1'");
verifyOptimizerVersion(connection, "1");
@@ -151,7 +165,7 @@ public void setOptimizerVersion() throws SQLException {
@Test
public void setLatestOptimizerVersion() throws SQLException {
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
verifyOptimizerVersion(connection, "");
connection.createStatement().execute("SET OPTIMIZER_VERSION='LATEST'");
verifyOptimizerVersion(connection, "LATEST");
@@ -167,7 +181,7 @@ public void setLatestOptimizerVersion() throws SQLException {
public void setInvalidOptimizerVersion() throws SQLException {
assumeFalse(
"optimizer version is ignored on emulator", EmulatorSpannerHelper.isUsingEmulator());
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
connection.createStatement().execute("SET OPTIMIZER_VERSION='9999999'");
try (ResultSet rs = connection.createStatement().executeQuery("SELECT 1")) {
fail("missing expected exception");
@@ -187,7 +201,7 @@ public void optimizerVersionInQueryHint() throws SQLException {
assumeFalse(
"optimizer version in query hint is not supported on POSTGRESQL",
getDialect() == Dialect.POSTGRESQL);
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
verifyOptimizerVersion(connection, "");
try (ResultSet rs =
connection.createStatement().executeQuery("@{optimizer_version=1} SELECT 1")) {
@@ -223,7 +237,7 @@ public String getOptimizerStatisticsPackage() {
return "latest";
}
});
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
// Environment query options are not visible to the connection.
verifyOptimizerVersion(connection, "");
try (ResultSet rs = connection.createStatement().executeQuery("SELECT 1")) {
@@ -250,7 +264,7 @@ public String getOptimizerStatisticsPackage() {
return "latest";
}
});
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
SQLException e =
assertThrows(
SQLException.class, () -> connection.createStatement().executeQuery("SELECT 1"));
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcReadOnlyTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcReadOnlyTest.java
index 2c1aadd77..7e13532c9 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcReadOnlyTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcReadOnlyTest.java
@@ -17,20 +17,23 @@
package com.google.cloud.spanner.jdbc.it;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.Mutation;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.connection.ConnectionOptions;
import com.google.cloud.spanner.jdbc.CloudSpannerJdbcConnection;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import com.google.common.collect.ImmutableMap;
import java.math.BigInteger;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@@ -38,6 +41,7 @@
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -51,6 +55,8 @@
public class ITJdbcReadOnlyTest extends ITAbstractJdbcTest {
private static final long TEST_ROWS_COUNT = 1000L;
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
@Parameters(name = "Dialect = {0}")
public static List data() {
List params = new ArrayList<>();
@@ -75,6 +81,16 @@ public static List data() {
@Parameter public DialectTestParameter dialect;
+ private Database database;
+
+ @Before
+ public void setup() {
+ assumeFalse(
+ "Emulator does not support PostgreSQL",
+ dialect.dialect == Dialect.POSTGRESQL && EmulatorSpannerHelper.isUsingEmulator());
+ database = env.getOrCreateDatabase(getDialect(), Collections.emptyList());
+ }
+
@Override
public Dialect getDialect() {
return dialect.dialect;
@@ -87,11 +103,13 @@ protected void appendConnectionUri(StringBuilder url) {
@Before
public void createTestTables() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(getDialect())) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
if (!(tableExists(connection, "NUMBERS") && tableExists(connection, "PRIME_NUMBERS"))) {
// create tables
- JdbcSqlScriptVerifier verifier = new JdbcSqlScriptVerifier(new ITJdbcConnectionProvider());
- verifier.verifyStatementsInFile(dialect.createTableFile, ITAbstractJdbcTest.class, false);
+ JdbcSqlScriptVerifier verifier =
+ new JdbcSqlScriptVerifier(new ITJdbcConnectionProvider(env, database));
+ verifier.verifyStatementsInFile(
+ dialect.createTableFile, JdbcSqlScriptVerifier.class, false);
// fill tables with data
connection.setAutoCommit(false);
@@ -130,14 +148,15 @@ public void closeSpanner() {
public void testSqlScript() throws Exception {
// Wait 100ms to ensure that staleness tests in the script succeed.
Thread.sleep(100L);
- JdbcSqlScriptVerifier verifier = new JdbcSqlScriptVerifier(new ITJdbcConnectionProvider());
+ JdbcSqlScriptVerifier verifier =
+ new JdbcSqlScriptVerifier(new ITJdbcConnectionProvider(env, database));
verifier.verifyStatementsInFile(
- dialect.executeQueriesFiles.get("TEST_READ_ONLY"), ITAbstractJdbcTest.class, false);
+ dialect.executeQueriesFiles.get("TEST_READ_ONLY"), JdbcSqlScriptVerifier.class, false);
}
@Test
public void testMultipleOpenResultSets() throws InterruptedException, SQLException {
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
List resultSets = new ArrayList();
ExecutorService exec = Executors.newFixedThreadPool(2);
for (String query : dialect.queries) {
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcReadWriteAutocommitTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcReadWriteAutocommitTest.java
index 29a652019..5f81ce23e 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcReadWriteAutocommitTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcReadWriteAutocommitTest.java
@@ -19,17 +19,21 @@
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assume.assumeFalse;
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.Mutation;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.jdbc.CloudSpannerJdbcConnection;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import com.google.common.collect.ImmutableMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -43,6 +47,7 @@
@RunWith(Parameterized.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ITJdbcReadWriteAutocommitTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
@Parameters(name = "Dialect = {0}")
public static List data() {
@@ -60,6 +65,16 @@ public static List data() {
@Parameter public DialectTestParameter dialect;
+ private Database database;
+
+ @Before
+ public void setup() {
+ assumeFalse(
+ "Emulator does not support PostgreSQL",
+ dialect.dialect == Dialect.POSTGRESQL && EmulatorSpannerHelper.isUsingEmulator());
+ database = env.getOrCreateDatabase(getDialect(), getTestTableDdl(getDialect()));
+ }
+
@Override
public Dialect getDialect() {
return dialect.dialect;
@@ -70,23 +85,19 @@ protected void appendConnectionUri(StringBuilder uri) {
uri.append(";autocommit=true");
}
- @Override
- public boolean doCreateDefaultTestTable() {
- return true;
- }
-
@Test
public void test01_SqlScript() throws Exception {
- JdbcSqlScriptVerifier verifier = new JdbcSqlScriptVerifier(new ITJdbcConnectionProvider());
+ JdbcSqlScriptVerifier verifier =
+ new JdbcSqlScriptVerifier(new ITJdbcConnectionProvider(env, database));
verifier.verifyStatementsInFile(
dialect.executeQueriesFiles.get("TEST_READ_WRITE_AUTO_COMMIT"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
@Test
public void test02_WriteMutation() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(getDialect())) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
connection.write(
Mutation.newInsertBuilder("TEST").set("ID").to(9999L).set("NAME").to("FOO").build());
java.sql.Statement statement = connection.createStatement();
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcScriptTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcScriptTest.java
index b6c29a3fd..a6e44358e 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcScriptTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcScriptTest.java
@@ -22,21 +22,25 @@
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assume.assumeFalse;
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.ErrorCode;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.SpannerException;
import com.google.cloud.spanner.jdbc.CloudSpannerJdbcConnection;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier;
import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier.JdbcGenericConnection;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
+import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -54,6 +58,8 @@
@RunWith(Parameterized.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ITJdbcScriptTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
private static final String CREATE_TABLES_FILE_SQL = "ITSqlScriptTest_CreateTables.sql";
private static final String INSERT_AND_VERIFY_TEST_DATA_SQL =
"ITSqlScriptTest_InsertTestData.sql";
@@ -153,14 +159,24 @@ public static List data() {
@Parameterized.Parameter(0)
public DialectTestParameter dialect;
+ private Database database;
+
+ @Before
+ public void setup() {
+ assumeFalse(
+ "Emulator does not support PostgreSQL",
+ dialect.dialect == Dialect.POSTGRESQL && EmulatorSpannerHelper.isUsingEmulator());
+ database = env.getOrCreateDatabase(getDialect(), Collections.emptyList());
+ }
+
/** Create test tables and verify their existence */
@Test
public void test01_CreateTables() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.createTableFile,
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@@ -168,11 +184,11 @@ public void test01_CreateTables() throws Exception {
/** Insert some test data */
@Test
public void test02_InsertTestData() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("INSERT_AND_VERIFY_TEST_DATA"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
} catch (SQLException e) {
if (env.getTestHelper().isEmulator()
@@ -190,11 +206,11 @@ public void test02_InsertTestData() throws Exception {
@Test
public void test03_TestGetReadTimestamp() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_GET_READ_TIMESTAMP"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@@ -203,11 +219,11 @@ public void test03_TestGetReadTimestamp() throws Exception {
public void test04_TestGetCommitTimestamp() throws Exception {
// Skipping test as Commit Timestamp not supported in POSTGRES
assumeFalse(dialect.dialect == Dialect.POSTGRESQL);
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_GET_COMMIT_TIMESTAMP"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
} catch (SQLException e) {
if (env.getTestHelper().isEmulator()
@@ -224,66 +240,66 @@ public void test04_TestGetCommitTimestamp() throws Exception {
@Test
public void test05_TestTemporaryTransactions() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_TEMPORARY_TRANSACTIONS"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@Test
public void test06_TestTransactionMode() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_TRANSACTION_MODE"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@Test
public void test07_TestTransactionModeReadOnly() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_TRANSACTION_MODE_READ_ONLY"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@Test
public void test08_TestReadOnlyStaleness() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_READ_ONLY_STALENESS"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@Test
public void test09_TestAutocommitDmlMode() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_AUTOCOMMIT_DML_MODE"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@Test
public void test10_TestAutocommitReadOnly() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_AUTOCOMMIT_READ_ONLY"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@@ -292,14 +308,17 @@ public void test10_TestAutocommitReadOnly() throws Exception {
public void test11_TestStatementTimeout() throws Exception {
// Statements with set operations in subqueries are not supported
assumeFalse(dialect.dialect == Dialect.POSTGRESQL);
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ assumeFalse(
+ "The emulator is too quick for timeouts to be reliable",
+ EmulatorSpannerHelper.isUsingEmulator());
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_STATEMENT_TIMEOUT"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
- try (Connection connection = createConnection(dialect.dialect)) {
+ try (Connection connection = createConnection(env, database)) {
// Create a statement with a query timeout, but do not set a statement timeout on the
// connection. SHOW STATEMENT_TIMEOUT should then return a null value.
Statement statement = connection.createStatement();
@@ -333,33 +352,33 @@ public void test11_TestStatementTimeout() throws Exception {
@Test
public void test12_TestSetStatements() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_SET_STATEMENTS"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@Test
public void test13_TestInvalidStatements() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_INVALID_STATEMENTS"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
@Test
public void test14_TestQueryOptions() throws Exception {
- try (CloudSpannerJdbcConnection connection = createConnection(dialect.dialect)) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_QUERY_OPTIONS"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcSimpleStatementsTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcSimpleStatementsTest.java
index 0da6da151..b7fbc6956 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcSimpleStatementsTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcSimpleStatementsTest.java
@@ -24,11 +24,12 @@
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeFalse;
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.Struct;
import com.google.cloud.spanner.Value;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import java.sql.Array;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -37,7 +38,10 @@
import java.sql.SQLFeatureNotSupportedException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@@ -49,6 +53,8 @@
@RunWith(Parameterized.class)
@Category(ParallelIntegrationTest.class)
public class ITJdbcSimpleStatementsTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
@Parameters(name = "Dialect = {0}")
public static List data() {
List params = new ArrayList<>();
@@ -59,6 +65,16 @@ public static List data() {
@Parameter public DialectTestParameter dialect;
+ private Database database;
+
+ @Before
+ public void setup() {
+ assumeFalse(
+ "Emulator does not support PostgreSQL",
+ dialect.dialect == Dialect.POSTGRESQL && EmulatorSpannerHelper.isUsingEmulator());
+ database = env.getOrCreateDatabase(getDialect(), Collections.emptyList());
+ }
+
@Override
public Dialect getDialect() {
return dialect.dialect;
@@ -66,7 +82,7 @@ public Dialect getDialect() {
@Test
public void testSelect1() throws SQLException {
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet rs = connection.createStatement().executeQuery("select 1")) {
assertThat(rs.next()).isTrue();
assertThat(rs.getInt(1)).isEqualTo(1);
@@ -77,7 +93,7 @@ public void testSelect1() throws SQLException {
@Test
public void testSelect1PreparedStatement() throws SQLException {
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
try (PreparedStatement ps = connection.prepareStatement("select 1")) {
try (ResultSet rs = ps.executeQuery()) {
assertThat(rs.next()).isTrue();
@@ -98,7 +114,7 @@ public void testPreparedStatement() throws SQLException {
dialect.dialect == Dialect.POSTGRESQL);
String sql =
"select * from (select 1 as number union all select 2 union all select 3) numbers where number=?";
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
try (PreparedStatement ps = connection.prepareStatement(sql)) {
for (int i = 1; i <= 3; i++) {
ps.setInt(1, i);
@@ -129,7 +145,7 @@ public void testBatchedDdlStatements() throws SQLException {
countTable = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'foo%'";
}
// Execute a successful batch of DDL statements.
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
try (Statement statement = connection.createStatement()) {
statement.addBatch(createTableFoo1);
statement.addBatch(createTableFoo2);
@@ -144,7 +160,7 @@ public void testBatchedDdlStatements() throws SQLException {
}
}
// Execute a batch of DDL statements that contains a statement that will fail.
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
// First create a couple of test records that will cause the index creation to fail.
try (Statement statement = connection.createStatement()) {
statement.executeUpdate("INSERT INTO FOO1 (ID, NAME) VALUES (1,'TEST')");
@@ -177,7 +193,7 @@ public void testBatchedDdlStatements() throws SQLException {
@Test
public void testAddBatchWhenAlreadyInBatch() {
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
connection.createStatement().execute("START BATCH DML");
connection.createStatement().addBatch("INSERT INTO Singers (SingerId) VALUES (-1)");
fail("missing expected exception");
@@ -207,7 +223,7 @@ public void testSelectArrayOfStructs() throws SQLException {
+ " SELECT STRUCT(point)\n"
+ " FROM points)\n"
+ " AS coordinates";
- try (Connection connection = createConnection(getDialect())) {
+ try (Connection connection = createConnection(env, database)) {
try (ResultSet resultSet = connection.createStatement().executeQuery(sql)) {
assertTrue(resultSet.next());
assertEquals(resultSet.getMetaData().getColumnCount(), 1);
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcSqlMusicScriptTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcSqlMusicScriptTest.java
index 4ae00347b..7c8c7aeb5 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcSqlMusicScriptTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcSqlMusicScriptTest.java
@@ -16,26 +16,34 @@
package com.google.cloud.spanner.jdbc.it;
+import static org.junit.Assume.assumeFalse;
+
+import com.google.cloud.spanner.Database;
import com.google.cloud.spanner.Dialect;
import com.google.cloud.spanner.ParallelIntegrationTest;
import com.google.cloud.spanner.jdbc.CloudSpannerJdbcConnection;
-import com.google.cloud.spanner.jdbc.ITAbstractJdbcTest;
import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier;
import com.google.cloud.spanner.jdbc.JdbcSqlScriptVerifier.JdbcGenericConnection;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
import com.google.common.collect.ImmutableMap;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
+import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
+import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
@Category(ParallelIntegrationTest.class)
-@RunWith(JUnit4.class)
+@RunWith(Parameterized.class)
public class ITJdbcSqlMusicScriptTest extends ITAbstractJdbcTest {
+ @ClassRule public static JdbcIntegrationTestEnv env = new JdbcIntegrationTestEnv();
+
@Parameters(name = "Dialect = {0}")
public static List data() {
List params = new ArrayList<>();
@@ -51,6 +59,16 @@ public static List data() {
@Parameter public DialectTestParameter dialect;
+ private Database database;
+
+ @Before
+ public void setup() {
+ assumeFalse(
+ "Emulator does not support PostgreSQL",
+ dialect.dialect == Dialect.POSTGRESQL && EmulatorSpannerHelper.isUsingEmulator());
+ database = env.getOrCreateDatabase(getDialect(), Collections.emptyList());
+ }
+
@Override
public Dialect getDialect() {
return dialect.dialect;
@@ -59,11 +77,11 @@ public Dialect getDialect() {
@Test
public void testRunScript() throws Exception {
JdbcSqlScriptVerifier verifier = new JdbcSqlScriptVerifier();
- try (CloudSpannerJdbcConnection connection = createConnection(getDialect())) {
+ try (CloudSpannerJdbcConnection connection = createConnection(env, database)) {
verifier.verifyStatementsInFile(
JdbcGenericConnection.of(connection),
dialect.executeQueriesFiles.get("TEST_SQL_MUSIC_SCRIPT"),
- ITAbstractJdbcTest.class,
+ JdbcSqlScriptVerifier.class,
false);
}
}
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/JdbcIntegrationTestEnv.java b/src/test/java/com/google/cloud/spanner/jdbc/it/JdbcIntegrationTestEnv.java
new file mode 100644
index 000000000..475716b1c
--- /dev/null
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/JdbcIntegrationTestEnv.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2022 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.cloud.spanner.jdbc.it;
+
+import com.google.cloud.spanner.Database;
+import com.google.cloud.spanner.Dialect;
+import com.google.cloud.spanner.IntegrationTestEnv;
+import com.google.cloud.spanner.SpannerException;
+import com.google.cloud.spanner.connection.ConnectionOptions;
+import com.google.cloud.spanner.testing.EmulatorSpannerHelper;
+import java.util.HashMap;
+import java.util.Map;
+
+public class JdbcIntegrationTestEnv extends IntegrationTestEnv {
+ /**
+ * The test database(s) that have been created for this test run. The cleanup of these databases
+ * is handled by {@link com.google.cloud.spanner.testing.RemoteSpannerHelper}.
+ */
+ private final Map databases = new HashMap<>();
+
+ Database getOrCreateDatabase(Dialect dialect, Iterable ddlStatements) {
+ if (databases.containsKey(dialect)) {
+ return databases.get(dialect);
+ }
+ Database database = getTestHelper().createTestDatabase(dialect, ddlStatements);
+ databases.put(dialect, database);
+
+ return database;
+ }
+
+ @Override
+ protected void initializeConfig()
+ throws ClassNotFoundException, InstantiationException, IllegalAccessException {
+ if (EmulatorSpannerHelper.isUsingEmulator()) {
+ // Make sure that we use an owned instance on the emulator.
+ System.setProperty(TEST_INSTANCE_PROPERTY, "");
+ }
+ super.initializeConfig();
+ }
+
+ @Override
+ protected void after() {
+ super.after();
+ try {
+ ConnectionOptions.closeSpanner();
+ } catch (SpannerException e) {
+ // ignore
+ }
+ }
+}
diff --git a/src/test/resources/com/google/cloud/spanner/jdbc/ITSqlScriptTest_TestStatementTimeout.sql b/src/test/resources/com/google/cloud/spanner/jdbc/ITSqlScriptTest_TestStatementTimeout.sql
index 9a9894faf..fc76bcbd0 100644
--- a/src/test/resources/com/google/cloud/spanner/jdbc/ITSqlScriptTest_TestStatementTimeout.sql
+++ b/src/test/resources/com/google/cloud/spanner/jdbc/ITSqlScriptTest_TestStatementTimeout.sql
@@ -70,7 +70,7 @@ SET STATEMENT_TIMEOUT='1ns';
SHOW VARIABLE STATEMENT_TIMEOUT;
-- Do a somewhat complex query that should now timeout
-@EXPECT EXCEPTION DEADLINE_EXCEEDED 'DEADLINE_EXCEEDED: Statement execution timeout occurred'
+@EXPECT EXCEPTION DEADLINE_EXCEEDED
SELECT COUNT(*) AS ACTUAL, 0 AS EXPECTED
FROM (
SELECT *
@@ -97,7 +97,7 @@ FROM (
;
-- Try to execute an update that should also timeout
-@EXPECT EXCEPTION DEADLINE_EXCEEDED 'DEADLINE_EXCEEDED: Statement execution timeout occurred'
+@EXPECT EXCEPTION DEADLINE_EXCEEDED
UPDATE Singers SET LastName='Some Other Last Name' /* It used to be 'Last 1' */
WHERE SingerId=1
OR LastName IN (
@@ -176,7 +176,7 @@ SET STATEMENT_TIMEOUT='1ns';
SHOW VARIABLE STATEMENT_TIMEOUT;
-- Do a somewhat complex query that should now timeout
-@EXPECT EXCEPTION DEADLINE_EXCEEDED 'DEADLINE_EXCEEDED: Statement execution timeout occurred'
+@EXPECT EXCEPTION DEADLINE_EXCEEDED
SELECT COUNT(*) AS ACTUAL, 0 AS EXPECTED
FROM (
SELECT *
@@ -202,11 +202,10 @@ FROM (
) RES
;
-- We need to rollback the transaction as it is no longer usable.
-@EXPECT EXCEPTION DEADLINE_EXCEEDED 'DEADLINE_EXCEEDED: Statement execution timeout occurred'
ROLLBACK;
-- Try to execute an update that should also timeout
-@EXPECT EXCEPTION DEADLINE_EXCEEDED 'DEADLINE_EXCEEDED: Statement execution timeout occurred'
+@EXPECT EXCEPTION DEADLINE_EXCEEDED
UPDATE Singers SET LastName='Some Other Last Name' /* It used to be 'Last 1' */
WHERE SingerId=1
OR LastName IN (
diff --git a/src/test/resources/com/google/cloud/spanner/jdbc/PostgreSQL/ITScriptTest_TestAutoCommitDmlMode.sql b/src/test/resources/com/google/cloud/spanner/jdbc/PostgreSQL/ITScriptTest_TestAutocommitDmlMode.sql
similarity index 100%
rename from src/test/resources/com/google/cloud/spanner/jdbc/PostgreSQL/ITScriptTest_TestAutoCommitDmlMode.sql
rename to src/test/resources/com/google/cloud/spanner/jdbc/PostgreSQL/ITScriptTest_TestAutocommitDmlMode.sql
diff --git a/src/test/resources/com/google/cloud/spanner/jdbc/it/CreateMusicTables_Emulator.sql b/src/test/resources/com/google/cloud/spanner/jdbc/it/CreateMusicTables_Emulator.sql
index d1e73bba2..aaba70c19 100644
--- a/src/test/resources/com/google/cloud/spanner/jdbc/it/CreateMusicTables_Emulator.sql
+++ b/src/test/resources/com/google/cloud/spanner/jdbc/it/CreateMusicTables_Emulator.sql
@@ -63,17 +63,18 @@ CREATE TABLE Concerts (
) PRIMARY KEY(VenueId, SingerId, ConcertDate);
CREATE TABLE TableWithAllColumnTypes (
- ColInt64 INT64 NOT NULL,
- ColFloat64 FLOAT64 NOT NULL,
- ColBool BOOL NOT NULL,
- ColString STRING(100) NOT NULL,
- ColStringMax STRING(MAX) NOT NULL,
- ColBytes BYTES(100) NOT NULL,
- ColBytesMax BYTES(MAX) NOT NULL,
- ColDate DATE NOT NULL,
- ColTimestamp TIMESTAMP NOT NULL,
- ColCommitTS TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true),
- ColNumeric NUMERIC NOT NULL,
+ ColInt64 INT64 NOT NULL,
+ ColFloat64 FLOAT64 NOT NULL,
+ ColBool BOOL NOT NULL,
+ ColString STRING(100) NOT NULL,
+ ColStringMax STRING(MAX) NOT NULL,
+ ColBytes BYTES(100) NOT NULL,
+ ColBytesMax BYTES(MAX) NOT NULL,
+ ColDate DATE NOT NULL,
+ ColTimestamp TIMESTAMP NOT NULL,
+ ColCommitTS TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true),
+ ColNumeric NUMERIC NOT NULL,
+ ColJson JSON NOT NULL,
ColInt64Array ARRAY,
ColFloat64Array ARRAY,
@@ -85,6 +86,7 @@ CREATE TABLE TableWithAllColumnTypes (
ColDateArray ARRAY,
ColTimestampArray ARRAY,
ColNumericArray ARRAY,
+ ColJsonArray ARRAY,
ColComputed STRING(MAX) AS (CONCAT(COALESCE(ColString, ''), ' ', COALESCE(ColStringMax, ''))) STORED,
) PRIMARY KEY (ColInt64)
From 1cbcf3cdb9ad6d9d9da73d331cadee16f503076e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Knut=20Olav=20L=C3=B8ite?=
Date: Mon, 25 Apr 2022 12:21:57 +0200
Subject: [PATCH 07/18] test: add pg_catalog as an expected schema (#821)
Adds `pg_catalog` as an expected schema to the JDBC metadata tests.
Fixes #810
---
.../cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java
index af258ba9e..ca13ea2c2 100644
--- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java
+++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcPgDatabaseMetaDataTest.java
@@ -752,6 +752,10 @@ public void testGetSchemas() throws SQLException {
assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CATALOG"));
assertEquals("information_schema", rs.getString("TABLE_SCHEM"));
+ assertTrue(rs.next());
+ assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CATALOG"));
+ assertEquals("pg_catalog", rs.getString("TABLE_SCHEM"));
+
assertTrue(rs.next());
assertEquals(getDefaultCatalog(database), rs.getString("TABLE_CATALOG"));
assertEquals("public", rs.getString("TABLE_SCHEM"));
From 2b5f25c6b16b94ee6eaf768327096d293f7f1ab6 Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate
Date: Wed, 27 Apr 2022 17:58:11 +0200
Subject: [PATCH 08/18] chore(deps): update dependency
com.google.cloud:libraries-bom to v25.2.0 (#835)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[](https://renovatebot.com)
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [com.google.cloud:libraries-bom](https://cloud.google.com/java/docs/bom) ([source](https://togithub.com/GoogleCloudPlatform/cloud-opensource-java)) | `25.1.0` -> `25.2.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) |
---
### Configuration
📅 **Schedule**: At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
â™» **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] If you want to rebase/retry this PR, click this checkbox.
---
This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/java-spanner-jdbc).
---
samples/snippets/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 84bbc2d80..fdd2b2329 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -30,7 +30,7 @@
com.google.cloud
libraries-bom
- 25.1.0
+ 25.2.0
pom
import
From 4a5ccab0fb6c407c15b71921f51c9611e34d2384 Mon Sep 17 00:00:00 2001
From: Rajat Bhatta <93644539+rajatbhatta@users.noreply.github.com>
Date: Fri, 29 Apr 2022 13:13:21 +0530
Subject: [PATCH 09/18] chore: reduce fork count to 4 (#864)
Reducing fork count to 4 to check if that helps reduce the flakes.
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 00bd5787b..6ce1efee3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -237,7 +237,7 @@
2400
- 8
+ 4
true
From 2f609f52f26ee8f3eee2989316057d15f4706e9a Mon Sep 17 00:00:00 2001
From: WhiteSource Renovate