diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b91fa381f..4dd9974f2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -104,7 +104,7 @@ jobs: - uses: actions/setup-java@v4 with: distribution: temurin - java-version: 11 + java-version: 17 - run: java -version - run: .kokoro/build.sh env: diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index d74a2b264..667eb33ae 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -14,6 +14,6 @@ jobs: shell: bash run: .kokoro/build.sh - name: Unmanaged dependency check - uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.47.0 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.48.0 with: bom-path: pom.xml diff --git a/.kokoro/build.sh b/.kokoro/build.sh index 502fb4fd4..d7dbf59de 100755 --- a/.kokoro/build.sh +++ b/.kokoro/build.sh @@ -62,7 +62,7 @@ test) RETURN_CODE=$? ;; lint) - mvn com.coveo:fmt-maven-plugin:check -B -ntp + mvn com.spotify.fmt:fmt-maven-plugin:check -B -ntp RETURN_CODE=$? ;; javadoc) diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg index fcb138739..49bf3f1e1 100644 --- a/.kokoro/presubmit/graalvm-native-a.cfg +++ b/.kokoro/presubmit/graalvm-native-a.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.47.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.48.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native-b.cfg b/.kokoro/presubmit/graalvm-native-b.cfg index f8ab2d6e5..af1210bdc 100644 --- a/.kokoro/presubmit/graalvm-native-b.cfg +++ b/.kokoro/presubmit/graalvm-native-b.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.47.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.48.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native-c.cfg b/.kokoro/presubmit/graalvm-native-c.cfg index fa345ea0a..10457a1ac 100644 --- a/.kokoro/presubmit/graalvm-native-c.cfg +++ b/.kokoro/presubmit/graalvm-native-c.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.47.0" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.48.0" } env_vars: { diff --git a/CHANGELOG.md b/CHANGELOG.md index 24d441102..cc27fb6c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [2.30.2](https://github.com/googleapis/java-spanner-jdbc/compare/v2.30.1...v2.30.2) (2025-05-22) + + +### Dependencies + +* Update dependency com.google.api.grpc:proto-google-cloud-trace-v1 to v2.63.0 ([#2058](https://github.com/googleapis/java-spanner-jdbc/issues/2058)) ([da82fea](https://github.com/googleapis/java-spanner-jdbc/commit/da82feacf3de8c7d441cf8686c6f7385f5274bc9)) +* Update dependency com.google.cloud:google-cloud-spanner to v6.94.0 ([#2064](https://github.com/googleapis/java-spanner-jdbc/issues/2064)) ([1b789e5](https://github.com/googleapis/java-spanner-jdbc/commit/1b789e50a4a3b06782923479cc1024ee7c2e102b)) +* Update dependency com.google.cloud:google-cloud-spanner-bom to v6.94.0 ([#2065](https://github.com/googleapis/java-spanner-jdbc/issues/2065)) ([1154c13](https://github.com/googleapis/java-spanner-jdbc/commit/1154c13ae1ca44a9a52cafc2d24628f53a9d121e)) +* Update dependency com.google.cloud:google-cloud-trace to v2.63.0 ([#2059](https://github.com/googleapis/java-spanner-jdbc/issues/2059)) ([86a49bb](https://github.com/googleapis/java-spanner-jdbc/commit/86a49bbf29d0752aa2fdcf5fe73587f72fc6630e)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.48.0 ([#2057](https://github.com/googleapis/java-spanner-jdbc/issues/2057)) ([c6f47d4](https://github.com/googleapis/java-spanner-jdbc/commit/c6f47d4753e73ef58e21d5d13f4d380b67a80a55)) +* Update dependency io.opentelemetry:opentelemetry-bom to v1.50.0 ([#2051](https://github.com/googleapis/java-spanner-jdbc/issues/2051)) ([1d2a3b7](https://github.com/googleapis/java-spanner-jdbc/commit/1d2a3b728f5a56b948412bea493e2b5b70a89ab2)) +* Update dependency org.springframework.data:spring-data-bom to v2024.1.6 ([#2060](https://github.com/googleapis/java-spanner-jdbc/issues/2060)) ([91c30e4](https://github.com/googleapis/java-spanner-jdbc/commit/91c30e425fdb8a1a4a9d55fdc5df254ff17aa201)) + ## [2.30.1](https://github.com/googleapis/java-spanner-jdbc/compare/v2.30.0...v2.30.1) (2025-05-09) diff --git a/README.md b/README.md index 4ddfd3ece..0409981be 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ If you are using Maven, add this to your pom.xml file: com.google.cloud google-cloud-spanner-jdbc - 2.30.1 + 2.30.2 ``` @@ -30,7 +30,7 @@ If you are using Gradle without BOM, add this to your dependencies ```Groovy -implementation 'com.google.cloud:google-cloud-spanner-jdbc:2.30.1' +implementation 'com.google.cloud:google-cloud-spanner-jdbc:2.30.2' ``` @@ -38,7 +38,7 @@ If you are using SBT, add this to your dependencies ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-spanner-jdbc" % "2.30.1" +libraryDependencies += "com.google.cloud" % "google-cloud-spanner-jdbc" % "2.30.2" ``` diff --git a/clirr-ignored-differences.xml b/clirr-ignored-differences.xml index 547c9c44c..f8e168c5f 100644 --- a/clirr-ignored-differences.xml +++ b/clirr-ignored-differences.xml @@ -123,4 +123,8 @@ com/google/cloud/spanner/jdbc/CloudSpannerJdbcConnection com.google.cloud.spanner.DatabaseId getDatabaseId() + + 8001 + com/google/cloud/spanner/connection/ConnectionPropertiesHelper + diff --git a/pom.xml b/pom.xml index e208c4426..12159cf86 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 google-cloud-spanner-jdbc - 2.30.1 + 2.30.2 jar Google Cloud Spanner JDBC https://github.com/googleapis/java-spanner-jdbc @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.47.0 + 3.48.0 @@ -61,7 +61,7 @@ com.google.cloud google-cloud-spanner-bom - 6.93.0 + 6.94.0 pom import @@ -216,13 +216,13 @@ com.google.cloud google-cloud-trace - 2.62.0 + 2.63.0 test com.google.api.grpc proto-google-cloud-trace-v1 - 2.62.0 + 2.63.0 test @@ -351,7 +351,7 @@ java - com.google.cloud.spanner.connection.ConnectionPropertiesFileGenerator + com.google.cloud.spanner.jdbc.ConnectionPropertiesFileGenerator test false diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index b16b39dc8..87ee93280 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -29,7 +29,7 @@ com.google.cloud google-cloud-spanner-jdbc - 2.30.0 + 2.30.1 diff --git a/samples/quickperf/pom.xml b/samples/quickperf/pom.xml index c32aba479..83374c8bc 100644 --- a/samples/quickperf/pom.xml +++ b/samples/quickperf/pom.xml @@ -12,7 +12,7 @@ com.google.cloud sdk-platform-java-config - 3.47.0 + 3.48.0 @@ -27,7 +27,7 @@ com.google.cloud libraries-bom - 26.59.0 + 26.60.0 pom import diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index d8c1b122b..abcfd5722 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -29,7 +29,7 @@ com.google.cloud google-cloud-spanner-jdbc - 2.30.1 + 2.30.2 diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index a648f3ba6..170fd5af7 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -9,7 +9,7 @@ com.google.cloud sdk-platform-java-config - 3.47.0 + 3.48.0 @@ -26,7 +26,7 @@ com.google.cloud libraries-bom - 26.59.0 + 26.60.0 pom import diff --git a/samples/spring-data-jdbc/googlesql/pom.xml b/samples/spring-data-jdbc/googlesql/pom.xml index 783e25ede..2d19f3272 100644 --- a/samples/spring-data-jdbc/googlesql/pom.xml +++ b/samples/spring-data-jdbc/googlesql/pom.xml @@ -23,28 +23,28 @@ org.springframework.data spring-data-bom - 2024.1.5 + 2024.1.6 import pom com.google.cloud google-cloud-spanner-bom - 6.93.0 + 6.94.0 import pom com.google.cloud libraries-bom - 26.59.0 + 26.60.0 import pom io.opentelemetry opentelemetry-bom - 1.49.0 + 1.50.0 pom import diff --git a/samples/spring-data-jdbc/postgresql/pom.xml b/samples/spring-data-jdbc/postgresql/pom.xml index 78439fba4..b9fe1385d 100644 --- a/samples/spring-data-jdbc/postgresql/pom.xml +++ b/samples/spring-data-jdbc/postgresql/pom.xml @@ -23,28 +23,28 @@ org.springframework.data spring-data-bom - 2024.1.5 + 2024.1.6 import pom com.google.cloud google-cloud-spanner-bom - 6.93.0 + 6.94.0 import pom com.google.cloud libraries-bom - 26.59.0 + 26.60.0 import pom io.opentelemetry opentelemetry-bom - 1.49.0 + 1.50.0 pom import diff --git a/samples/spring-data-mybatis/googlesql/pom.xml b/samples/spring-data-mybatis/googlesql/pom.xml index bcf10d7de..2b8bd8914 100644 --- a/samples/spring-data-mybatis/googlesql/pom.xml +++ b/samples/spring-data-mybatis/googlesql/pom.xml @@ -28,21 +28,21 @@ org.springframework.data spring-data-bom - 2024.1.5 + 2024.1.6 import pom com.google.cloud google-cloud-spanner-bom - 6.93.0 + 6.94.0 import pom com.google.cloud libraries-bom - 26.59.0 + 26.60.0 import pom @@ -94,7 +94,7 @@ com.google.cloud google-cloud-spanner - 6.93.0 + 6.94.0 test-jar test diff --git a/samples/spring-data-mybatis/postgresql/pom.xml b/samples/spring-data-mybatis/postgresql/pom.xml index 0cd43877c..e7e1ff505 100644 --- a/samples/spring-data-mybatis/postgresql/pom.xml +++ b/samples/spring-data-mybatis/postgresql/pom.xml @@ -28,14 +28,14 @@ org.springframework.data spring-data-bom - 2024.1.5 + 2024.1.6 import pom com.google.cloud libraries-bom - 26.59.0 + 26.60.0 import pom diff --git a/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcPreparedStatement.java b/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcPreparedStatement.java index 9c58a5239..be8df4aff 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcPreparedStatement.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcPreparedStatement.java @@ -81,8 +81,7 @@ public void addBatch(String sql) throws SQLException { @Override public void setNull(int parameterIndex, int sqlType) throws SQLException { checkClosed(); - parameters.setParameter( - parameterIndex, /* value = */ null, sqlType, /* scaleOrLength = */ null); + parameters.setParameter(parameterIndex, /* value= */ null, sqlType, /* scaleOrLength= */ null); } @Override diff --git a/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcResultSet.java b/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcResultSet.java index 652ed0b25..4b6ac4c13 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcResultSet.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/AbstractJdbcResultSet.java @@ -39,6 +39,7 @@ abstract class AbstractJdbcResultSet extends AbstractJdbcWrapper implements ResultSet { /** The underlying Cloud Spanner {@link com.google.cloud.spanner.ResultSet}. */ final com.google.cloud.spanner.ResultSet spanner; + /** Current fetch size hint for this result set. */ private int fetchSize; diff --git a/src/main/java/com/google/cloud/spanner/jdbc/CloudSpannerJdbcConnection.java b/src/main/java/com/google/cloud/spanner/jdbc/CloudSpannerJdbcConnection.java index 359854c90..50f1f5328 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/CloudSpannerJdbcConnection.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/CloudSpannerJdbcConnection.java @@ -88,7 +88,9 @@ default void setTransactionTag(String tag) throws SQLException { throw new UnsupportedOperationException(); } - /** @return The transaction tag of the current transaction. */ + /** + * @return The transaction tag of the current transaction. + */ default String getTransactionTag() throws SQLException { throw new UnsupportedOperationException(); } @@ -242,7 +244,9 @@ default String getStatementTag() throws SQLException { */ void setReturnCommitStats(boolean returnCommitStats) throws SQLException; - /** @return true if this connection requests commit statistics from Cloud Spanner. */ + /** + * @return true if this connection requests commit statistics from Cloud Spanner. + */ boolean isReturnCommitStats() throws SQLException; /** @@ -359,7 +363,9 @@ default String getStatementTag() throws SQLException { */ String getConnectionUrl(); - /** @return The {@link Dialect} that is used by this connection. */ + /** + * @return The {@link Dialect} that is used by this connection. + */ default Dialect getDialect() { return Dialect.GOOGLE_STANDARD_SQL; } diff --git a/src/main/java/com/google/cloud/spanner/connection/ConnectionPropertiesHelper.java b/src/main/java/com/google/cloud/spanner/jdbc/ConnectionPropertiesHelper.java similarity index 80% rename from src/main/java/com/google/cloud/spanner/connection/ConnectionPropertiesHelper.java rename to src/main/java/com/google/cloud/spanner/jdbc/ConnectionPropertiesHelper.java index cde651e02..4f8db86b0 100644 --- a/src/main/java/com/google/cloud/spanner/connection/ConnectionPropertiesHelper.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/ConnectionPropertiesHelper.java @@ -14,9 +14,10 @@ * limitations under the License. */ -package com.google.cloud.spanner.connection; +package com.google.cloud.spanner.jdbc; -import com.google.api.core.InternalApi; +import com.google.cloud.spanner.connection.ConnectionProperties; +import com.google.cloud.spanner.connection.ConnectionProperty; import com.google.common.collect.ImmutableList; import java.sql.DriverPropertyInfo; import java.util.Arrays; @@ -26,16 +27,14 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -// TODO: Remove this class when the Connection API has made the list of properties public. -@InternalApi -public class ConnectionPropertiesHelper { - public static ImmutableList> VALID_CONNECTION_PROPERTIES = +class ConnectionPropertiesHelper { + static ImmutableList> VALID_CONNECTION_PROPERTIES = ImmutableList.copyOf( - ConnectionProperties.CONNECTION_PROPERTIES.values().stream() + ConnectionProperties.VALID_CONNECTION_PROPERTIES.stream() .sorted(Comparator.comparing(ConnectionProperty::getName)) .collect(Collectors.toList())); - public static DriverPropertyInfo toDriverPropertyInfo( + static DriverPropertyInfo toDriverPropertyInfo( String connectionUri, ConnectionProperty connectionProperty) { DriverPropertyInfo result = new DriverPropertyInfo( @@ -56,7 +55,7 @@ public static DriverPropertyInfo toDriverPropertyInfo( return result; } - public static String getConnectionPropertyName(ConnectionProperty connectionProperty) { + static String getConnectionPropertyName(ConnectionProperty connectionProperty) { return connectionProperty.getName(); } diff --git a/src/main/java/com/google/cloud/spanner/jdbc/IsolationLevelConverter.java b/src/main/java/com/google/cloud/spanner/jdbc/IsolationLevelConverter.java index 3e3e10c9f..cabf08057 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/IsolationLevelConverter.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/IsolationLevelConverter.java @@ -40,7 +40,7 @@ static IsolationLevel convertToSpanner(int jdbcIsolationLevel) throws SQLExcepti static int convertToJdbc(IsolationLevel isolationLevel) { switch (isolationLevel) { - // Translate UNSPECIFIED to SERIALIZABLE as that is the default isolation level. + // Translate UNSPECIFIED to SERIALIZABLE as that is the default isolation level. case ISOLATION_LEVEL_UNSPECIFIED: case SERIALIZABLE: return Connection.TRANSACTION_SERIALIZABLE; diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcConstants.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcConstants.java index 164aec0ee..8de8c7f0e 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcConstants.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcConstants.java @@ -27,6 +27,7 @@ public final class JdbcConstants { * was executed with {@link Statement#execute(String)} returned a {@link ResultSet}. */ public static final int STATEMENT_RESULT_SET = -1; + /** * Special value that is used to indicate that a statement had no result. The method {@link * Statement#getUpdateCount()} will return this value if the previous statement that was executed diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDataSource.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDataSource.java index 026406e2b..d4f415d27 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDataSource.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDataSource.java @@ -114,12 +114,16 @@ public boolean isClosed() { return false; } - /** @return the JDBC URL to use for this {@link DataSource}. */ + /** + * @return the JDBC URL to use for this {@link DataSource}. + */ public String getUrl() { return url; } - /** @param url The JDBC URL to use for this {@link DataSource}. */ + /** + * @param url The JDBC URL to use for this {@link DataSource}. + */ public void setUrl(String url) { this.url = url; } diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDriver.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDriver.java index f7bdb3b09..120880fee 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDriver.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDriver.java @@ -23,7 +23,6 @@ import com.google.cloud.spanner.SpannerException; import com.google.cloud.spanner.connection.ConnectionOptions; import com.google.cloud.spanner.connection.ConnectionOptionsHelper; -import com.google.cloud.spanner.connection.ConnectionPropertiesHelper; import com.google.cloud.spanner.connection.ConnectionProperty; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Suppliers; @@ -196,7 +195,9 @@ static void deregister() throws SQLException { registeredDriver = null; } - /** @return {@code true} if the driver is registered against {@link DriverManager} */ + /** + * @return {@code true} if the driver is registered against {@link DriverManager} + */ static boolean isRegistered() { return registeredDriver != null; } @@ -281,7 +282,7 @@ static boolean isHibernate() { // we assume that Hibernate will (eventually) be used. Class.forName( "com.google.cloud.spanner.hibernate.SpannerDialect", - /*initialize=*/ false, + /* initialize= */ false, JdbcDriver.class.getClassLoader()); return true; } catch (Throwable ignore) { diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcSqlException.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcSqlException.java index c36b8134a..90f6df043 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcSqlException.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcSqlException.java @@ -25,13 +25,19 @@ */ public interface JdbcSqlException { - /** @see Throwable#getMessage() */ + /** + * @see Throwable#getMessage() + */ String getMessage(); - /** @see Throwable#getCause() */ + /** + * @see Throwable#getCause() + */ Throwable getCause(); - /** @see SQLException#getSQLState() */ + /** + * @see SQLException#getSQLState() + */ String getSQLState(); /** Returns the gRPC error code as an int */ diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JsonType.java b/src/main/java/com/google/cloud/spanner/jdbc/JsonType.java index 3e69adea4..747f8732e 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JsonType.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JsonType.java @@ -27,11 +27,13 @@ */ public class JsonType implements SQLType { public static final JsonType INSTANCE = new JsonType(); + /** * Spanner does not have any type numbers, but the code values are unique. Add 100,000 to avoid * conflicts with the type numbers in java.sql.Types. */ public static final int VENDOR_TYPE_NUMBER = 100_000 + TypeCode.JSON_VALUE; + /** * Define a short type number as well, as this is what is expected to be returned in {@link * DatabaseMetaData#getTypeInfo()}. diff --git a/src/main/java/com/google/cloud/spanner/jdbc/PgJsonbType.java b/src/main/java/com/google/cloud/spanner/jdbc/PgJsonbType.java index b0a819b0d..d447233ca 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/PgJsonbType.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/PgJsonbType.java @@ -22,12 +22,14 @@ public class PgJsonbType implements SQLType { public static final PgJsonbType INSTANCE = new PgJsonbType(); + /** * Spanner/Spangres does not have any type numbers, but the code values are unique. Add 200,000 to * avoid conflicts with the type numbers in java.sql.Types. Native Cloud Spanner types already use * the range starting at 100,000 (see {@link JsonType}). */ public static final int VENDOR_TYPE_NUMBER = 200_000 + TypeCode.JSON_VALUE; + /** * Define a short type number as well, as this is what is expected to be returned in {@link * DatabaseMetaData#getTypeInfo()}. diff --git a/src/main/java/com/google/cloud/spanner/jdbc/ProtoEnumType.java b/src/main/java/com/google/cloud/spanner/jdbc/ProtoEnumType.java index 953fb73b3..7c710bc90 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/ProtoEnumType.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/ProtoEnumType.java @@ -27,11 +27,13 @@ */ public class ProtoEnumType implements SQLType { public static final ProtoEnumType INSTANCE = new ProtoEnumType(); + /** * Spanner does not have any type numbers, but the code values are unique. Add 100,000 to avoid * conflicts with the type numbers in java.sql.Types. */ public static final int VENDOR_TYPE_NUMBER = 100_000 + TypeCode.ENUM_VALUE; + /** * Define a short type number as well, as this is what is expected to be returned in {@link * DatabaseMetaData#getTypeInfo()}. diff --git a/src/main/java/com/google/cloud/spanner/jdbc/ProtoMessageType.java b/src/main/java/com/google/cloud/spanner/jdbc/ProtoMessageType.java index 2a7f6f705..df5fd98a2 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/ProtoMessageType.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/ProtoMessageType.java @@ -27,11 +27,13 @@ */ public class ProtoMessageType implements SQLType { public static final ProtoMessageType INSTANCE = new ProtoMessageType(); + /** * Spanner does not have any type numbers, but the code values are unique. Add 100,000 to avoid * conflicts with the type numbers in java.sql.Types. */ public static final int VENDOR_TYPE_NUMBER = 100_000 + TypeCode.PROTO_VALUE; + /** * Define a short type number as well, as this is what is expected to be returned in {@link * DatabaseMetaData#getTypeInfo()}. diff --git a/src/main/java/com/google/cloud/spanner/jdbc/SpannerPool.java b/src/main/java/com/google/cloud/spanner/jdbc/SpannerPool.java index 8bcbcc195..2122d7dc4 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/SpannerPool.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/SpannerPool.java @@ -16,12 +16,16 @@ package com.google.cloud.spanner.jdbc; -/** @see com.google.cloud.spanner.connection.SpannerPool */ +/** + * @see com.google.cloud.spanner.connection.SpannerPool + */ @Deprecated public class SpannerPool { private SpannerPool() {} - /** @see com.google.cloud.spanner.connection.SpannerPool#closeSpannerPool() */ + /** + * @see com.google.cloud.spanner.connection.SpannerPool#closeSpannerPool() + */ @Deprecated public static void closeSpannerPool() { com.google.cloud.spanner.connection.SpannerPool.closeSpannerPool(); diff --git a/src/main/java/com/google/cloud/spanner/jdbc/UuidType.java b/src/main/java/com/google/cloud/spanner/jdbc/UuidType.java index 46317b435..22bf3666b 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/UuidType.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/UuidType.java @@ -27,11 +27,13 @@ */ public class UuidType implements SQLType { public static final UuidType INSTANCE = new UuidType(); + /** * Spanner does not have any type numbers, but the code values are unique. Add 100,000 to avoid * conflicts with the type numbers in java.sql.Types. */ public static final int VENDOR_TYPE_NUMBER = 100_000 + TypeCode.UUID_VALUE; + /** * Define a short type number as well, as this is what is expected to be returned in {@link * DatabaseMetaData#getTypeInfo()}. diff --git a/src/test/java/com/google/cloud/spanner/connection/ConnectionPropertiesFileGenerator.java b/src/test/java/com/google/cloud/spanner/jdbc/ConnectionPropertiesFileGenerator.java similarity index 96% rename from src/test/java/com/google/cloud/spanner/connection/ConnectionPropertiesFileGenerator.java rename to src/test/java/com/google/cloud/spanner/jdbc/ConnectionPropertiesFileGenerator.java index 4307fbcb0..9efc63b9e 100644 --- a/src/test/java/com/google/cloud/spanner/connection/ConnectionPropertiesFileGenerator.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/ConnectionPropertiesFileGenerator.java @@ -14,8 +14,9 @@ * limitations under the License. */ -package com.google.cloud.spanner.connection; +package com.google.cloud.spanner.jdbc; +import com.google.cloud.spanner.connection.ConnectionProperty; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; diff --git a/src/test/java/com/google/cloud/spanner/jdbc/DdlMockServerTest.java b/src/test/java/com/google/cloud/spanner/jdbc/DdlMockServerTest.java index 7bca2369a..0646a73bc 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/DdlMockServerTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/DdlMockServerTest.java @@ -62,7 +62,7 @@ public void testGetDatabaseDdl() throws SQLException { mockDatabaseAdmin.addResponse( GetDatabaseDdlResponse.newBuilder().addAllStatements(expectedDdl).build()); - try (Connection connection = createConnection(/* autoCommit = */ true)) { + try (Connection connection = createConnection(/* autoCommit= */ true)) { CloudSpannerJdbcConnection spannerJdbcConnection = connection.unwrap(CloudSpannerJdbcConnection.class); List ddl = @@ -85,7 +85,7 @@ public void testDdlInAutoCommitIsTrue_succeeds() throws SQLException { .setMetadata(Any.pack(UpdateDatabaseDdlMetadata.getDefaultInstance())) .build()); - try (Connection connection = createConnection(/* autoCommit = */ true)) { + try (Connection connection = createConnection(/* autoCommit= */ true)) { assertFalse( connection.createStatement().execute("create table foo (id int64) primary key (id)")); } @@ -100,7 +100,7 @@ public void testDdlInAutoCommitIsFalse_succeedsWithNoActiveTransaction() throws .setMetadata(Any.pack(UpdateDatabaseDdlMetadata.getDefaultInstance())) .build()); - try (Connection connection = createConnection(/* autoCommit = */ false)) { + try (Connection connection = createConnection(/* autoCommit= */ false)) { assertFalse( connection.createStatement().execute("create table foo (id int64) primary key (id)")); } @@ -111,7 +111,7 @@ public void testDdlInAutoCommitIsFalse_failsWithActiveTransaction() throws SQLEx mockSpanner.putStatementResult( StatementResult.update(Statement.of("update foo set bar=1 where true"), 1L)); - try (Connection connection = createConnection(/* autoCommit = */ false)) { + try (Connection connection = createConnection(/* autoCommit= */ false)) { assertFalse(connection.createStatement().execute("update foo set bar=1 where true")); SQLException exception = assertThrows( diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcConnectionTest.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcConnectionTest.java index d4cfeb8d0..69bb4fba8 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcConnectionTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcConnectionTest.java @@ -192,7 +192,10 @@ public void testRollback() throws SQLException { @Test public void testClosedJdbcConnection() - throws SQLException, NoSuchMethodException, SecurityException, IllegalAccessException, + throws SQLException, + NoSuchMethodException, + SecurityException, + IllegalAccessException, IllegalArgumentException { testClosed(Connection.class, "getCatalog"); testClosed(Connection.class, "getWarnings"); @@ -328,14 +331,20 @@ public void testClosedJdbcConnection() } private void testClosed(Class clazz, String name) - throws NoSuchMethodException, SecurityException, SQLException, IllegalAccessException, + throws NoSuchMethodException, + SecurityException, + SQLException, + IllegalAccessException, IllegalArgumentException { testClosed(clazz, name, null, null); } private void testClosed( Class clazz, String name, Class[] paramTypes, Object[] args) - throws NoSuchMethodException, SecurityException, SQLException, IllegalAccessException, + throws NoSuchMethodException, + SecurityException, + SQLException, + IllegalAccessException, IllegalArgumentException { Method method = clazz.getDeclaredMethod(name, paramTypes); testInvokeMethodOnClosedConnection(method, args); diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java index 494233faf..9ae33fa6f 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDriverTest.java @@ -26,7 +26,6 @@ import com.google.cloud.ServiceOptions; import com.google.cloud.spanner.MockSpannerServiceImpl; -import com.google.cloud.spanner.connection.ConnectionPropertiesHelper; import com.google.cloud.spanner.connection.SpannerPool; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcSqlScriptVerifier.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcSqlScriptVerifier.java index 51e121337..10a9327b4 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcSqlScriptVerifier.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcSqlScriptVerifier.java @@ -119,6 +119,7 @@ protected Object getFirstValue() throws Exception { public static class JdbcGenericConnection extends GenericConnection { private final CloudSpannerJdbcConnection connection; + /** * Use this to strip comments from a statement before the statement is executed. This should * only be used when the connection is used in a unit test with a mocked underlying connection. diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcConnectTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcConnectTest.java index 17bd65785..b42e81e5e 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcConnectTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITJdbcConnectTest.java @@ -27,8 +27,9 @@ import com.google.cloud.spanner.jdbc.CloudSpannerJdbcConnection; import com.google.cloud.spanner.jdbc.JdbcDataSource; import com.google.cloud.spanner.testing.EmulatorSpannerHelper; -import java.io.FileInputStream; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; @@ -229,7 +230,7 @@ public void testConnectWithDataSourceWithConflictingValues() throws SQLException public void testConnectWithOAuthToken() throws Exception { GoogleCredentials credentials; if (hasValidKeyFile()) { - credentials = GoogleCredentials.fromStream(new FileInputStream(getKeyFile())); + credentials = GoogleCredentials.fromStream(Files.newInputStream(Paths.get(getKeyFile()))); } else { try { credentials = GoogleCredentials.getApplicationDefault(); diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/ITProtoColumnsTest.java b/src/test/java/com/google/cloud/spanner/jdbc/it/ITProtoColumnsTest.java index aa09aea6e..74a381834 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/it/ITProtoColumnsTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/it/ITProtoColumnsTest.java @@ -16,6 +16,8 @@ package com.google.cloud.spanner.jdbc.it; +import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.SPANNER_EMULATOR_HOST; +import static com.google.cloud.spanner.testing.EmulatorSpannerHelper.isUsingEmulator; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -34,7 +36,6 @@ import com.google.cloud.spanner.jdbc.ProtoMessageType; import com.google.cloud.spanner.jdbc.it.SingerProto.Genre; import com.google.cloud.spanner.jdbc.it.SingerProto.SingerInfo; -import com.google.cloud.spanner.testing.EmulatorSpannerHelper; import com.google.cloud.spanner.testing.RemoteSpannerHelper; import java.io.InputStream; import java.sql.Connection; @@ -68,8 +69,6 @@ public static boolean isUsingGraalVm() { @BeforeClass public static void setup() throws Exception { - assumeFalse( - "Proto columns is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); assumeFalse("Skipping tests on GraalVM", isUsingGraalVm()); RemoteSpannerHelper testHelper = env.getTestHelper(); final String projectId = testHelper.getInstanceId().getProject(); @@ -87,7 +86,12 @@ public static void setup() throws Exception { .setDialect(Dialect.GOOGLE_STANDARD_SQL) .setProtoDescriptors(in) .build(); - final String host = SpannerTestHost.getHost(); + final String host; + if (isUsingEmulator()) { + host = System.getenv(SPANNER_EMULATOR_HOST); + } else { + host = SpannerTestHost.getHost(); + } database = databaseAdminClient @@ -109,6 +113,9 @@ public static void setup() throws Exception { in.close(); url = "jdbc:cloudspanner://" + host + "/" + database.getId(); + if (isUsingEmulator()) { + url += "?autoConfigEmulator=true"; + } } @AfterClass @@ -121,8 +128,6 @@ public static void teardown() { @Test public void testNonNullElements() throws Exception { - assumeFalse( - "Proto columns is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); assumeFalse("Skipping tests on GraalVM", isUsingGraalVm()); SingerInfo singerInfo = SingerInfo.newBuilder() @@ -166,8 +171,6 @@ public void testNonNullElements() throws Exception { @Test public void testNullElements() throws Exception { - assumeFalse( - "Proto columns is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); assumeFalse("Skipping tests on GraalVM", isUsingGraalVm()); try (Connection connection = DriverManager.getConnection(url); PreparedStatement ps = @@ -201,8 +204,6 @@ public void testNullElements() throws Exception { @Test public void testUntypedNullElements() throws Exception { - assumeFalse( - "Proto columns is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); assumeFalse("Skipping tests on GraalVM", isUsingGraalVm()); try (Connection connection = DriverManager.getConnection(url); PreparedStatement ps = @@ -231,8 +232,6 @@ public void testUntypedNullElements() throws Exception { @Test public void testInterCompatibility() throws Exception { - assumeFalse( - "Proto columns is not supported in the emulator", EmulatorSpannerHelper.isUsingEmulator()); assumeFalse("Skipping tests on GraalVM", isUsingGraalVm()); SingerInfo singerInfo = SingerInfo.newBuilder() diff --git a/src/test/java/com/google/cloud/spanner/jdbc/it/SingerProto.java b/src/test/java/com/google/cloud/spanner/jdbc/it/SingerProto.java index 00e44bb30..2a93d1c98 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/it/SingerProto.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/it/SingerProto.java @@ -28,6 +28,7 @@ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLi public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) { registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry); } + /** Protobuf enum {@code examples.spanner.music.Genre} */ public enum Genre implements com.google.protobuf.ProtocolMessageEnum { /** POP = 0; */ @@ -43,10 +44,13 @@ public enum Genre implements com.google.protobuf.ProtocolMessageEnum { /** POP = 0; */ public static final int POP_VALUE = 0; + /** JAZZ = 1; */ public static final int JAZZ_VALUE = 1; + /** FOLK = 2; */ public static final int FOLK_VALUE = 2; + /** ROCK = 3; */ public static final int ROCK_VALUE = 3; @@ -144,6 +148,7 @@ public interface SingerInfoOrBuilder * @return Whether the singerId field is set. */ boolean hasSingerId(); + /** * optional int64 singer_id = 1; * @@ -157,12 +162,14 @@ public interface SingerInfoOrBuilder * @return Whether the birthDate field is set. */ boolean hasBirthDate(); + /** * optional string birth_date = 2; * * @return The birthDate. */ String getBirthDate(); + /** * optional string birth_date = 2; * @@ -176,12 +183,14 @@ public interface SingerInfoOrBuilder * @return Whether the nationality field is set. */ boolean hasNationality(); + /** * optional string nationality = 3; * * @return The nationality. */ String getNationality(); + /** * optional string nationality = 3; * @@ -195,12 +204,14 @@ public interface SingerInfoOrBuilder * @return Whether the genre field is set. */ boolean hasGenre(); + /** * optional .examples.spanner.music.Genre genre = 4; * * @return The enum numeric value on the wire for genre. */ int getGenreValue(); + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -208,12 +219,14 @@ public interface SingerInfoOrBuilder */ Genre getGenre(); } + /** Protobuf type {@code examples.spanner.music.SingerInfo} */ public static final class SingerInfo extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:examples.spanner.music.SingerInfo) SingerInfoOrBuilder { private static final long serialVersionUID = 0L; + // Use SingerInfo.newBuilder() to construct. private SingerInfo(com.google.protobuf.GeneratedMessageV3.Builder builder) { super(builder); @@ -244,6 +257,7 @@ protected FieldAccessorTable internalGetFieldAccessorTable() { private int bitField0_; public static final int SINGER_ID_FIELD_NUMBER = 1; private long singerId_ = 0L; + /** * optional int64 singer_id = 1; * @@ -253,6 +267,7 @@ protected FieldAccessorTable internalGetFieldAccessorTable() { public boolean hasSingerId() { return ((bitField0_ & 0x00000001) != 0); } + /** * optional int64 singer_id = 1; * @@ -267,6 +282,7 @@ public long getSingerId() { @SuppressWarnings("serial") private volatile Object birthDate_ = ""; + /** * optional string birth_date = 2; * @@ -276,6 +292,7 @@ public long getSingerId() { public boolean hasBirthDate() { return ((bitField0_ & 0x00000002) != 0); } + /** * optional string birth_date = 2; * @@ -293,6 +310,7 @@ public String getBirthDate() { return s; } } + /** * optional string birth_date = 2; * @@ -315,6 +333,7 @@ public com.google.protobuf.ByteString getBirthDateBytes() { @SuppressWarnings("serial") private volatile Object nationality_ = ""; + /** * optional string nationality = 3; * @@ -324,6 +343,7 @@ public com.google.protobuf.ByteString getBirthDateBytes() { public boolean hasNationality() { return ((bitField0_ & 0x00000004) != 0); } + /** * optional string nationality = 3; * @@ -341,6 +361,7 @@ public String getNationality() { return s; } } + /** * optional string nationality = 3; * @@ -361,6 +382,7 @@ public com.google.protobuf.ByteString getNationalityBytes() { public static final int GENRE_FIELD_NUMBER = 4; private int genre_ = 0; + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -370,6 +392,7 @@ public com.google.protobuf.ByteString getNationalityBytes() { public boolean hasGenre() { return ((bitField0_ & 0x00000008) != 0); } + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -379,6 +402,7 @@ public boolean hasGenre() { public int getGenreValue() { return genre_; } + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -593,6 +617,7 @@ protected Builder newBuilderForType(BuilderParent parent) { Builder builder = new Builder(parent); return builder; } + /** Protobuf type {@code examples.spanner.music.SingerInfo} */ public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder @@ -808,6 +833,7 @@ public Builder mergeFrom( private int bitField0_; private long singerId_; + /** * optional int64 singer_id = 1; * @@ -817,6 +843,7 @@ public Builder mergeFrom( public boolean hasSingerId() { return ((bitField0_ & 0x00000001) != 0); } + /** * optional int64 singer_id = 1; * @@ -826,6 +853,7 @@ public boolean hasSingerId() { public long getSingerId() { return singerId_; } + /** * optional int64 singer_id = 1; * @@ -839,6 +867,7 @@ public Builder setSingerId(long value) { onChanged(); return this; } + /** * optional int64 singer_id = 1; * @@ -852,6 +881,7 @@ public Builder clearSingerId() { } private Object birthDate_ = ""; + /** * optional string birth_date = 2; * @@ -860,6 +890,7 @@ public Builder clearSingerId() { public boolean hasBirthDate() { return ((bitField0_ & 0x00000002) != 0); } + /** * optional string birth_date = 2; * @@ -876,6 +907,7 @@ public String getBirthDate() { return (String) ref; } } + /** * optional string birth_date = 2; * @@ -892,6 +924,7 @@ public com.google.protobuf.ByteString getBirthDateBytes() { return (com.google.protobuf.ByteString) ref; } } + /** * optional string birth_date = 2; * @@ -907,6 +940,7 @@ public Builder setBirthDate(String value) { onChanged(); return this; } + /** * optional string birth_date = 2; * @@ -918,6 +952,7 @@ public Builder clearBirthDate() { onChanged(); return this; } + /** * optional string birth_date = 2; * @@ -936,6 +971,7 @@ public Builder setBirthDateBytes(com.google.protobuf.ByteString value) { } private Object nationality_ = ""; + /** * optional string nationality = 3; * @@ -944,6 +980,7 @@ public Builder setBirthDateBytes(com.google.protobuf.ByteString value) { public boolean hasNationality() { return ((bitField0_ & 0x00000004) != 0); } + /** * optional string nationality = 3; * @@ -960,6 +997,7 @@ public String getNationality() { return (String) ref; } } + /** * optional string nationality = 3; * @@ -976,6 +1014,7 @@ public com.google.protobuf.ByteString getNationalityBytes() { return (com.google.protobuf.ByteString) ref; } } + /** * optional string nationality = 3; * @@ -991,6 +1030,7 @@ public Builder setNationality(String value) { onChanged(); return this; } + /** * optional string nationality = 3; * @@ -1002,6 +1042,7 @@ public Builder clearNationality() { onChanged(); return this; } + /** * optional string nationality = 3; * @@ -1020,6 +1061,7 @@ public Builder setNationalityBytes(com.google.protobuf.ByteString value) { } private int genre_ = 0; + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -1029,6 +1071,7 @@ public Builder setNationalityBytes(com.google.protobuf.ByteString value) { public boolean hasGenre() { return ((bitField0_ & 0x00000008) != 0); } + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -1038,6 +1081,7 @@ public boolean hasGenre() { public int getGenreValue() { return genre_; } + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -1050,6 +1094,7 @@ public Builder setGenreValue(int value) { onChanged(); return this; } + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -1060,6 +1105,7 @@ public Genre getGenre() { Genre result = Genre.forNumber(genre_); return result == null ? Genre.UNRECOGNIZED : result; } + /** * optional .examples.spanner.music.Genre genre = 4; * @@ -1075,6 +1121,7 @@ public Builder setGenre(Genre value) { onChanged(); return this; } + /** * optional .examples.spanner.music.Genre genre = 4; * diff --git a/versions.txt b/versions.txt index caed65942..d2ed8e8c6 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -google-cloud-spanner-jdbc:2.30.1:2.30.1 +google-cloud-spanner-jdbc:2.30.2:2.30.2