Skip to content

Commit 9fd84fc

Browse files
authored
fix(bigquery-jdbc): add proper version to BigQueryDriver (#13294)
1 parent 7ef1312 commit 9fd84fc

4 files changed

Lines changed: 103 additions & 65 deletions

File tree

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

Lines changed: 5 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
import com.google.cloud.bigquery.TableId;
4444
import com.google.cloud.bigquery.exception.BigQueryJdbcException;
4545
import com.google.cloud.bigquery.jdbc.BigQueryJdbcTypeMappings.ColumnTypeInfo;
46+
import com.google.cloud.bigquery.jdbc.utils.BigQueryJdbcVersionUtility;
4647
import java.io.BufferedReader;
47-
import java.io.IOException;
4848
import java.io.InputStream;
4949
import java.io.InputStreamReader;
5050
import java.sql.Connection;
@@ -60,7 +60,6 @@
6060
import java.util.Comparator;
6161
import java.util.HashSet;
6262
import java.util.List;
63-
import java.util.Properties;
6463
import java.util.Scanner;
6564
import java.util.Set;
6665
import java.util.concurrent.BlockingQueue;
@@ -73,7 +72,6 @@
7372
import java.util.concurrent.LinkedBlockingQueue;
7473
import java.util.concurrent.TimeUnit;
7574
import java.util.concurrent.TimeoutException;
76-
import java.util.concurrent.atomic.AtomicReference;
7775
import java.util.function.Function;
7876
import java.util.function.Supplier;
7977
import java.util.regex.Pattern;
@@ -92,7 +90,7 @@ class BigQueryDatabaseMetaData implements DatabaseMetaData {
9290
private static final String DATABASE_PRODUCT_NAME = "Google BigQuery";
9391
private static final String DATABASE_PRODUCT_VERSION = "2.0";
9492
private static final String DRIVER_NAME = "GoogleJDBCDriverForGoogleBigQuery";
95-
private static final String DRIVER_DEFAULT_VERSION = "0.0.0";
93+
9694
private static final String SCHEMA_TERM = "Dataset";
9795
private static final String CATALOG_TERM = "Project";
9896
private static final String PROCEDURE_TERM = "Procedure";
@@ -143,18 +141,12 @@ class BigQueryDatabaseMetaData implements DatabaseMetaData {
143141
BigQueryConnection connection;
144142
private final BigQuery bigquery;
145143
private final int metadataFetchThreadCount;
146-
private static final AtomicReference<String> parsedDriverVersion = new AtomicReference<>(null);
147-
private static final AtomicReference<Integer> parsedDriverMajorVersion =
148-
new AtomicReference<>(null);
149-
private static final AtomicReference<Integer> parsedDriverMinorVersion =
150-
new AtomicReference<>(null);
151144

152145
BigQueryDatabaseMetaData(BigQueryConnection connection) {
153146
this.URL = connection.getConnectionUrl();
154147
this.connection = connection;
155148
this.bigquery = connection.getBigQuery();
156149
this.metadataFetchThreadCount = connection.getMetadataFetchThreadCount();
157-
loadDriverVersionProperties();
158150
}
159151

160152
@Override
@@ -223,17 +215,17 @@ public String getDriverName() {
223215

224216
@Override
225217
public String getDriverVersion() {
226-
return parsedDriverVersion.get() != null ? parsedDriverVersion.get() : DRIVER_DEFAULT_VERSION;
218+
return BigQueryJdbcVersionUtility.getDriverVersion();
227219
}
228220

229221
@Override
230222
public int getDriverMajorVersion() {
231-
return parsedDriverMajorVersion.get() != null ? parsedDriverMajorVersion.get() : 0;
223+
return BigQueryJdbcVersionUtility.getDriverMajorVersion();
232224
}
233225

234226
@Override
235227
public int getDriverMinorVersion() {
236-
return parsedDriverMinorVersion.get() != null ? parsedDriverMinorVersion.get() : 0;
228+
return BigQueryJdbcVersionUtility.getDriverMinorVersion();
237229
}
238230

239231
@Override
@@ -5233,51 +5225,6 @@ String replaceSqlParameters(String sql, String... params) throws SQLException {
52335225
return String.format(sql, (Object[]) params);
52345226
}
52355227

5236-
private void loadDriverVersionProperties() {
5237-
if (parsedDriverVersion.get() != null) {
5238-
return;
5239-
}
5240-
Properties props = new Properties();
5241-
try (InputStream input =
5242-
getClass().getResourceAsStream("/com/google/cloud/bigquery/jdbc/dependencies.properties")) {
5243-
if (input == null) {
5244-
String errorMessage =
5245-
"Could not find dependencies.properties. Driver version information is unavailable.";
5246-
IllegalStateException ex = new IllegalStateException(errorMessage);
5247-
LOG.severe(errorMessage, ex);
5248-
throw ex;
5249-
}
5250-
props.load(input);
5251-
String versionString = props.getProperty("version.jdbc");
5252-
if (versionString == null || versionString.trim().isEmpty()) {
5253-
String errorMessage =
5254-
"The property version.jdbc not found or empty in dependencies.properties.";
5255-
IllegalStateException ex = new IllegalStateException(errorMessage);
5256-
LOG.severe(errorMessage, ex);
5257-
throw ex;
5258-
}
5259-
parsedDriverVersion.compareAndSet(null, versionString.trim());
5260-
String[] parts = versionString.split("\\.");
5261-
if (parts.length < 2) {
5262-
return;
5263-
}
5264-
parsedDriverMajorVersion.compareAndSet(null, Integer.parseInt(parts[0]));
5265-
String minorPart = parts[1];
5266-
String numericMinor = minorPart.replaceAll("[^0-9].*", "");
5267-
if (!numericMinor.isEmpty()) {
5268-
parsedDriverMinorVersion.compareAndSet(null, Integer.parseInt(numericMinor));
5269-
}
5270-
} catch (IOException | NumberFormatException e) {
5271-
String errorMessage =
5272-
"Error reading dependencies.properties. Driver version information is"
5273-
+ " unavailable. Error: "
5274-
+ e.getMessage();
5275-
IllegalStateException ex = new IllegalStateException(errorMessage, e);
5276-
LOG.severe(errorMessage, ex);
5277-
throw ex;
5278-
}
5279-
}
5280-
52815228
// TODO(keshav): This is a temporary compatibility bridge to wrap raw Threads into Futures.
52825229
// This should be removed when BigQueryDatabaseMetaData is refactored to use the ExecutorService
52835230
// directly.

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.google.cloud.bigquery.exception.BigQueryJdbcException;
2020
import com.google.cloud.bigquery.exception.BigQueryJdbcRuntimeException;
21+
import com.google.cloud.bigquery.jdbc.utils.BigQueryJdbcVersionUtility;
2122
import io.grpc.LoadBalancerRegistry;
2223
import io.grpc.internal.PickFirstLoadBalancerProvider;
2324
import java.io.IOException;
@@ -55,9 +56,6 @@ public class BigQueryDriver implements Driver {
5556

5657
private static final BigQueryJdbcCustomLogger LOG =
5758
new BigQueryJdbcCustomLogger(BigQueryDriver.class.getName());
58-
// TODO: update this when JDBC goes GA
59-
private static final int JDBC_MAJOR_VERSION = 0;
60-
private static final int JDBC_MINOR_VERSION = 1;
6159
static BigQueryDriver registeredBigqueryJdbcDriver;
6260

6361
static {
@@ -243,13 +241,13 @@ public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) {
243241
@Override
244242
public int getMajorVersion() {
245243
LOG.finest("++enter++");
246-
return JDBC_MAJOR_VERSION;
244+
return BigQueryJdbcVersionUtility.getDriverMajorVersion();
247245
}
248246

249247
@Override
250248
public int getMinorVersion() {
251249
LOG.finest("++enter++");
252-
return JDBC_MINOR_VERSION;
250+
return BigQueryJdbcVersionUtility.getDriverMinorVersion();
253251
}
254252

255253
@Override
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* Copyright 2026 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.cloud.bigquery.jdbc.utils;
18+
19+
import com.google.cloud.bigquery.jdbc.BigQueryJdbcCustomLogger;
20+
import java.io.InputStream;
21+
import java.util.Properties;
22+
23+
/** Utility class to load and parse the JDBC driver version from dependencies.properties. */
24+
public final class BigQueryJdbcVersionUtility {
25+
26+
private static final BigQueryJdbcCustomLogger LOG =
27+
new BigQueryJdbcCustomLogger(BigQueryJdbcVersionUtility.class.getName());
28+
29+
private static final String DRIVER_VERSION;
30+
private static final int DRIVER_MAJOR_VERSION;
31+
private static final int DRIVER_MINOR_VERSION;
32+
33+
static {
34+
String version = "0.0.0";
35+
int major = 0;
36+
int minor = 0;
37+
try (InputStream input =
38+
BigQueryJdbcVersionUtility.class.getResourceAsStream(
39+
"/com/google/cloud/bigquery/jdbc/dependencies.properties")) {
40+
if (input == null) {
41+
throw new IllegalArgumentException(
42+
"Could not find dependencies.properties. Driver version information is unavailable.");
43+
}
44+
45+
Properties props = new Properties();
46+
props.load(input);
47+
String versionString = props.getProperty("version.jdbc");
48+
if (versionString == null || versionString.trim().isEmpty()) {
49+
throw new IllegalArgumentException(
50+
"The property version.jdbc not found or empty in dependencies.properties.");
51+
}
52+
53+
version = versionString.trim();
54+
String[] parts = version.split("\\.");
55+
if (parts.length < 2) {
56+
throw new IllegalArgumentException("Unexpected version format: " + versionString);
57+
}
58+
major = Integer.parseInt(parts[0]);
59+
String minorPart = parts[1];
60+
String numericMinor = minorPart.replaceAll("[^0-9].*", "");
61+
if (!numericMinor.isEmpty()) {
62+
minor = Integer.parseInt(numericMinor);
63+
}
64+
} catch (Exception e) {
65+
LOG.severe(
66+
"Error reading dependencies.properties. Driver version information is unavailable. Error: "
67+
+ e.getMessage(),
68+
e);
69+
}
70+
DRIVER_VERSION = version;
71+
DRIVER_MAJOR_VERSION = major;
72+
DRIVER_MINOR_VERSION = minor;
73+
}
74+
75+
private BigQueryJdbcVersionUtility() {
76+
// Utility class, static methods only.
77+
}
78+
79+
public static String getDriverVersion() {
80+
return DRIVER_VERSION;
81+
}
82+
83+
public static int getDriverMajorVersion() {
84+
return DRIVER_MAJOR_VERSION;
85+
}
86+
87+
public static int getDriverMinorVersion() {
88+
return DRIVER_MINOR_VERSION;
89+
}
90+
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static com.google.common.truth.Truth.assertThat;
1919

20+
import com.google.cloud.bigquery.jdbc.utils.BigQueryJdbcVersionUtility;
2021
import java.sql.Connection;
2122
import java.sql.DriverPropertyInfo;
2223
import java.sql.SQLException;
@@ -78,12 +79,14 @@ public void testGetPropertyInfoReturnsValidProperties() {
7879

7980
@Test
8081
public void testGetMajorVersionMatchesDriverMajorVersion() {
81-
assertThat(bigQueryDriver.getMajorVersion()).isEqualTo(0);
82+
assertThat(bigQueryDriver.getMajorVersion())
83+
.isEqualTo(BigQueryJdbcVersionUtility.getDriverMajorVersion());
8284
}
8385

8486
@Test
8587
public void testGetMinorVersionMatchesDriverMinorVersion() {
86-
assertThat(bigQueryDriver.getMinorVersion()).isEqualTo(1);
88+
assertThat(bigQueryDriver.getMinorVersion())
89+
.isEqualTo(BigQueryJdbcVersionUtility.getDriverMinorVersion());
8790
}
8891

8992
@Test

0 commit comments

Comments
 (0)