diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBase.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBase.java index c796eea0f9ba..5f8285fb2a14 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBase.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBase.java @@ -49,6 +49,10 @@ public class ITBase extends BigQueryJdbcBaseTest { "DECLARE DELAY_TIME DATETIME; SET DELAY_TIME = DATETIME_ADD(CURRENT_DATETIME, INTERVAL 300" + " SECOND); WHILE CURRENT_DATETIME < DELAY_TIME DO END WHILE;"; + public static final String PCNT_SCHEMA = + System.getenv() + .getOrDefault("PCNT_SCHEMA", "bq-drivers-test-warehouse.jdbc_pcnt_test_namespace"); + private static String sharedDataset; private static String sharedDataset2; @@ -372,6 +376,27 @@ public static void setUpTable(String dataset, String table) throws InterruptedEx QueryJobConfiguration.of(String.format(insertQuery2, DEFAULT_CATALOG, dataset, table))); } + public static final String createPcntTableQuery = + "CREATE OR REPLACE TABLE `%s.%s.%s` (id INT64, name STRING);"; + public static final String insertPcntTableQuery = + "INSERT INTO `%s.%s.%s` (id, name) VALUES (1, 'Alice'), (2, 'Bob');"; + public static final String dropPcntTableQuery = "DROP TABLE IF EXISTS `%s.%s.%s`;"; + + public static void setUpPcntTable(String schema, String table) throws InterruptedException { + bigQuery.query( + QueryJobConfiguration.of( + String.format(createPcntTableQuery, DEFAULT_CATALOG, schema, table))); + bigQuery.query( + QueryJobConfiguration.of( + String.format(insertPcntTableQuery, DEFAULT_CATALOG, schema, table))); + } + + public static void cleanUpPcntTable(String schema, String table) throws InterruptedException { + bigQuery.query( + QueryJobConfiguration.of( + String.format(dropPcntTableQuery, DEFAULT_CATALOG, schema, table))); + } + public static void cleanUp(String dataset) throws InterruptedException { bigQuery.query(QueryJobConfiguration.of(String.format(dropSchema, DEFAULT_CATALOG, dataset))); } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITConnectionTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITConnectionTest.java index 525078d3ec90..c1a9a37c9184 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITConnectionTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITConnectionTest.java @@ -48,17 +48,21 @@ public class ITConnectionTest { static Random random = new Random(); static int randomNumber = random.nextInt(999); private static final String TABLE_NAME = "JDBC_CONNECTION_TEST_TABLE" + randomNumber; + private static final String PCNT_TABLE_NAME = "PCNT_CONN_TEST_TABLE_" + randomNumber; @BeforeAll public static void beforeClass() throws InterruptedException { DATASET = ITBase.getSharedDataset(); ITBase.setUpTable(DATASET, TABLE_NAME); ITBase.setUpProcedure(DATASET, TABLE_NAME); + ITBase.setUpPcntTable(ITBase.PCNT_SCHEMA, PCNT_TABLE_NAME); } @AfterAll public static void afterClass() throws InterruptedException { - // Shared dataset cleanup is handled by shutdown hook + // Shared dataset cleanup is handled by ITBase shutdown hook. + // Clean up dynamic table created in the shared PCNT namespace. + ITBase.cleanUpPcntTable(ITBase.PCNT_SCHEMA, PCNT_TABLE_NAME); } @Test @@ -436,4 +440,55 @@ public void testIsValid() throws SQLException { assertTrue(connection.isValid(0)); // 0 seconds timeout connection.close(); } + + @Test + public void testDefaultDatasetColonDelimiter() throws SQLException { + String urlWithColon = + ITBase.connectionUrl + ";DefaultDataset=" + DEFAULT_CATALOG + ":" + DATASET + ";"; + try (Connection connection = DriverManager.getConnection(urlWithColon)) { + assertNotNull(connection); + assertFalse(connection.isClosed()); + try (Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM " + TABLE_NAME)) { + assertTrue(rs.next()); + assertTrue(rs.getMetaData().getColumnCount() > 0); + } + } + } + + @Test + public void testPcntDefaultDataset2TierNamespace() throws SQLException { + String urlWithPcnt = ITBase.connectionUrl + ";DefaultDataset=" + ITBase.PCNT_SCHEMA + ";"; + try (Connection connection = DriverManager.getConnection(urlWithPcnt)) { + assertNotNull(connection); + assertFalse(connection.isClosed()); + try (Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM " + PCNT_TABLE_NAME)) { + assertTrue(rs.next()); + assertEquals(1, rs.getInt("id")); + assertEquals("Alice", rs.getString("name")); + } + } + } + + @Test + public void testPcntDefaultDataset3TierNamespace() throws SQLException { + String urlWithPcnt = + ITBase.connectionUrl + + ";DefaultDataset=" + + DEFAULT_CATALOG + + ":" + + ITBase.PCNT_SCHEMA + + ";"; + try (Connection connection = DriverManager.getConnection(urlWithPcnt)) { + assertNotNull(connection); + assertFalse(connection.isClosed()); + try (Statement stmt = connection.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT * FROM " + PCNT_TABLE_NAME)) { + assertTrue(rs.next()); + assertEquals(1, rs.getInt("id")); + assertEquals("Alice", rs.getString("name")); + } + } + } } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java index c372b033d48f..80d2e0cf4529 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java @@ -58,12 +58,11 @@ public class ITDatabaseMetadataTest extends ITBase { private static final String CONSTRAINTS_TABLE_NAME = "JDBC_CONSTRAINTS_TEST_TABLE"; private static final String CONSTRAINTS_TABLE_NAME2 = "JDBC_CONSTRAINTS_TEST_TABLE2"; private static final String CONSTRAINTS_TABLE_NAME3 = "JDBC_CONSTRAINTS_TEST_TABLE3"; - private static final String PCNT_SCHEMA = "bq-drivers-test-warehouse.jdbc_pcnt_test_namespace"; - private static final String PCNT_TABLE_NAME = "PCNT_TEST_TABLE"; private static final Pattern VERSION_PATTERN = Pattern.compile("^(\\d+)\\.(\\d+)(?:\\.\\d+)+\\s*.*"); private static final String DEFAULT_CATALOG = ServiceOptions.getDefaultProjectId(); private static final String TABLE_NAME = "JDBC_DBMETADATA_TEST_TABLE" + randomNumber; + private static final String PCNT_TABLE_NAME = "PCNT_METADATA_TEST_TABLE_" + randomNumber; @BeforeAll public static void beforeClass() throws InterruptedException, SQLException { @@ -72,10 +71,15 @@ public static void beforeClass() throws InterruptedException, SQLException { CONSTRAINTS_DATASET = ITBase.getSharedDataset(); // Set up Dataset ITBase.setUpTable(DATASET, TABLE_NAME); + ITBase.setUpPcntTable(ITBase.PCNT_SCHEMA, PCNT_TABLE_NAME); } @AfterAll - public static void afterClass() throws SQLException {} + public static void afterClass() throws SQLException, InterruptedException { + // Shared dataset cleanup is handled by ITBase shutdown hook. + // Clean up dynamic table created in the shared PCNT namespace. + ITBase.cleanUpPcntTable(ITBase.PCNT_SCHEMA, PCNT_TABLE_NAME); + } @Disabled @Test @@ -1817,4 +1821,73 @@ protected void verifyGetColumns(Connection connection, DatabaseMetaData metaData assertTrue(count > 0); connection.createStatement().execute("drop table if exists " + dataset + "." + jdbctesttable); } + + @Test + public void testDatabaseMetadataGetSchemasPcnt() throws SQLException { + try (Connection connection = DriverManager.getConnection(ITBase.connectionUrl)) { + DatabaseMetaData metaData = connection.getMetaData(); + try (ResultSet rs = metaData.getSchemas(DEFAULT_CATALOG, PCNT_SCHEMA)) { + assertNotNull(rs, "ResultSet from getSchemas() should not be null"); + assertTrue( + rs.next(), "Expected PCNT schema " + PCNT_SCHEMA + " in catalog " + DEFAULT_CATALOG); + assertEquals(PCNT_SCHEMA, rs.getString("TABLE_SCHEM")); + assertEquals(DEFAULT_CATALOG, rs.getString("TABLE_CATALOG")); + } + } + } + + @Test + public void testDatabaseMetadataGetTablesPcnt() throws SQLException { + try (Connection connection = DriverManager.getConnection(ITBase.connectionUrl)) { + DatabaseMetaData metaData = connection.getMetaData(); + try (ResultSet rs = metaData.getTables(DEFAULT_CATALOG, PCNT_SCHEMA, PCNT_TABLE_NAME, null)) { + assertNotNull(rs, "ResultSet from getTables() should not be null"); + assertTrue( + rs.next(), "Expected PCNT table " + PCNT_TABLE_NAME + " under schema " + PCNT_SCHEMA); + assertEquals(DEFAULT_CATALOG, rs.getString("TABLE_CAT")); + assertEquals(PCNT_SCHEMA, rs.getString("TABLE_SCHEM")); + assertEquals(PCNT_TABLE_NAME, rs.getString("TABLE_NAME")); + assertEquals("TABLE", rs.getString("TABLE_TYPE")); + } + } + } + + @Test + public void testDatabaseMetadataGetColumnsPcnt() throws SQLException { + try (Connection connection = DriverManager.getConnection(ITBase.connectionUrl)) { + DatabaseMetaData metaData = connection.getMetaData(); + try (ResultSet rs = metaData.getColumns(DEFAULT_CATALOG, PCNT_SCHEMA, PCNT_TABLE_NAME, "%")) { + assertNotNull(rs, "ResultSet from getColumns() should not be null"); + int columnCount = 0; + boolean foundId = false; + boolean foundName = false; + while (rs.next()) { + columnCount++; + assertEquals(DEFAULT_CATALOG, rs.getString("TABLE_CAT")); + assertEquals(PCNT_SCHEMA, rs.getString("TABLE_SCHEM")); + assertEquals(PCNT_TABLE_NAME, rs.getString("TABLE_NAME")); + String colName = rs.getString("COLUMN_NAME"); + String typeName = rs.getString("TYPE_NAME"); + if ("id".equals(colName)) { + foundId = true; + assertEquals(1, rs.getInt("ORDINAL_POSITION")); + assertTrue( + typeName.equalsIgnoreCase("INT64") + || typeName.equalsIgnoreCase("INTEGER") + || typeName.equalsIgnoreCase("BIGINT")); + } else if ("name".equals(colName)) { + foundName = true; + assertEquals(2, rs.getInt("ORDINAL_POSITION")); + assertTrue( + typeName.equalsIgnoreCase("STRING") + || typeName.equalsIgnoreCase("NVARCHAR") + || typeName.equalsIgnoreCase("VARCHAR")); + } + } + assertEquals(2, columnCount, "Expected 2 columns in PCNT table " + PCNT_TABLE_NAME); + assertTrue(foundId, "Expected column 'id' in PCNT table"); + assertTrue(foundName, "Expected column 'name' in PCNT table"); + } + } + } }