From 7a7974979158bedb57cb9eb6bfab3d9d447ace35 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 28 Oct 2026 16:30:11 -0400 Subject: [PATCH 1/8] feat(bigquery-jdbc): add enableGraphMetadata connection property --- .../bigquery/jdbc/BigQueryConnection.java | 6 +++++ .../bigquery/jdbc/BigQueryJdbcUrlUtility.java | 8 +++++++ .../cloud/bigquery/jdbc/DataSource.java | 22 ++++++++++++++++++ .../jdbc/BigQueryJdbcUrlUtilityTest.java | 23 +++++++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 6189f7ea75be..a80457d93e05 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -240,6 +240,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { boolean enableGcpLogExporter; OpenTelemetry customOpenTelemetry; boolean useGlobalOpenTelemetry; + boolean enableGraphMetadata; private OpenTelemetry openTelemetry; private Context otelContext; Tracer tracer = @@ -397,6 +398,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.connectionPoolSize = ds.getConnectionPoolSize(); this.listenerPoolSize = ds.getListenerPoolSize(); this.partnerToken = ds.getPartnerToken(); + this.enableGraphMetadata = ds.getEnableGraphMetadata(); this.headerProvider = createHeaderProvider(); this.enableGcpTraceExporter = ds.getEnableGcpTraceExporter(); @@ -867,6 +869,10 @@ Long getListenerPoolSize() { return listenerPoolSize; } + boolean isEnableGraphMetadata() { + return this.enableGraphMetadata; + } + @Override public boolean isValid(int timeout) throws SQLException { if (timeout < 0) { diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index ef7c9363c68d..9755a26a421d 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -193,6 +193,8 @@ protected boolean removeEldestEntry(Map.Entry> eldes static final String MAX_BYTES_BILLED_PROPERTY_NAME = "MaximumBytesBilled"; static final Long DEFAULT_MAX_BYTES_BILLED_VALUE = 0L; static final String LABELS_PROPERTY_NAME = "Labels"; + static final String ENABLE_GRAPH_PROPERTY_NAME = "EnablePropertyGraphMetadata"; + static final boolean DEFAULT_ENABLE_GRAPH_VALUE = false; static final List OVERRIDE_PROPERTIES = Arrays.asList( BIGQUERY_ENDPOINT_OVERRIDE_PROPERTY_NAME, @@ -691,6 +693,12 @@ protected boolean removeEldestEntry(Map.Entry> eldes .setDefaultValue( String.valueOf( TelemetryPropertyUtility.DEFAULT_ENABLE_DIAGNOSTIC_TELEMETRY_VALUE)) + .build(), + BigQueryConnectionProperty.newBuilder() + .setName(ENABLE_GRAPH_PROPERTY_NAME) + .setDescription( + "Enables or disables discovery of Property Graphs and related metadata in DatabaseMetaData methods.") + .setDefaultValue(String.valueOf(DEFAULT_ENABLE_GRAPH_VALUE)) .build()))); private static final List NETWORK_PROPERTIES = diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 66034dc1a35d..440549c1e6b6 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -131,6 +131,7 @@ public class DataSource implements javax.sql.DataSource { private OpenTelemetry customOpenTelemetry; private boolean useGlobalOpenTelemetry = BigQueryJdbcUrlUtility.DEFAULT_USE_GLOBAL_OTEL_VALUE; private Boolean enableDiagnosticTelemetry; + private Boolean enableGraphMetadata; // Make sure the JDBC driver class is loaded. static { @@ -396,6 +397,12 @@ public class DataSource implements javax.sql.DataSource { ds.setEnableDiagnosticTelemetry( BigQueryJdbcUrlUtility.convertIntToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME))) + .put( + BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME, + (ds, val) -> + ds.setEnableGraphMetadata( + BigQueryJdbcUrlUtility.convertIntToBoolean( + val, BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME))) .build(); public static DataSource fromUrl(String url) { @@ -738,6 +745,11 @@ Properties createProperties() { BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME, String.valueOf(this.useGlobalOpenTelemetry)); } + if (this.enableGraphMetadata != null) { + connectionProperties.setProperty( + BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME, + String.valueOf(this.enableGraphMetadata)); + } connectionProperties.setProperty( BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME, String.valueOf(getEnableDiagnosticTelemetry())); @@ -1537,6 +1549,16 @@ public void setPrivateServiceConnect(String privateServiceConnect) { this.privateServiceConnect = privateServiceConnect; } + public Boolean getEnableGraphMetadata() { + return enableGraphMetadata != null + ? enableGraphMetadata + : BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_VALUE; + } + + public void setEnableGraphMetadata(Boolean enableGraphMetadata) { + this.enableGraphMetadata = enableGraphMetadata; + } + @Override public PrintWriter getLogWriter() { return null; diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java index 55d9d4bde62b..c9e13aaab567 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java @@ -391,4 +391,27 @@ public void testParseDiagnosticTelemetryProperties() { assertThat(defaultDs.getEnableDiagnosticTelemetry()) .isEqualTo(TelemetryPropertyUtility.DEFAULT_ENABLE_DIAGNOSTIC_TELEMETRY_VALUE); } + + @Test + public void testEnableGraphMetadataProperties() { + String url = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + + "ProjectId=MyBigQueryProject;" + + "EnablePropertyGraphMetadata=1"; + + assertThat(BigQueryJdbcUrlUtility.parseUriProperty(url, "EnablePropertyGraphMetadata")) + .isEqualTo("1"); + + DataSource ds = DataSource.fromUrl(url); + assertThat(ds.getEnableGraphMetadata()).isTrue(); + + Properties props = ds.createProperties(); + assertThat(props.getProperty("EnablePropertyGraphMetadata")).isEqualTo("true"); + + String urlWithoutGraph = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=MyBigQueryProject"; + DataSource defaultDs = DataSource.fromUrl(urlWithoutGraph); + assertThat(defaultDs.getEnableGraphMetadata()) + .isEqualTo(BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_VALUE); + } } From c430c6b79b3e018367ccf24b6da5b7aba9bf6973 Mon Sep 17 00:00:00 2001 From: Neenu Shaji Date: Thu, 29 Oct 2026 10:31:13 -0400 Subject: [PATCH 2/8] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../main/java/com/google/cloud/bigquery/jdbc/DataSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 440549c1e6b6..1dfbe2d3c68c 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -1549,7 +1549,7 @@ public void setPrivateServiceConnect(String privateServiceConnect) { this.privateServiceConnect = privateServiceConnect; } - public Boolean getEnableGraphMetadata() { + public boolean getEnableGraphMetadata() { return enableGraphMetadata != null ? enableGraphMetadata : BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_VALUE; From a285b57d599eb0137c1928d33b6f9c88b9e4d755 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 29 Oct 2026 10:54:11 -0400 Subject: [PATCH 3/8] address comments --- .../bigquery/jdbc/BigQueryConnection.java | 8 +++-- .../cloud/bigquery/jdbc/BigQueryDriver.java | 2 +- .../bigquery/jdbc/BigQueryJdbcUrlUtility.java | 7 ++-- .../cloud/bigquery/jdbc/DataSource.java | 36 +++++++++---------- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index a80457d93e05..02f518a16ff4 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -164,7 +164,9 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME, BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME, BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME, - BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME) + BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME) .build(); private HeaderProvider headerProvider; BigQueryReadClient bigQueryReadClient = null; @@ -315,7 +317,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { } this.reqGoogleDriveScope = - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( String.valueOf(ds.getRequestGoogleDriveScope()), BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME); @@ -1650,7 +1652,7 @@ private boolean checkIsReadOnlyTokenUsed(Map authProps) { String readonlyValue = authProps.get(BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME); if (readonlyValue != null) { - return BigQueryJdbcUrlUtility.convertIntToBoolean( + return BigQueryJdbcUrlUtility.convertToBoolean( readonlyValue, BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME); } return false; diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java index 140636632316..204d3fc4e2ee 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java @@ -174,7 +174,7 @@ public Connection connect(String url, Properties info) throws SQLException { boolean enableGcpLogExporter = false; if (enableGcpLogExporterStr != null) { enableGcpLogExporter = - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( enableGcpLogExporterStr, BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME); } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index 9755a26a421d..bd00e7b945c2 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -193,7 +193,7 @@ protected boolean removeEldestEntry(Map.Entry> eldes static final String MAX_BYTES_BILLED_PROPERTY_NAME = "MaximumBytesBilled"; static final Long DEFAULT_MAX_BYTES_BILLED_VALUE = 0L; static final String LABELS_PROPERTY_NAME = "Labels"; - static final String ENABLE_GRAPH_PROPERTY_NAME = "EnablePropertyGraphMetadata"; + static final String ENABLE_GRAPH_METADATA_PROPERTY_NAME = "EnablePropertyGraphMetadata"; static final boolean DEFAULT_ENABLE_GRAPH_VALUE = false; static final List OVERRIDE_PROPERTIES = Arrays.asList( @@ -695,10 +695,9 @@ protected boolean removeEldestEntry(Map.Entry> eldes TelemetryPropertyUtility.DEFAULT_ENABLE_DIAGNOSTIC_TELEMETRY_VALUE)) .build(), BigQueryConnectionProperty.newBuilder() - .setName(ENABLE_GRAPH_PROPERTY_NAME) + .setName(ENABLE_GRAPH_METADATA_PROPERTY_NAME) .setDescription( "Enables or disables discovery of Property Graphs and related metadata in DatabaseMetaData methods.") - .setDefaultValue(String.valueOf(DEFAULT_ENABLE_GRAPH_VALUE)) .build()))); private static final List NETWORK_PROPERTIES = @@ -869,7 +868,7 @@ static String appendPropertiesToURL(String url, String callerClassName, Properti return urlBuilder.toString(); } - static boolean convertIntToBoolean(String value, String propertyName) { + static boolean convertToBoolean(String value, String propertyName) { int integerValue; try { diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 1dfbe2d3c68c..3152fb07f0f5 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -158,13 +158,13 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME, (ds, val) -> ds.setEnableHighThroughputAPI( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME, (ds, val) -> ds.setUnsupportedHTAPIFallback( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME, @@ -183,13 +183,13 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME, (ds, val) -> ds.setEnableSession( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_TIMESTAMP_PICOS_PROPERTY_NAME, (ds, val) -> ds.setEnableTimestampPicos( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_TIMESTAMP_PICOS_PROPERTY_NAME))) .put(BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME, DataSource::setLogLevel) .put(BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME, DataSource::setLogPath) @@ -210,7 +210,7 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME, (ds, val) -> ds.setOAuthAccessTokenReadonly( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.OAUTH_REFRESH_TOKEN_PROPERTY_NAME, @@ -219,14 +219,14 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME, (ds, val) -> ds.setUseQueryCache( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME))) .put(BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME, DataSource::setQueryDialect) .put( BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME, (ds, val) -> ds.setAllowLargeResults( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME, @@ -259,7 +259,7 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME, (ds, val) -> ds.setEnableWriteAPI( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME, @@ -268,14 +268,14 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME, (ds, val) -> ds.setFilterTablesOnDefaultDataset( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_PROJECT_DISCOVERY_PROPERTY_NAME, (ds, val) -> ds.setEnableProjectDiscovery( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_PROJECT_DISCOVERY_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, @@ -377,32 +377,32 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_GCP_TRACE_EXPORTER_PROPERTY_NAME, (ds, val) -> ds.setEnableGcpTraceExporter( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_GCP_TRACE_EXPORTER_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME, (ds, val) -> ds.setEnableGcpLogExporter( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME, (ds, val) -> ds.setUseGlobalOpenTelemetry( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME, (ds, val) -> ds.setEnableDiagnosticTelemetry( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME))) .put( - BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME, (ds, val) -> ds.setEnableGraphMetadata( - BigQueryJdbcUrlUtility.convertIntToBoolean( - val, BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME))) + BigQueryJdbcUrlUtility.convertToBoolean( + val, BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME))) .build(); public static DataSource fromUrl(String url) { @@ -747,7 +747,7 @@ Properties createProperties() { } if (this.enableGraphMetadata != null) { connectionProperties.setProperty( - BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME, String.valueOf(this.enableGraphMetadata)); } connectionProperties.setProperty( From c8c84678f8ec714b2203af2e34e97e50397d5f21 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 29 Oct 2026 11:38:33 -0400 Subject: [PATCH 4/8] address comments --- .../bigquery/jdbc/BigQueryConnection.java | 4 +- .../cloud/bigquery/jdbc/BigQueryDriver.java | 2 +- .../bigquery/jdbc/BigQueryJdbcUrlUtility.java | 9 ++--- .../cloud/bigquery/jdbc/DataSource.java | 38 +++++++++---------- .../jdbc/BigQueryJdbcUrlUtilityTest.java | 2 +- 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index a80457d93e05..7124cc4c4ff7 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -315,7 +315,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { } this.reqGoogleDriveScope = - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( String.valueOf(ds.getRequestGoogleDriveScope()), BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME); @@ -1650,7 +1650,7 @@ private boolean checkIsReadOnlyTokenUsed(Map authProps) { String readonlyValue = authProps.get(BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME); if (readonlyValue != null) { - return BigQueryJdbcUrlUtility.convertIntToBoolean( + return BigQueryJdbcUrlUtility.convertToBoolean( readonlyValue, BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME); } return false; diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java index 140636632316..204d3fc4e2ee 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java @@ -174,7 +174,7 @@ public Connection connect(String url, Properties info) throws SQLException { boolean enableGcpLogExporter = false; if (enableGcpLogExporterStr != null) { enableGcpLogExporter = - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( enableGcpLogExporterStr, BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME); } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index 9755a26a421d..d22846470081 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -193,8 +193,8 @@ protected boolean removeEldestEntry(Map.Entry> eldes static final String MAX_BYTES_BILLED_PROPERTY_NAME = "MaximumBytesBilled"; static final Long DEFAULT_MAX_BYTES_BILLED_VALUE = 0L; static final String LABELS_PROPERTY_NAME = "Labels"; - static final String ENABLE_GRAPH_PROPERTY_NAME = "EnablePropertyGraphMetadata"; - static final boolean DEFAULT_ENABLE_GRAPH_VALUE = false; + static final String ENABLE_GRAPH_METADATA_PROPERTY_NAME = "EnableGraphMetadata"; + static final boolean DEFAULT_ENABLE_GRAPH_METADATA_VALUE = false; static final List OVERRIDE_PROPERTIES = Arrays.asList( BIGQUERY_ENDPOINT_OVERRIDE_PROPERTY_NAME, @@ -695,10 +695,9 @@ protected boolean removeEldestEntry(Map.Entry> eldes TelemetryPropertyUtility.DEFAULT_ENABLE_DIAGNOSTIC_TELEMETRY_VALUE)) .build(), BigQueryConnectionProperty.newBuilder() - .setName(ENABLE_GRAPH_PROPERTY_NAME) + .setName(ENABLE_GRAPH_METADATA_PROPERTY_NAME) .setDescription( "Enables or disables discovery of Property Graphs and related metadata in DatabaseMetaData methods.") - .setDefaultValue(String.valueOf(DEFAULT_ENABLE_GRAPH_VALUE)) .build()))); private static final List NETWORK_PROPERTIES = @@ -869,7 +868,7 @@ static String appendPropertiesToURL(String url, String callerClassName, Properti return urlBuilder.toString(); } - static boolean convertIntToBoolean(String value, String propertyName) { + static boolean convertToBoolean(String value, String propertyName) { int integerValue; try { diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 1dfbe2d3c68c..7d91c128d9a7 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -158,13 +158,13 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME, (ds, val) -> ds.setEnableHighThroughputAPI( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME, (ds, val) -> ds.setUnsupportedHTAPIFallback( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME, @@ -183,13 +183,13 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME, (ds, val) -> ds.setEnableSession( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_TIMESTAMP_PICOS_PROPERTY_NAME, (ds, val) -> ds.setEnableTimestampPicos( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_TIMESTAMP_PICOS_PROPERTY_NAME))) .put(BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME, DataSource::setLogLevel) .put(BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME, DataSource::setLogPath) @@ -210,7 +210,7 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME, (ds, val) -> ds.setOAuthAccessTokenReadonly( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.OAUTH_REFRESH_TOKEN_PROPERTY_NAME, @@ -219,14 +219,14 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME, (ds, val) -> ds.setUseQueryCache( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME))) .put(BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME, DataSource::setQueryDialect) .put( BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME, (ds, val) -> ds.setAllowLargeResults( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME, @@ -259,7 +259,7 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME, (ds, val) -> ds.setEnableWriteAPI( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME, @@ -268,14 +268,14 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME, (ds, val) -> ds.setFilterTablesOnDefaultDataset( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_PROJECT_DISCOVERY_PROPERTY_NAME, (ds, val) -> ds.setEnableProjectDiscovery( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_PROJECT_DISCOVERY_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME, @@ -377,32 +377,32 @@ public class DataSource implements javax.sql.DataSource { BigQueryJdbcUrlUtility.ENABLE_GCP_TRACE_EXPORTER_PROPERTY_NAME, (ds, val) -> ds.setEnableGcpTraceExporter( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_GCP_TRACE_EXPORTER_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME, (ds, val) -> ds.setEnableGcpLogExporter( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_GCP_LOG_EXPORTER_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME, (ds, val) -> ds.setUseGlobalOpenTelemetry( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.USE_GLOBAL_OTEL_PROPERTY_NAME))) .put( BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME, (ds, val) -> ds.setEnableDiagnosticTelemetry( - BigQueryJdbcUrlUtility.convertIntToBoolean( + BigQueryJdbcUrlUtility.convertToBoolean( val, BigQueryJdbcUrlUtility.ENABLE_DIAGNOSTIC_TELEMETRY_PROPERTY_NAME))) .put( - BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME, (ds, val) -> ds.setEnableGraphMetadata( - BigQueryJdbcUrlUtility.convertIntToBoolean( - val, BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME))) + BigQueryJdbcUrlUtility.convertToBoolean( + val, BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME))) .build(); public static DataSource fromUrl(String url) { @@ -747,7 +747,7 @@ Properties createProperties() { } if (this.enableGraphMetadata != null) { connectionProperties.setProperty( - BigQueryJdbcUrlUtility.ENABLE_GRAPH_PROPERTY_NAME, + BigQueryJdbcUrlUtility.ENABLE_GRAPH_METADATA_PROPERTY_NAME, String.valueOf(this.enableGraphMetadata)); } connectionProperties.setProperty( @@ -1552,7 +1552,7 @@ public void setPrivateServiceConnect(String privateServiceConnect) { public boolean getEnableGraphMetadata() { return enableGraphMetadata != null ? enableGraphMetadata - : BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_VALUE; + : BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_METADATA_VALUE; } public void setEnableGraphMetadata(Boolean enableGraphMetadata) { diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java index c9e13aaab567..9d115d4a1c22 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java @@ -412,6 +412,6 @@ public void testEnableGraphMetadataProperties() { "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=MyBigQueryProject"; DataSource defaultDs = DataSource.fromUrl(urlWithoutGraph); assertThat(defaultDs.getEnableGraphMetadata()) - .isEqualTo(BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_VALUE); + .isEqualTo(BigQueryJdbcUrlUtility.DEFAULT_ENABLE_GRAPH_METADATA_VALUE); } } From b30489f57aad15210b462361fac1b6a044e1836a Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 29 Oct 2026 12:11:34 -0400 Subject: [PATCH 5/8] fix test --- .../cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java index 9d115d4a1c22..daf938657196 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtilityTest.java @@ -397,16 +397,15 @@ public void testEnableGraphMetadataProperties() { String url = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + "ProjectId=MyBigQueryProject;" - + "EnablePropertyGraphMetadata=1"; + + "EnableGraphMetadata=1"; - assertThat(BigQueryJdbcUrlUtility.parseUriProperty(url, "EnablePropertyGraphMetadata")) - .isEqualTo("1"); + assertThat(BigQueryJdbcUrlUtility.parseUriProperty(url, "EnableGraphMetadata")).isEqualTo("1"); DataSource ds = DataSource.fromUrl(url); assertThat(ds.getEnableGraphMetadata()).isTrue(); Properties props = ds.createProperties(); - assertThat(props.getProperty("EnablePropertyGraphMetadata")).isEqualTo("true"); + assertThat(props.getProperty("EnableGraphMetadata")).isEqualTo("true"); String urlWithoutGraph = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=MyBigQueryProject"; From 2eb99b703ababbeec3a2329e4a3e44e292399151 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Mon, 2 Nov 2026 14:44:32 -0500 Subject: [PATCH 6/8] address comments --- .../jdbc/BigQueryDatabaseMetaData.java | 15 +- .../jdbc/BigQueryDatabaseMetaDataTest.java | 135 ++++++++++++++---- 2 files changed, 119 insertions(+), 31 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java index 54d9991997e8..b0fa063ac674 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java @@ -1330,7 +1330,7 @@ private ResultSet getTablesImpl( && requestedTypes.contains(GRAPH_TABLE_TYPE); boolean isExactGraphTableName = tableNamePattern != null - && !needsListing(tableNamePattern) + && !tableNamePattern.contains("%") && tableNamePattern.contains("."); if (!isExactGraphTableName && !onlyGraphTablesRequested) { processTargetTablesConcurrently( @@ -1475,7 +1475,7 @@ Comparator defineGetTablesComparator(FieldList resultSchemaField Comparator.nullsFirst(String::compareTo)); } - private static String quoteIdentifier(String identifier) throws SQLException { + static String quoteIdentifier(String identifier) throws SQLException { if (identifier == null || !VALID_IDENTIFIER_PATTERN.matcher(identifier).matches()) { throw new BigQueryJdbcException( String.format("Invalid BigQuery identifier: '%s'", identifier)); @@ -1491,17 +1491,18 @@ boolean shouldSkipGraphTables(String tableNamePattern, Set requestedType return true; } if (tableNamePattern != null - && !needsListing(tableNamePattern) + && !tableNamePattern.contains("%") && !tableNamePattern.contains(".")) { return true; } return false; } - private String resolveGraphRegion() throws SQLException { + String resolveGraphRegion() throws SQLException { String location = this.connection != null ? this.connection.getLocation() : null; if (location == null || location.trim().isEmpty()) { location = DEFAULT_GRAPH_REGION; + LOG.info(String.format("Deafulting to Graph Location %s", DEFAULT_GRAPH_REGION)); } String normalized = location.trim().toLowerCase(Locale.US); return normalized.startsWith("region-") ? normalized : "region-" + normalized; @@ -1519,6 +1520,8 @@ void appendGraphTableRows( return; } + LOG.info("Appending Graph table rows"); + List targetCatalogs = effectiveCatalog != null ? Collections.singletonList(effectiveCatalog) @@ -5003,14 +5006,14 @@ private static synchronized String getExportedKeysSqlContent() { return exportedKeysSqlContent; } - private static synchronized String getGraphTablesDatasetSqlContent() { + static synchronized String getGraphTablesDatasetSqlContent() { if (graphTablesDatasetSqlContent == null) { graphTablesDatasetSqlContent = readSqlFromFile(GET_GRAPH_TABLES_DATASET_SQL); } return graphTablesDatasetSqlContent; } - private static synchronized String getGraphTablesRegionSqlContent() { + static synchronized String getGraphTablesRegionSqlContent() { if (graphTablesRegionSqlContent == null) { graphTablesRegionSqlContent = readSqlFromFile(GET_GRAPH_TABLES_REGION_SQL); } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaDataTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaDataTest.java index 9c9e5f10b77e..0f316af47cd7 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaDataTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaDataTest.java @@ -726,6 +726,8 @@ public void testSortResults_Tables() { // Add rows in unsorted order (based on TYPE, CAT, SCHEM, NAME) results.add(createTableRow("cat_a", "sch_z", "table_1", "TABLE", schemaFields)); results.add(createTableRow("cat_b", "sch_a", "view_1", "VIEW", schemaFields)); + results.add( + createTableRow("cat_a", "sch_a", "RetailGraph.Product", "GRAPH TABLE", schemaFields)); results.add(createTableRow("cat_a", "sch_c", "table_2", "TABLE", schemaFields)); results.add(createTableRow(null, "sch_b", "table_0", "TABLE", schemaFields)); results.add(createTableRow("cat_a", "sch_z", "table_0", "TABLE", schemaFields)); @@ -734,44 +736,51 @@ public void testSortResults_Tables() { Comparator comparator = dbMetadata.defineGetTablesComparator(schemaFields); dbMetadata.sortResults(results, comparator, "getTables", dbMetadata.LOG); - // Expected order: TABLEs first, then VIEWs. Within type, sort by CAT, SCHEM, NAME - assertEquals(6, results.size()); + // Expected order: GRAPH TABLE first, then TABLEs, then VIEWs. Within type, sort by CAT, SCHEM, + // NAME + assertEquals(7, results.size()); - // 1. Null cat, sch_b, table_0, TABLE - assertTrue(results.get(0).get("TABLE_CAT").isNull(), "Row 0 TABLE_CAT should be null"); - assertEquals("sch_b", results.get(0).get("TABLE_SCHEM").getStringValue()); - assertEquals("table_0", results.get(0).get("TABLE_NAME").getStringValue()); - assertEquals("TABLE", results.get(0).get("TABLE_TYPE").getStringValue()); + // 1. cat_a, sch_a, RetailGraph.Product, GRAPH TABLE + assertEquals("cat_a", results.get(0).get("TABLE_CAT").getStringValue()); + assertEquals("sch_a", results.get(0).get("TABLE_SCHEM").getStringValue()); + assertEquals("RetailGraph.Product", results.get(0).get("TABLE_NAME").getStringValue()); + assertEquals("GRAPH TABLE", results.get(0).get("TABLE_TYPE").getStringValue()); - // 2. cat_a, sch_c, table_2, TABLE - assertEquals("cat_a", results.get(1).get("TABLE_CAT").getStringValue()); - assertEquals("sch_c", results.get(1).get("TABLE_SCHEM").getStringValue()); - assertEquals("table_2", results.get(1).get("TABLE_NAME").getStringValue()); + // 2. Null cat, sch_b, table_0, TABLE + assertTrue(results.get(1).get("TABLE_CAT").isNull(), "Row 1 TABLE_CAT should be null"); + assertEquals("sch_b", results.get(1).get("TABLE_SCHEM").getStringValue()); + assertEquals("table_0", results.get(1).get("TABLE_NAME").getStringValue()); assertEquals("TABLE", results.get(1).get("TABLE_TYPE").getStringValue()); - // 3. cat_a, sch_z, table_0, TABLE + // 3. cat_a, sch_c, table_2, TABLE assertEquals("cat_a", results.get(2).get("TABLE_CAT").getStringValue()); - assertEquals("sch_z", results.get(2).get("TABLE_SCHEM").getStringValue()); - assertEquals("table_0", results.get(2).get("TABLE_NAME").getStringValue()); + assertEquals("sch_c", results.get(2).get("TABLE_SCHEM").getStringValue()); + assertEquals("table_2", results.get(2).get("TABLE_NAME").getStringValue()); assertEquals("TABLE", results.get(2).get("TABLE_TYPE").getStringValue()); - // 4. cat_a, sch_z, table_1, TABLE + // 4. cat_a, sch_z, table_0, TABLE assertEquals("cat_a", results.get(3).get("TABLE_CAT").getStringValue()); assertEquals("sch_z", results.get(3).get("TABLE_SCHEM").getStringValue()); - assertEquals("table_1", results.get(3).get("TABLE_NAME").getStringValue()); + assertEquals("table_0", results.get(3).get("TABLE_NAME").getStringValue()); assertEquals("TABLE", results.get(3).get("TABLE_TYPE").getStringValue()); - // 5. cat_a, null, view_0, VIEW + // 5. cat_a, sch_z, table_1, TABLE assertEquals("cat_a", results.get(4).get("TABLE_CAT").getStringValue()); - assertTrue(results.get(4).get("TABLE_SCHEM").isNull(), "Row 4 TABLE_SCHEM should be null"); - assertEquals("view_0", results.get(4).get("TABLE_NAME").getStringValue()); - assertEquals("VIEW", results.get(4).get("TABLE_TYPE").getStringValue()); - - // 6. cat_b, sch_a, view_1, VIEW - assertEquals("cat_b", results.get(5).get("TABLE_CAT").getStringValue()); - assertEquals("sch_a", results.get(5).get("TABLE_SCHEM").getStringValue()); - assertEquals("view_1", results.get(5).get("TABLE_NAME").getStringValue()); + assertEquals("sch_z", results.get(4).get("TABLE_SCHEM").getStringValue()); + assertEquals("table_1", results.get(4).get("TABLE_NAME").getStringValue()); + assertEquals("TABLE", results.get(4).get("TABLE_TYPE").getStringValue()); + + // 6. cat_a, null, view_0, VIEW + assertEquals("cat_a", results.get(5).get("TABLE_CAT").getStringValue()); + assertTrue(results.get(5).get("TABLE_SCHEM").isNull(), "Row 5 TABLE_SCHEM should be null"); + assertEquals("view_0", results.get(5).get("TABLE_NAME").getStringValue()); assertEquals("VIEW", results.get(5).get("TABLE_TYPE").getStringValue()); + + // 7. cat_b, sch_a, view_1, VIEW + assertEquals("cat_b", results.get(6).get("TABLE_CAT").getStringValue()); + assertEquals("sch_a", results.get(6).get("TABLE_SCHEM").getStringValue()); + assertEquals("view_1", results.get(6).get("TABLE_NAME").getStringValue()); + assertEquals("VIEW", results.get(6).get("TABLE_TYPE").getStringValue()); } @Test @@ -3835,6 +3844,82 @@ public void testGetTableTypes_withGraphTablesEnabled() throws SQLException { } } + @Test + public void testShouldSkipGraphTables() { + Set tableOnly = Collections.singleton("TABLE"); + Set graphIncluded = new HashSet<>(Arrays.asList("TABLE", "GRAPH TABLE")); + + // Disabled connection property -> always skip + when(bigQueryConnection.isEnableGraphMetadata()).thenReturn(false); + assertTrue(dbMetadata.shouldSkipGraphTables(null, null)); + assertTrue(dbMetadata.shouldSkipGraphTables("%", graphIncluded)); + assertTrue(dbMetadata.shouldSkipGraphTables("RetailGraph.Product", graphIncluded)); + + // Enabled connection property + when(bigQueryConnection.isEnableGraphMetadata()).thenReturn(true); + // Requested types exclude GRAPH TABLE -> skip + assertTrue(dbMetadata.shouldSkipGraphTables("%", tableOnly)); + // Plain table names without '%' or '.' (including snake_case with '_') -> skip + assertTrue(dbMetadata.shouldSkipGraphTables("my_normal_table", null)); + assertTrue(dbMetadata.shouldSkipGraphTables("plain_table", graphIncluded)); + + // Wildcard '%', null pattern, or dot-qualified graph table names -> do not skip + assertFalse(dbMetadata.shouldSkipGraphTables(null, null)); + assertFalse(dbMetadata.shouldSkipGraphTables("%", null)); + assertFalse(dbMetadata.shouldSkipGraphTables("RetailGraph.Product", null)); + assertFalse(dbMetadata.shouldSkipGraphTables("Graph_.Person", graphIncluded)); + assertFalse(dbMetadata.shouldSkipGraphTables("my_graph.%", graphIncluded)); + } + + @Test + public void testResolveGraphRegion() throws SQLException { + when(bigQueryConnection.getLocation()).thenReturn(null); + assertEquals("region-us", dbMetadata.resolveGraphRegion()); + + when(bigQueryConnection.getLocation()).thenReturn(" "); + assertEquals("region-us", dbMetadata.resolveGraphRegion()); + + when(bigQueryConnection.getLocation()).thenReturn("US"); + assertEquals("region-us", dbMetadata.resolveGraphRegion()); + + when(bigQueryConnection.getLocation()).thenReturn("us-central1"); + assertEquals("region-us-central1", dbMetadata.resolveGraphRegion()); + + when(bigQueryConnection.getLocation()).thenReturn("region-eu"); + assertEquals("region-eu", dbMetadata.resolveGraphRegion()); + } + + @Test + public void testQuoteIdentifier() throws SQLException { + assertEquals("`my-project_1`", BigQueryDatabaseMetaData.quoteIdentifier("my-project_1")); + assertEquals("`my_dataset`", BigQueryDatabaseMetaData.quoteIdentifier("my_dataset")); + assertEquals("`region-us`", BigQueryDatabaseMetaData.quoteIdentifier("region-us")); + + assertThrows(BigQueryJdbcException.class, () -> BigQueryDatabaseMetaData.quoteIdentifier(null)); + assertThrows(BigQueryJdbcException.class, () -> BigQueryDatabaseMetaData.quoteIdentifier("")); + assertThrows( + BigQueryJdbcException.class, () -> BigQueryDatabaseMetaData.quoteIdentifier("bad`id")); + assertThrows( + BigQueryJdbcException.class, () -> BigQueryDatabaseMetaData.quoteIdentifier("drop;table")); + } + + @Test + public void testGraphTablesSqlContent() throws SQLException { + String datasetSql = + dbMetadata.replaceSqlParameters( + BigQueryDatabaseMetaData.getGraphTablesDatasetSqlContent(), + BigQueryDatabaseMetaData.quoteIdentifier("my-project"), + BigQueryDatabaseMetaData.quoteIdentifier("my_dataset")); + assertThat(datasetSql).contains("`my-project`.`my_dataset`.INFORMATION_SCHEMA.PROPERTY_GRAPHS"); + + String regionSql = + dbMetadata.replaceSqlParameters( + BigQueryDatabaseMetaData.getGraphTablesRegionSqlContent(), + BigQueryDatabaseMetaData.quoteIdentifier("my-project"), + BigQueryDatabaseMetaData.quoteIdentifier("region-us")); + assertThat(regionSql).contains("`my-project`.`region-us`.INFORMATION_SCHEMA.PROPERTY_GRAPHS"); + } + @FunctionalInterface private interface MetadataResultSetSupplier { ResultSet get(BigQueryDatabaseMetaData metadata) throws SQLException; From a831f43676fae7897e98f75853e31da7b2b874d7 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Mon, 2 Nov 2026 14:51:00 -0500 Subject: [PATCH 7/8] add test tag --- .../google/cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java | 1 + 1 file changed, 1 insertion(+) 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 98f675e16e05..a75a6e293497 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 @@ -823,6 +823,7 @@ public void testDatabaseMetadataGetTables() throws SQLException { @Test @Tag("disable_tpc") + @Tag("advanced) public void testDatabaseMetadataGetTables_PropertyGraph() throws SQLException { String nodeTable = "GRAPH_NODE_TABLE_" + randomNumber; String edgeTable = "GRAPH_EDGE_TABLE_" + randomNumber; From ff49045a9ec44f8a307225bad4566e995fce3d19 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Mon, 2 Nov 2026 15:04:07 -0500 Subject: [PATCH 8/8] use test helper --- .../cloud/bigquery/jdbc/it/ITDatabaseMetadataTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) 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 a75a6e293497..94822b4e09bb 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 @@ -823,7 +823,7 @@ public void testDatabaseMetadataGetTables() throws SQLException { @Test @Tag("disable_tpc") - @Tag("advanced) + @Tag("advanced") public void testDatabaseMetadataGetTables_PropertyGraph() throws SQLException { String nodeTable = "GRAPH_NODE_TABLE_" + randomNumber; String edgeTable = "GRAPH_EDGE_TABLE_" + randomNumber; @@ -860,13 +860,7 @@ public void testDatabaseMetadataGetTables_PropertyGraph() throws SQLException { DatabaseMetaData metaData = conn.getMetaData(); // 1. Verify getTableTypes() includes "GRAPH TABLE" - Set tableTypes = new HashSet<>(); - try (ResultSet rsTypes = metaData.getTableTypes()) { - while (rsTypes.next()) { - tableTypes.add(rsTypes.getString("TABLE_TYPE")); - } - } - Assertions.assertTrue(tableTypes.contains("GRAPH TABLE")); + verifyTableTypes(metaData, Arrays.asList("EXTERNAL", "GRAPH TABLE", "TABLE", "VIEW")); // 2. Verify getTables() with wildcard pattern returns both node and edge elements Set graphTables = new HashSet<>();