Skip to content

Commit 7168fad

Browse files
committed
fix(bigquery-jdbc): add proper version to BigQueryDriver
1 parent e0bdb6e commit 7168fad

4 files changed

Lines changed: 129 additions & 64 deletions

File tree

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

Lines changed: 7 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.google.cloud.bigquery.TableDefinition;
4343
import com.google.cloud.bigquery.TableId;
4444
import com.google.cloud.bigquery.exception.BigQueryJdbcException;
45+
import com.google.cloud.bigquery.jdbc.utils.BigQueryJdbcVersionUtility;
4546
import com.google.common.collect.ImmutableMap;
4647
import java.io.BufferedReader;
4748
import java.io.IOException;
@@ -61,7 +62,7 @@
6162
import java.util.HashSet;
6263
import java.util.List;
6364
import java.util.Map;
64-
import java.util.Properties;
65+
6566
import java.util.Scanner;
6667
import java.util.Set;
6768
import java.util.concurrent.BlockingQueue;
@@ -73,7 +74,7 @@
7374
import java.util.concurrent.Future;
7475
import java.util.concurrent.LinkedBlockingQueue;
7576
import java.util.concurrent.TimeUnit;
76-
import java.util.concurrent.atomic.AtomicReference;
77+
7778
import java.util.function.Function;
7879
import java.util.function.Supplier;
7980
import java.util.regex.Pattern;
@@ -92,7 +93,7 @@ class BigQueryDatabaseMetaData implements DatabaseMetaData {
9293
private static final String DATABASE_PRODUCT_NAME = "Google BigQuery";
9394
private static final String DATABASE_PRODUCT_VERSION = "2.0";
9495
private static final String DRIVER_NAME = "GoogleJDBCDriverForGoogleBigQuery";
95-
private static final String DRIVER_DEFAULT_VERSION = "0.0.0";
96+
9697
private static final String SCHEMA_TERM = "Dataset";
9798
private static final String CATALOG_TERM = "Project";
9899
private static final String PROCEDURE_TERM = "Procedure";
@@ -143,18 +144,11 @@ class BigQueryDatabaseMetaData implements DatabaseMetaData {
143144
BigQueryConnection connection;
144145
private final BigQuery bigquery;
145146
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);
151-
152147
BigQueryDatabaseMetaData(BigQueryConnection connection) {
153148
this.URL = connection.getConnectionUrl();
154149
this.connection = connection;
155150
this.bigquery = connection.getBigQuery();
156151
this.metadataFetchThreadCount = connection.getMetadataFetchThreadCount();
157-
loadDriverVersionProperties();
158152
}
159153

160154
@Override
@@ -223,17 +217,17 @@ public String getDriverName() {
223217

224218
@Override
225219
public String getDriverVersion() {
226-
return parsedDriverVersion.get() != null ? parsedDriverVersion.get() : DRIVER_DEFAULT_VERSION;
220+
return BigQueryJdbcVersionUtility.getDriverVersion();
227221
}
228222

229223
@Override
230224
public int getDriverMajorVersion() {
231-
return parsedDriverMajorVersion.get() != null ? parsedDriverMajorVersion.get() : 0;
225+
return BigQueryJdbcVersionUtility.getDriverMajorVersion();
232226
}
233227

234228
@Override
235229
public int getDriverMinorVersion() {
236-
return parsedDriverMinorVersion.get() != null ? parsedDriverMinorVersion.get() : 0;
230+
return BigQueryJdbcVersionUtility.getDriverMinorVersion();
237231
}
238232

239233
@Override
@@ -5288,48 +5282,4 @@ String replaceSqlParameters(String sql, String... params) throws SQLException {
52885282
return String.format(sql, (Object[]) params);
52895283
}
52905284

5291-
private void loadDriverVersionProperties() {
5292-
if (parsedDriverVersion.get() != null) {
5293-
return;
5294-
}
5295-
Properties props = new Properties();
5296-
try (InputStream input =
5297-
getClass().getResourceAsStream("/com/google/cloud/bigquery/jdbc/dependencies.properties")) {
5298-
if (input == null) {
5299-
String errorMessage =
5300-
"Could not find dependencies.properties. Driver version information is unavailable.";
5301-
IllegalStateException ex = new IllegalStateException(errorMessage);
5302-
LOG.severe(errorMessage, ex);
5303-
throw ex;
5304-
}
5305-
props.load(input);
5306-
String versionString = props.getProperty("version.jdbc");
5307-
if (versionString == null || versionString.trim().isEmpty()) {
5308-
String errorMessage =
5309-
"The property version.jdbc not found or empty in dependencies.properties.";
5310-
IllegalStateException ex = new IllegalStateException(errorMessage);
5311-
LOG.severe(errorMessage, ex);
5312-
throw ex;
5313-
}
5314-
parsedDriverVersion.compareAndSet(null, versionString.trim());
5315-
String[] parts = versionString.split("\\.");
5316-
if (parts.length < 2) {
5317-
return;
5318-
}
5319-
parsedDriverMajorVersion.compareAndSet(null, Integer.parseInt(parts[0]));
5320-
String minorPart = parts[1];
5321-
String numericMinor = minorPart.replaceAll("[^0-9].*", "");
5322-
if (!numericMinor.isEmpty()) {
5323-
parsedDriverMinorVersion.compareAndSet(null, Integer.parseInt(numericMinor));
5324-
}
5325-
} catch (IOException | NumberFormatException e) {
5326-
String errorMessage =
5327-
"Error reading dependencies.properties. Driver version information is"
5328-
+ " unavailable. Error: "
5329-
+ e.getMessage();
5330-
IllegalStateException ex = new IllegalStateException(errorMessage, e);
5331-
LOG.severe(errorMessage, ex);
5332-
throw ex;
5333-
}
5334-
}
53355285
}

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 {
@@ -232,13 +230,13 @@ public DriverPropertyInfo[] getPropertyInfo(String url, Properties info) {
232230
@Override
233231
public int getMajorVersion() {
234232
LOG.finest("++enter++");
235-
return JDBC_MAJOR_VERSION;
233+
return BigQueryJdbcVersionUtility.getDriverMajorVersion();
236234
}
237235

238236
@Override
239237
public int getMinorVersion() {
240238
LOG.finest("++enter++");
241-
return JDBC_MINOR_VERSION;
239+
return BigQueryJdbcVersionUtility.getDriverMinorVersion();
242240
}
243241

244242
@Override
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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.IOException;
21+
import java.io.InputStream;
22+
import java.util.Properties;
23+
import java.util.concurrent.atomic.AtomicReference;
24+
25+
/** Utility class to load and parse the JDBC driver version from dependencies.properties. */
26+
public final class BigQueryJdbcVersionUtility {
27+
28+
private static final BigQueryJdbcCustomLogger LOG =
29+
new BigQueryJdbcCustomLogger(BigQueryJdbcVersionUtility.class.getName());
30+
31+
private static final AtomicReference<String> parsedDriverVersion = new AtomicReference<>(null);
32+
private static final AtomicReference<Integer> parsedDriverMajorVersion =
33+
new AtomicReference<>(null);
34+
private static final AtomicReference<Integer> parsedDriverMinorVersion =
35+
new AtomicReference<>(null);
36+
37+
private BigQueryJdbcVersionUtility() {
38+
// Utility class, static methods only.
39+
}
40+
41+
/**
42+
* Gets the full driver version string.
43+
*
44+
* @return the driver version string, e.g., "1.0.0-SNAPSHOT"
45+
*/
46+
public static String getDriverVersion() {
47+
ensureLoaded();
48+
return parsedDriverVersion.get();
49+
}
50+
51+
/**
52+
* Gets the driver major version.
53+
*
54+
* @return the major version number
55+
*/
56+
public static int getDriverMajorVersion() {
57+
ensureLoaded();
58+
return parsedDriverMajorVersion.get() != null ? parsedDriverMajorVersion.get() : 0;
59+
}
60+
61+
/**
62+
* Gets the driver minor version.
63+
*
64+
* @return the minor version number
65+
*/
66+
public static int getDriverMinorVersion() {
67+
ensureLoaded();
68+
return parsedDriverMinorVersion.get() != null ? parsedDriverMinorVersion.get() : 0;
69+
}
70+
71+
private static void ensureLoaded() {
72+
if (parsedDriverVersion.get() != null) {
73+
return;
74+
}
75+
Properties props = new Properties();
76+
try (InputStream input =
77+
BigQueryJdbcVersionUtility.class.getResourceAsStream(
78+
"/com/google/cloud/bigquery/jdbc/dependencies.properties")) {
79+
if (input == null) {
80+
String errorMessage =
81+
"Could not find dependencies.properties. Driver version information is unavailable.";
82+
IllegalStateException ex = new IllegalStateException(errorMessage);
83+
LOG.severe(errorMessage, ex);
84+
throw ex;
85+
}
86+
props.load(input);
87+
String versionString = props.getProperty("version.jdbc");
88+
if (versionString == null || versionString.trim().isEmpty()) {
89+
String errorMessage =
90+
"The property version.jdbc not found or empty in dependencies.properties.";
91+
IllegalStateException ex = new IllegalStateException(errorMessage);
92+
LOG.severe(errorMessage, ex);
93+
throw ex;
94+
}
95+
parsedDriverVersion.compareAndSet(null, versionString.trim());
96+
String[] parts = versionString.split("\\.");
97+
if (parts.length < 2) {
98+
return;
99+
}
100+
parsedDriverMajorVersion.compareAndSet(null, Integer.parseInt(parts[0]));
101+
String minorPart = parts[1];
102+
String numericMinor = minorPart.replaceAll("[^0-9].*", "");
103+
if (!numericMinor.isEmpty()) {
104+
parsedDriverMinorVersion.compareAndSet(null, Integer.parseInt(numericMinor));
105+
}
106+
} catch (IOException | NumberFormatException e) {
107+
String errorMessage =
108+
"Error reading dependencies.properties. Driver version information is"
109+
+ " unavailable. Error: "
110+
+ e.getMessage();
111+
IllegalStateException ex = new IllegalStateException(errorMessage, e);
112+
LOG.severe(errorMessage, ex);
113+
throw ex;
114+
}
115+
}
116+
}

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

Lines changed: 3 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;
@@ -76,12 +77,12 @@ public void testGetPropertyInfoReturnsValidProperties() {
7677

7778
@Test
7879
public void testGetMajorVersionMatchesDriverMajorVersion() {
79-
assertThat(bigQueryDriver.getMajorVersion()).isEqualTo(0);
80+
assertThat(bigQueryDriver.getMajorVersion()).isEqualTo(BigQueryJdbcVersionUtility.getDriverMajorVersion());
8081
}
8182

8283
@Test
8384
public void testGetMinorVersionMatchesDriverMinorVersion() {
84-
assertThat(bigQueryDriver.getMinorVersion()).isEqualTo(1);
85+
assertThat(bigQueryDriver.getMinorVersion()).isEqualTo(BigQueryJdbcVersionUtility.getDriverMinorVersion());
8586
}
8687

8788
@Test

0 commit comments

Comments
 (0)