diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index 2cf303dc3..c4ee2b91a 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.52.3 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.53.0 with: bom-path: pom.xml diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg index 85695810d..0cf782fcc 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.52.3" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.53.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native-b.cfg b/.kokoro/presubmit/graalvm-native-b.cfg index c2efdcebf..15deac1d1 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.52.3" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.53.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native-c.cfg b/.kokoro/presubmit/graalvm-native-c.cfg index 20946e7b0..928626c44 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.52.3" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.53.0" } env_vars: { diff --git a/CHANGELOG.md b/CHANGELOG.md index d5fe61cbd..4129da1b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [2.33.2](https://github.com/googleapis/java-spanner-jdbc/compare/v2.33.1...v2.33.2) (2025-10-24) + + +### Bug Fixes + +* FindColumn is case-sensitive for unquoted identifier ([#2261](https://github.com/googleapis/java-spanner-jdbc/issues/2261)) ([71441f7](https://github.com/googleapis/java-spanner-jdbc/commit/71441f7e896d5a60c1e6bac9b9a991a9d18fbe3c)) + + +### Dependencies + +* Update dependency com.google.api.grpc:proto-google-cloud-trace-v1 to v2.78.0 ([#2252](https://github.com/googleapis/java-spanner-jdbc/issues/2252)) ([37ea3f0](https://github.com/googleapis/java-spanner-jdbc/commit/37ea3f0652462470b76a5d68f54b543b8afa8a97)) +* Update dependency com.google.cloud:google-cloud-spanner to v6.102.1 ([0d335a9](https://github.com/googleapis/java-spanner-jdbc/commit/0d335a932b8a035b90c866a8b3639d225fa329b0)) +* Update dependency com.google.cloud:google-cloud-trace to v2.78.0 ([#2253](https://github.com/googleapis/java-spanner-jdbc/issues/2253)) ([e51eaeb](https://github.com/googleapis/java-spanner-jdbc/commit/e51eaeb401a55161474c2848af51446e7669dca0)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.53.0 ([0d335a9](https://github.com/googleapis/java-spanner-jdbc/commit/0d335a932b8a035b90c866a8b3639d225fa329b0)) +* Update dependency io.opentelemetry:opentelemetry-bom to v1.55.0 ([#2251](https://github.com/googleapis/java-spanner-jdbc/issues/2251)) ([14e9ea6](https://github.com/googleapis/java-spanner-jdbc/commit/14e9ea6b9356eb59cd42a14bea4af3ca102a5cf1)) +* Update dependency org.springframework.boot:spring-boot to v3.5.7 ([#2263](https://github.com/googleapis/java-spanner-jdbc/issues/2263)) ([0a916b9](https://github.com/googleapis/java-spanner-jdbc/commit/0a916b97925b0651a8cbc69e546bf6539fc39b27)) +* Update dependency org.springframework.boot:spring-boot-starter-data-jdbc to v3.5.7 ([#2264](https://github.com/googleapis/java-spanner-jdbc/issues/2264)) ([3f8d0db](https://github.com/googleapis/java-spanner-jdbc/commit/3f8d0db636a6278a3eefd8de0835f776efcbb0e0)) +* Update dependency org.springframework.boot:spring-boot-starter-parent to v3.5.7 ([#2267](https://github.com/googleapis/java-spanner-jdbc/issues/2267)) ([1f79712](https://github.com/googleapis/java-spanner-jdbc/commit/1f79712792587b8827e5546064f61e8e7e0bec11)) +* Update dependency org.springframework.data:spring-data-bom to v2025.0.5 ([#2258](https://github.com/googleapis/java-spanner-jdbc/issues/2258)) ([1054cdd](https://github.com/googleapis/java-spanner-jdbc/commit/1054cddc60b811fe919a8313f433b3490e0f0cfb)) +* Update dependency org.testcontainers:testcontainers to v2 ([#2254](https://github.com/googleapis/java-spanner-jdbc/issues/2254)) ([4058ed5](https://github.com/googleapis/java-spanner-jdbc/commit/4058ed537b4c70d807d589d51410301ea73434be)) +* Update dependency org.testcontainers:testcontainers-bom to v2 ([#2255](https://github.com/googleapis/java-spanner-jdbc/issues/2255)) ([64faa98](https://github.com/googleapis/java-spanner-jdbc/commit/64faa9867b0a6d9535a03fecfcfada6d34687457)) + ## [2.33.1](https://github.com/googleapis/java-spanner-jdbc/compare/v2.33.0...v2.33.1) (2025-10-09) diff --git a/README.md b/README.md index 8fb6a054d..46c4e8d48 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.33.1 + 2.33.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.33.1' +implementation 'com.google.cloud:google-cloud-spanner-jdbc:2.33.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.33.1" +libraryDependencies += "com.google.cloud" % "google-cloud-spanner-jdbc" % "2.33.2" ``` diff --git a/pom.xml b/pom.xml index fcd478ebb..4fa663080 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.33.1 + 2.33.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.52.3 + 3.53.0 @@ -61,7 +61,7 @@ com.google.cloud google-cloud-spanner-bom - 6.102.0 + 6.102.1 pom import @@ -166,7 +166,7 @@ org.testcontainers testcontainers - 1.21.3 + 2.0.1 test @@ -216,13 +216,13 @@ com.google.cloud google-cloud-trace - 2.76.0 + 2.78.0 test com.google.api.grpc proto-google-cloud-trace-v1 - 2.76.0 + 2.78.0 test diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 041fab8ac..55f80e80a 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.33.0 + 2.33.1 diff --git a/samples/quickperf/pom.xml b/samples/quickperf/pom.xml index ca7335c4f..8450000d9 100644 --- a/samples/quickperf/pom.xml +++ b/samples/quickperf/pom.xml @@ -12,7 +12,7 @@ com.google.cloud sdk-platform-java-config - 3.52.3 + 3.53.0 @@ -27,7 +27,7 @@ com.google.cloud libraries-bom - 26.69.0 + 26.70.0 pom import @@ -73,13 +73,13 @@ org.testcontainers testcontainers - 1.21.3 + 2.0.1 test org.springframework.boot spring-boot - 3.5.6 + 3.5.7 test @@ -95,7 +95,7 @@ org.codehaus.mojo exec-maven-plugin - 3.6.1 + 3.6.2 com.google.cloud.jdbc.quickperf.QuickPerf diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 46627619c..55374ef43 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -29,7 +29,7 @@ com.google.cloud google-cloud-spanner-jdbc - 2.33.1 + 2.33.2 diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 07c7ab457..d936ece2e 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -9,7 +9,7 @@ com.google.cloud sdk-platform-java-config - 3.52.3 + 3.53.0 @@ -26,7 +26,7 @@ com.google.cloud libraries-bom - 26.69.0 + 26.70.0 pom import @@ -54,7 +54,7 @@ org.testcontainers testcontainers - 1.21.3 + 2.0.1 test diff --git a/samples/spring-data-jdbc/googlesql/pom.xml b/samples/spring-data-jdbc/googlesql/pom.xml index be86aa508..c9b0390a1 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 - 2025.0.4 + 2025.0.5 import pom com.google.cloud google-cloud-spanner-bom - 6.102.0 + 6.102.1 import pom com.google.cloud libraries-bom - 26.69.0 + 26.70.0 import pom io.opentelemetry opentelemetry-bom - 1.54.1 + 1.55.0 pom import @@ -55,7 +55,7 @@ org.springframework.boot spring-boot-starter-data-jdbc - 3.5.6 + 3.5.7 @@ -90,7 +90,7 @@ org.testcontainers testcontainers - 1.21.3 + 2.0.1 diff --git a/samples/spring-data-jdbc/postgresql/pom.xml b/samples/spring-data-jdbc/postgresql/pom.xml index b7305065b..581e89ec9 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 - 2025.0.4 + 2025.0.5 import pom com.google.cloud google-cloud-spanner-bom - 6.102.0 + 6.102.1 import pom com.google.cloud libraries-bom - 26.69.0 + 26.70.0 import pom io.opentelemetry opentelemetry-bom - 1.54.1 + 1.55.0 pom import @@ -55,7 +55,7 @@ org.springframework.boot spring-boot-starter-data-jdbc - 3.5.6 + 3.5.7 @@ -132,7 +132,7 @@ org.testcontainers testcontainers - 1.21.3 + 2.0.1 test diff --git a/samples/spring-data-mybatis/googlesql/pom.xml b/samples/spring-data-mybatis/googlesql/pom.xml index 0734042ae..1abc6dd0c 100644 --- a/samples/spring-data-mybatis/googlesql/pom.xml +++ b/samples/spring-data-mybatis/googlesql/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.6 + 3.5.7 @@ -28,28 +28,28 @@ org.springframework.data spring-data-bom - 2025.0.4 + 2025.0.5 import pom com.google.cloud google-cloud-spanner-bom - 6.102.0 + 6.102.1 import pom com.google.cloud libraries-bom - 26.69.0 + 26.70.0 import pom org.testcontainers testcontainers-bom - 1.21.3 + 2.0.1 import pom @@ -94,7 +94,7 @@ com.google.cloud google-cloud-spanner - 6.102.0 + 6.102.1 test-jar test diff --git a/samples/spring-data-mybatis/postgresql/pom.xml b/samples/spring-data-mybatis/postgresql/pom.xml index 449634a8a..83ea8608b 100644 --- a/samples/spring-data-mybatis/postgresql/pom.xml +++ b/samples/spring-data-mybatis/postgresql/pom.xml @@ -13,7 +13,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.6 + 3.5.7 @@ -28,21 +28,21 @@ org.springframework.data spring-data-bom - 2025.0.4 + 2025.0.5 import pom com.google.cloud libraries-bom - 26.69.0 + 26.70.0 import pom org.testcontainers testcontainers-bom - 1.21.3 + 2.0.1 import pom diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcArray.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcArray.java index 80bea84eb..1dd83f817 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcArray.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcArray.java @@ -60,9 +60,11 @@ class JdbcArray implements Array { * the elements array is not compatible with the base type of the array. */ static JdbcArray createArray(String typeName, Object[] elements) throws SQLException { - for (JdbcDataType type : JdbcDataType.values()) { - if (type.getTypeName().equalsIgnoreCase(typeName)) { - return new JdbcArray(type, elements); + if (typeName != null) { + for (JdbcDataType type : JdbcDataType.values()) { + if (type.matches(typeName)) { + return new JdbcArray(type, elements); + } } } throw JdbcSqlExceptionFactory.of( diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDataType.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDataType.java index 6a77cecc2..c80db5302 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDataType.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDataType.java @@ -16,6 +16,7 @@ package com.google.cloud.spanner.jdbc; +import com.google.cloud.spanner.Dialect; import com.google.cloud.spanner.ResultSet; import com.google.cloud.spanner.Struct; import com.google.cloud.spanner.Type; @@ -154,6 +155,7 @@ public Type getSpannerType() { }, FLOAT64 { private final Set> classes = new HashSet<>(Arrays.asList(Float.class, Double.class)); + private final Set aliases = new HashSet<>(Collections.singletonList("float8")); @Override public int getSqlType() { @@ -184,6 +186,11 @@ public List getArrayElements(ResultSet rs, int columnIndex) { public Type getSpannerType() { return Type.float64(); } + + @Override + public Set getPostgreSQLAliases() { + return aliases; + } }, INT64 { private final Set> classes = @@ -220,6 +227,9 @@ public Type getSpannerType() { } }, NUMERIC { + + private final Set aliases = new HashSet<>(Collections.singletonList("decimal")); + @Override public int getSqlType() { return Types.NUMERIC; @@ -244,6 +254,11 @@ public List getArrayElements(ResultSet rs, int columnIndex) { public Type getSpannerType() { return Type.numeric(); } + + @Override + public Set getPostgreSQLAliases() { + return aliases; + } }, PG_NUMERIC { @Override @@ -272,6 +287,8 @@ public Type getSpannerType() { } }, STRING { + private final Set aliases = new HashSet<>(Arrays.asList("varchar", "text")); + @Override public int getSqlType() { return Types.NVARCHAR; @@ -296,6 +313,11 @@ public List getArrayElements(ResultSet rs, int columnIndex) { public Type getSpannerType() { return Type.string(); } + + @Override + public Set getPostgreSQLAliases() { + return aliases; + } }, JSON { @Override @@ -498,6 +520,21 @@ public Type getSpannerType() { public abstract Type getSpannerType(); + public Set getPostgreSQLAliases() { + return Collections.emptySet(); + } + + /*** + * @param typeName type of the column + * @return true if type name matches current type name or matches with one of postgres aliases + * or if it matches equivalent postgres type. + */ + boolean matches(String typeName) { + return getTypeName().equalsIgnoreCase(typeName) + || getPostgreSQLAliases().contains(typeName.toLowerCase()) + || getSpannerType().getSpannerTypeName(Dialect.POSTGRESQL).equalsIgnoreCase(typeName); + } + // TODO: Implement and use this method for all types. public int getPrecision() { throw new UnsupportedOperationException(); diff --git a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDatabaseMetaData.java b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDatabaseMetaData.java index 67c6976c7..98d23a226 100644 --- a/src/main/java/com/google/cloud/spanner/jdbc/JdbcDatabaseMetaData.java +++ b/src/main/java/com/google/cloud/spanner/jdbc/JdbcDatabaseMetaData.java @@ -187,7 +187,7 @@ public boolean storesUpperCaseIdentifiers() { @Override public boolean storesLowerCaseIdentifiers() { - return false; + return connection.getDialect() == Dialect.POSTGRESQL; } @Override diff --git a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetColumns.sql b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetColumns.sql index a8260ff13..b0ca39944 100644 --- a/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetColumns.sql +++ b/src/main/resources/com/google/cloud/spanner/jdbc/postgresql/DatabaseMetaData_GetColumns.sql @@ -28,7 +28,15 @@ SELECT TABLE_CATALOG AS "TABLE_CAT", TABLE_SCHEMA AS "TABLE_SCHEM", TABLE_NAME A WHEN DATA_TYPE = 'jsonb' THEN -9 WHEN DATA_TYPE = 'timestamp with time zone' THEN 93 END AS "DATA_TYPE", - DATA_TYPE AS "TYPE_NAME", + CASE + WHEN DATA_TYPE LIKE 'ARRAY' THEN + CASE + WHEN spanner_type LIKE '%[]' THEN + CONCAT('_', REPLACE(spanner_type, '[]', '')) + ELSE spanner_type + END + ELSE DATA_TYPE + END AS "TYPE_NAME", CASE WHEN DATA_TYPE LIKE 'ARRAY' THEN 0 WHEN DATA_TYPE = 'boolean' THEN NULL diff --git a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDatabaseMetaDataTest.java b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDatabaseMetaDataTest.java index d5a429078..4545bb56e 100644 --- a/src/test/java/com/google/cloud/spanner/jdbc/JdbcDatabaseMetaDataTest.java +++ b/src/test/java/com/google/cloud/spanner/jdbc/JdbcDatabaseMetaDataTest.java @@ -61,6 +61,7 @@ public static Object[] data() { @Test public void testTrivialMethods() throws SQLException { JdbcConnection connection = mock(JdbcConnection.class); + when(connection.getDialect()).thenReturn(dialect); DatabaseMetaData meta = new JdbcDatabaseMetaData(connection); assertTrue(meta.allProceduresAreCallable()); assertTrue(meta.allTablesAreSelectable()); @@ -132,7 +133,11 @@ public void testTrivialMethods() throws SQLException { assertTrue(meta.nullPlusNonNullIsNull()); assertFalse(meta.isCatalogAtStart()); assertEquals(connection.isReadOnly(), meta.isReadOnly()); - assertFalse(meta.storesLowerCaseIdentifiers()); + if (dialect == Dialect.POSTGRESQL) { + assertTrue(meta.storesLowerCaseIdentifiers()); + } else { + assertFalse(meta.storesLowerCaseIdentifiers()); + } assertFalse(meta.storesLowerCaseQuotedIdentifiers()); assertTrue(meta.storesMixedCaseIdentifiers()); assertTrue(meta.storesMixedCaseQuotedIdentifiers()); diff --git a/versions.txt b/versions.txt index 515f0d555..09fcf19e3 100644 --- a/versions.txt +++ b/versions.txt @@ -1,4 +1,4 @@ # Format: # module:released-version:current-version -google-cloud-spanner-jdbc:2.33.1:2.33.1 +google-cloud-spanner-jdbc:2.33.2:2.33.2