Skip to content

Commit db2c8a4

Browse files
committed
resolve conflicts
2 parents 2f8f898 + d08691a commit db2c8a4

7 files changed

Lines changed: 370 additions & 363 deletions

File tree

java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@ class BigQueryDatabaseMetaData implements DatabaseMetaData {
141141

142142
String URL;
143143
BigQueryConnection connection;
144-
Statement statement = null;
145144
private final BigQuery bigquery;
146145
private final int metadataFetchThreadCount;
147146
private static final AtomicReference<String> parsedDriverVersion = new AtomicReference<>(null);
@@ -2641,16 +2640,27 @@ Schema defineGetVersionColumnsSchema() {
26412640
return Schema.of(fields);
26422641
}
26432642

2643+
private void closeStatementIgnoreException(Statement statement) {
2644+
if (statement == null) {
2645+
return;
2646+
}
2647+
try {
2648+
statement.close();
2649+
} catch (SQLException e) {
2650+
// pass
2651+
}
2652+
}
2653+
26442654
@Override
26452655
public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException {
26462656
String sql = readSqlFromFile(GET_PRIMARY_KEYS_SQL);
2657+
Statement stmt = this.connection.createStatement();
26472658
try {
2648-
if (this.statement == null) {
2649-
this.statement = this.connection.createStatement();
2650-
}
2659+
stmt.closeOnCompletion();
26512660
String formattedSql = replaceSqlParameters(sql, catalog, schema, table);
2652-
return this.statement.executeQuery(formattedSql);
2661+
return stmt.executeQuery(formattedSql);
26532662
} catch (SQLException e) {
2663+
closeStatementIgnoreException(stmt);
26542664
throw new BigQueryJdbcException("Error executing getPrimaryKeys", e);
26552665
}
26562666
}
@@ -2659,13 +2669,13 @@ public ResultSet getPrimaryKeys(String catalog, String schema, String table) thr
26592669
public ResultSet getImportedKeys(String catalog, String schema, String table)
26602670
throws SQLException {
26612671
String sql = readSqlFromFile(GET_IMPORTED_KEYS_SQL);
2672+
Statement stmt = this.connection.createStatement();
26622673
try {
2663-
if (this.statement == null) {
2664-
this.statement = this.connection.createStatement();
2665-
}
2674+
stmt.closeOnCompletion();
26662675
String formattedSql = replaceSqlParameters(sql, catalog, schema, table);
2667-
return this.statement.executeQuery(formattedSql);
2676+
return stmt.executeQuery(formattedSql);
26682677
} catch (SQLException e) {
2678+
closeStatementIgnoreException(stmt);
26692679
throw new BigQueryJdbcException("Error executing getImportedKeys", e);
26702680
}
26712681
}
@@ -2674,13 +2684,13 @@ public ResultSet getImportedKeys(String catalog, String schema, String table)
26742684
public ResultSet getExportedKeys(String catalog, String schema, String table)
26752685
throws SQLException {
26762686
String sql = readSqlFromFile(GET_EXPORTED_KEYS_SQL);
2687+
Statement stmt = this.connection.createStatement();
26772688
try {
2678-
if (this.statement == null) {
2679-
this.statement = this.connection.createStatement();
2680-
}
2689+
stmt.closeOnCompletion();
26812690
String formattedSql = replaceSqlParameters(sql, catalog, schema, table);
2682-
return this.statement.executeQuery(formattedSql);
2691+
return stmt.executeQuery(formattedSql);
26832692
} catch (SQLException e) {
2693+
closeStatementIgnoreException(stmt);
26842694
throw new BigQueryJdbcException("Error executing getExportedKeys", e);
26852695
}
26862696
}
@@ -2695,10 +2705,9 @@ public ResultSet getCrossReference(
26952705
String foreignTable)
26962706
throws SQLException {
26972707
String sql = readSqlFromFile(GET_CROSS_REFERENCE_SQL);
2708+
Statement stmt = this.connection.createStatement();
26982709
try {
2699-
if (this.statement == null) {
2700-
this.statement = this.connection.createStatement();
2701-
}
2710+
stmt.closeOnCompletion();
27022711
String formattedSql =
27032712
replaceSqlParameters(
27042713
sql,
@@ -2708,8 +2717,9 @@ public ResultSet getCrossReference(
27082717
foreignCatalog,
27092718
foreignSchema,
27102719
foreignTable);
2711-
return this.statement.executeQuery(formattedSql);
2720+
return stmt.executeQuery(formattedSql);
27122721
} catch (SQLException e) {
2722+
closeStatementIgnoreException(stmt);
27132723
throw new BigQueryJdbcException("Error executing getCrossReference", e);
27142724
}
27152725
}

java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaDataTest.java

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ public void testMapBigQueryTypeToJdbc_ScalarTypes() {
342342
assertEquals(Integer.valueOf(38), infoBigNumeric.decimalDigits);
343343
assertEquals(Integer.valueOf(10), infoBigNumeric.numPrecRadix);
344344

345-
// GEOGRAPHY -> VARCHAR
345+
// GEOGRAPHY -> OTHER
346346
Field fieldGeo =
347347
Field.newBuilder("test_geo", StandardSQLTypeName.GEOGRAPHY)
348348
.setMode(Field.Mode.NULLABLE)
@@ -352,6 +352,27 @@ public void testMapBigQueryTypeToJdbc_ScalarTypes() {
352352
assertEquals("GEOGRAPHY", infoGeo.typeName);
353353
assertNull(infoGeo.columnSize);
354354

355+
// JSON -> OTHER
356+
Field fieldJson =
357+
Field.newBuilder("test_json", StandardSQLTypeName.JSON)
358+
.setMode(Field.Mode.NULLABLE)
359+
.build();
360+
BigQueryDatabaseMetaData.ColumnTypeInfo infoJson = dbMetadata.mapBigQueryTypeToJdbc(fieldJson);
361+
assertEquals(Types.OTHER, infoJson.jdbcType);
362+
assertEquals("JSON", infoJson.typeName);
363+
assertNull(infoJson.columnSize);
364+
365+
// INTERVAL -> OTHER
366+
Field fieldInterval =
367+
Field.newBuilder("test_interval", StandardSQLTypeName.INTERVAL)
368+
.setMode(Field.Mode.NULLABLE)
369+
.build();
370+
BigQueryDatabaseMetaData.ColumnTypeInfo infoInterval =
371+
dbMetadata.mapBigQueryTypeToJdbc(fieldInterval);
372+
assertEquals(Types.OTHER, infoInterval.jdbcType);
373+
assertEquals("INTERVAL", infoInterval.typeName);
374+
assertNull(infoInterval.columnSize);
375+
355376
// DATE
356377
Field fieldDate =
357378
Field.newBuilder("test_date", StandardSQLTypeName.DATE)
@@ -3224,4 +3245,34 @@ public void testWrapperMethods() throws SQLException {
32243245
assertTrue(e.getMessage().contains("Cannot unwrap to java.sql.Connection"));
32253246
}
32263247
}
3248+
3249+
@Test
3250+
public void testMetadataMethodsDoNotInterfere() throws SQLException {
3251+
Statement mockStatement1 = mock(Statement.class);
3252+
Statement mockStatement2 = mock(Statement.class);
3253+
ResultSet mockResultSet1 = mock(ResultSet.class);
3254+
ResultSet mockResultSet2 = mock(ResultSet.class);
3255+
3256+
when(bigQueryConnection.createStatement())
3257+
.thenReturn(mockStatement1)
3258+
.thenReturn(mockStatement2);
3259+
3260+
when(mockStatement1.executeQuery(any())).thenReturn(mockResultSet1);
3261+
when(mockStatement2.executeQuery(any())).thenReturn(mockResultSet2);
3262+
3263+
// Call first metadata method
3264+
ResultSet rs1 = dbMetadata.getPrimaryKeys("cat", "schema", "table");
3265+
assertSame(mockResultSet1, rs1);
3266+
3267+
// Call second metadata method
3268+
ResultSet rs2 = dbMetadata.getImportedKeys("cat", "schema", "table");
3269+
assertSame(mockResultSet2, rs2);
3270+
3271+
// Verify closeOnCompletion was called on both statements
3272+
verify(mockStatement1).closeOnCompletion();
3273+
verify(mockStatement2).closeOnCompletion();
3274+
3275+
// Verify connection.createStatement() was called twice
3276+
verify(bigQueryConnection, times(2)).createStatement();
3277+
}
32273278
}

java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,40 @@ public void testTableConstraints() throws SQLException {
341341
connection.close();
342342
}
343343

344+
@Test
345+
public void testMetadataResultSetsDoNotInterfere() throws SQLException {
346+
try (Connection connection =
347+
DriverManager.getConnection(String.format(connectionUrl, DEFAULT_CATALOG))) {
348+
DatabaseMetaData metaData = connection.getMetaData();
349+
350+
// Get primary keys for table 1
351+
ResultSet primaryKeys1 =
352+
metaData.getPrimaryKeys(PROJECT_ID, CONSTRAINTS_DATASET, CONSTRAINTS_TABLE_NAME);
353+
354+
// Get imported keys for table 1, BEFORE fully consuming primaryKeys1
355+
ResultSet importedKeys =
356+
metaData.getImportedKeys(PROJECT_ID, CONSTRAINTS_DATASET, CONSTRAINTS_TABLE_NAME);
357+
358+
// Now try to read from primaryKeys1
359+
Assertions.assertTrue(primaryKeys1.next());
360+
Assertions.assertEquals("id", primaryKeys1.getString("COLUMN_NAME"));
361+
362+
// Read from importedKeys
363+
Assertions.assertTrue(importedKeys.next());
364+
Assertions.assertEquals(CONSTRAINTS_TABLE_NAME2, importedKeys.getString("PKTABLE_NAME"));
365+
366+
// Read more from primaryKeys1 (should be finished now)
367+
Assertions.assertFalse(primaryKeys1.next());
368+
369+
// Read more from importedKeys
370+
Assertions.assertTrue(importedKeys.next());
371+
Assertions.assertEquals(CONSTRAINTS_TABLE_NAME2, importedKeys.getString("PKTABLE_NAME"));
372+
373+
primaryKeys1.close();
374+
importedKeys.close();
375+
}
376+
}
377+
344378
@Test
345379
public void testDatabaseMetadataGetCatalogs() throws SQLException {
346380

0 commit comments

Comments
 (0)