list = new ArrayList<>(listValue.getValuesCount());
- for (com.google.protobuf.Value value : listValue.getValuesList()) {
- if (value.getKindCase() == KindCase.NULL_VALUE) {
- list.add(null);
- } else {
- ListValue structValue = value.getListValue();
- list.add(decodeStructValue(elementType, structValue));
- }
- }
- return list;
- }
+ return Lists.transform(
+ listValue.getValuesList(), input -> decodeValue(elementType, input));
default:
throw new AssertionError("Unhandled type code: " + elementType.getCode());
}
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Session.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Session.java
index 697521554e9..d322e0fb6d0 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Session.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/Session.java
@@ -28,10 +28,9 @@
* read-write/write-only transactions, create multiple sessions. Note that standalone reads and
* queries use a transaction internally, and count toward the one transaction limit.
*
- * Cloud Spanner limits the number of sessions that can exist at any given time; thus, it is a
- * good idea to delete idle and/or unneeded sessions. Aside from explicit deletes, Cloud Spanner can
- * delete sessions for which no operations are sent for more than an hour, or due to internal
- * errors. If a session is deleted, requests to it return {@link ErrorCode#NOT_FOUND}.
+ *
It is a good idea to delete idle and/or unneeded sessions. Aside from explicit deletes, Cloud
+ * Spanner can delete sessions for which no operations are sent for more than an hour, or due to
+ * internal errors. If a session is deleted, requests to it return {@link ErrorCode#NOT_FOUND}.
*
*
Idle sessions can be kept alive by sending a trivial SQL query periodically, for example,
* {@code SELECT 1}.
diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/StructReader.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/StructReader.java
index a96c95cb953..b767bd6d82c 100644
--- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/StructReader.java
+++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/StructReader.java
@@ -178,10 +178,18 @@ default Value getValue(String columnName) {
*/
boolean[] getBooleanArray(String columnName);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.bool())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.bool())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getBooleanList(int columnIndex);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.bool())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.bool())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getBooleanList(String columnName);
/**
@@ -200,10 +208,18 @@ default Value getValue(String columnName) {
*/
long[] getLongArray(String columnName);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.int64())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.int64())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getLongList(int columnIndex);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.int64())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.int64())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getLongList(String columnName);
/**
@@ -223,84 +239,136 @@ default Value getValue(String columnName) {
double[] getDoubleArray(String columnName);
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.float64())}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.float64())} The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
*/
List getDoubleList(int columnIndex);
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.float64())}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.float64())} The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
*/
List getDoubleList(String columnName);
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.numeric())}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.numeric())} The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
*/
List getBigDecimalList(int columnIndex);
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.numeric())}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.numeric())} The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
*/
List getBigDecimalList(String columnName);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.string())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.string())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getStringList(int columnIndex);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.string())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.string())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getStringList(String columnName);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.json())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.json())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
default List getJsonList(int columnIndex) {
throw new UnsupportedOperationException("method should be overwritten");
};
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.json())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.json())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
default List getJsonList(String columnName) {
throw new UnsupportedOperationException("method should be overwritten");
};
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.pgJsonb())}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.pgJsonb())} The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
*/
default List getPgJsonbList(int columnIndex) {
throw new UnsupportedOperationException("method should be overwritten");
};
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.pgJsonb())}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.pgJsonb())} The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
*/
default List getPgJsonbList(String columnName) {
throw new UnsupportedOperationException("method should be overwritten");
};
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.bytes())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.bytes())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getBytesList(int columnIndex);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.bytes())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.bytes())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getBytesList(String columnName);
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.timestamp())}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.timestamp())}
+ * The list returned by this method is lazily constructed. Create a copy of it if you intend to
+ * access each element in the list multiple times.
*/
List getTimestampList(int columnIndex);
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.timestamp())}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.timestamp())}
+ * The list returned by this method is lazily constructed. Create a copy of it if you intend to
+ * access each element in the list multiple times.
*/
List getTimestampList(String columnName);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.date())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.date())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getDateList(int columnIndex);
- /** Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.date())}. */
+ /**
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.date())}. The
+ * list returned by this method is lazily constructed. Create a copy of it if you intend to access
+ * each element in the list multiple times.
+ */
List getDateList(String columnName);
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.struct(...))}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.struct(...))}
+ * The list returned by this method is lazily constructed. Create a copy of it if you intend to
+ * access each element in the list multiple times.
*/
List getStructList(int columnIndex);
/**
- * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.struct(...))}.
+ * Returns the value of a non-{@code NULL} column with type {@code Type.array(Type.struct(...))}
+ * The list returned by this method is lazily constructed. Create a copy of it if you intend to
+ * access each element in the list multiple times.
*/
List getStructList(String columnName);
}
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/GceTestEnvConfig.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/GceTestEnvConfig.java
index ab8e3933f9f..7a27123bdc3 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/GceTestEnvConfig.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/GceTestEnvConfig.java
@@ -53,7 +53,7 @@ public class GceTestEnvConfig implements TestEnvConfig {
public static final String DP_IPV6_PREFIX = "2001:4860:8040";
public static final String DP_IPV4_PREFIX = "34.126";
- private static final String DIRECT_PATH_ENDPOINT = "aa423245250f2bbf.sandbox.googleapis.com:443";
+ private static final String DIRECT_PATH_ENDPOINT = "wrenchworks-nonprod.googleapis.com:443";
private final SpannerOptions options;
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
index 340f999d8ee..29ab79450b5 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/MockSpannerServiceImpl.java
@@ -1289,7 +1289,11 @@ private Statement buildStatement(
builder.bind(fieldName).toTimestampArray(null);
break;
case JSON:
- builder.bind(fieldName).toJsonArray(null);
+ if (elementType.getTypeAnnotation() == TypeAnnotationCode.PG_JSONB) {
+ builder.bind(fieldName).toPgJsonbArray(null);
+ } else {
+ builder.bind(fieldName).toJsonArray(null);
+ }
break;
case STRUCT:
case TYPE_CODE_UNSPECIFIED:
@@ -1331,7 +1335,11 @@ private Statement buildStatement(
builder.bind(fieldName).to((com.google.cloud.Timestamp) null);
break;
case JSON:
- builder.bind(fieldName).to(Value.json(null));
+ if (fieldType.getTypeAnnotation() == TypeAnnotationCode.PG_JSONB) {
+ builder.bind(fieldName).to(Value.pgJsonb(null));
+ } else {
+ builder.bind(fieldName).to(Value.json(null));
+ }
break;
case TYPE_CODE_UNSPECIFIED:
case UNRECOGNIZED:
@@ -1416,12 +1424,21 @@ private Statement buildStatement(
com.google.cloud.spanner.Type.timestamp(), value.getListValue()));
break;
case JSON:
- builder
- .bind(fieldName)
- .toJsonArray(
- (Iterable)
- GrpcStruct.decodeArrayValue(
- com.google.cloud.spanner.Type.json(), value.getListValue()));
+ if (elementType.getTypeAnnotation() == TypeAnnotationCode.PG_JSONB) {
+ builder
+ .bind(fieldName)
+ .toPgJsonbArray(
+ (Iterable)
+ GrpcStruct.decodeArrayValue(
+ com.google.cloud.spanner.Type.pgJsonb(), value.getListValue()));
+ } else {
+ builder
+ .bind(fieldName)
+ .toJsonArray(
+ (Iterable)
+ GrpcStruct.decodeArrayValue(
+ com.google.cloud.spanner.Type.json(), value.getListValue()));
+ }
break;
case STRUCT:
case TYPE_CODE_UNSPECIFIED:
@@ -1464,7 +1481,11 @@ private Statement buildStatement(
.to(com.google.cloud.Timestamp.parseTimestamp(value.getStringValue()));
break;
case JSON:
- builder.bind(fieldName).to(Value.json(value.getStringValue()));
+ if (fieldType.getTypeAnnotation() == TypeAnnotationCode.PG_JSONB) {
+ builder.bind(fieldName).to(Value.pgJsonb(value.getStringValue()));
+ } else {
+ builder.bind(fieldName).to(Value.json(value.getStringValue()));
+ }
break;
case TYPE_CODE_UNSPECIFIED:
case UNRECOGNIZED:
diff --git a/grpc-google-cloud-spanner-admin-database-v1/pom.xml b/grpc-google-cloud-spanner-admin-database-v1/pom.xml
index 2f66ddb18fb..291ea157c3a 100644
--- a/grpc-google-cloud-spanner-admin-database-v1/pom.xml
+++ b/grpc-google-cloud-spanner-admin-database-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-cloud-spanner-admin-database-v1
- 6.33.0
+ 6.34.0
grpc-google-cloud-spanner-admin-database-v1
GRPC library for grpc-google-cloud-spanner-admin-database-v1
com.google.cloud
google-cloud-spanner-parent
- 6.33.0
+ 6.34.0
diff --git a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml
index 9163309605b..fae6478c7a8 100644
--- a/grpc-google-cloud-spanner-admin-instance-v1/pom.xml
+++ b/grpc-google-cloud-spanner-admin-instance-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-cloud-spanner-admin-instance-v1
- 6.33.0
+ 6.34.0
grpc-google-cloud-spanner-admin-instance-v1
GRPC library for grpc-google-cloud-spanner-admin-instance-v1
com.google.cloud
google-cloud-spanner-parent
- 6.33.0
+ 6.34.0
diff --git a/grpc-google-cloud-spanner-v1/pom.xml b/grpc-google-cloud-spanner-v1/pom.xml
index fe0f0837d2d..b898649cf39 100644
--- a/grpc-google-cloud-spanner-v1/pom.xml
+++ b/grpc-google-cloud-spanner-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-cloud-spanner-v1
- 6.33.0
+ 6.34.0
grpc-google-cloud-spanner-v1
GRPC library for grpc-google-cloud-spanner-v1
com.google.cloud
google-cloud-spanner-parent
- 6.33.0
+ 6.34.0
diff --git a/pom.xml b/pom.xml
index 74134a3e62a..652d8d9fd44 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-spanner-parent
pom
- 6.33.0
+ 6.34.0
Google Cloud Spanner Parent
https://github.com/googleapis/java-spanner
@@ -62,37 +62,37 @@
com.google.api.grpc
proto-google-cloud-spanner-admin-instance-v1
- 6.33.0
+ 6.34.0
com.google.api.grpc
proto-google-cloud-spanner-v1
- 6.33.0
+ 6.34.0
com.google.api.grpc
proto-google-cloud-spanner-admin-database-v1
- 6.33.0
+ 6.34.0
com.google.api.grpc
grpc-google-cloud-spanner-v1
- 6.33.0
+ 6.34.0
com.google.api.grpc
grpc-google-cloud-spanner-admin-instance-v1
- 6.33.0
+ 6.34.0
com.google.api.grpc
grpc-google-cloud-spanner-admin-database-v1
- 6.33.0
+ 6.34.0
com.google.cloud
google-cloud-spanner
- 6.33.0
+ 6.34.0
diff --git a/proto-google-cloud-spanner-admin-database-v1/pom.xml b/proto-google-cloud-spanner-admin-database-v1/pom.xml
index b6d688336b7..fa7c95abd5f 100644
--- a/proto-google-cloud-spanner-admin-database-v1/pom.xml
+++ b/proto-google-cloud-spanner-admin-database-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-spanner-admin-database-v1
- 6.33.0
+ 6.34.0
proto-google-cloud-spanner-admin-database-v1
PROTO library for proto-google-cloud-spanner-admin-database-v1
com.google.cloud
google-cloud-spanner-parent
- 6.33.0
+ 6.34.0
diff --git a/proto-google-cloud-spanner-admin-instance-v1/pom.xml b/proto-google-cloud-spanner-admin-instance-v1/pom.xml
index e615a5a5366..fd5ab4f350d 100644
--- a/proto-google-cloud-spanner-admin-instance-v1/pom.xml
+++ b/proto-google-cloud-spanner-admin-instance-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-spanner-admin-instance-v1
- 6.33.0
+ 6.34.0
proto-google-cloud-spanner-admin-instance-v1
PROTO library for proto-google-cloud-spanner-admin-instance-v1
com.google.cloud
google-cloud-spanner-parent
- 6.33.0
+ 6.34.0
diff --git a/proto-google-cloud-spanner-v1/pom.xml b/proto-google-cloud-spanner-v1/pom.xml
index 9f44563ec73..28743a2a639 100644
--- a/proto-google-cloud-spanner-v1/pom.xml
+++ b/proto-google-cloud-spanner-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-spanner-v1
- 6.33.0
+ 6.34.0
proto-google-cloud-spanner-v1
PROTO library for proto-google-cloud-spanner-v1
com.google.cloud
google-cloud-spanner-parent
- 6.33.0
+ 6.34.0
diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml
index 6fe651c6e93..6c96e112de5 100644
--- a/samples/install-without-bom/pom.xml
+++ b/samples/install-without-bom/pom.xml
@@ -32,7 +32,7 @@
com.google.cloud
google-cloud-spanner
- 6.32.0
+ 6.33.0
diff --git a/samples/native-image/pom.xml b/samples/native-image/pom.xml
index 0391300694f..f134552ae5a 100644
--- a/samples/native-image/pom.xml
+++ b/samples/native-image/pom.xml
@@ -28,7 +28,7 @@
com.google.cloud
libraries-bom
- 26.1.4
+ 26.1.5
pom
import
@@ -109,7 +109,7 @@
org.graalvm.buildtools
junit-platform-native
- 0.9.17
+ 0.9.18
test
@@ -130,7 +130,7 @@
org.graalvm.buildtools
native-maven-plugin
- 0.9.16
+ 0.9.18
true
com.example.spanner.NativeImageSpannerSample
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 554bafaed14..e4844a745b1 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -31,7 +31,7 @@
com.google.cloud
google-cloud-spanner
- 6.33.0
+ 6.34.0
diff --git a/samples/snippets/assembly-descriptor.xml b/samples/snippets/assembly-descriptor.xml
deleted file mode 100644
index 8a9e7f8f500..00000000000
--- a/samples/snippets/assembly-descriptor.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
- jar-with-dependencies
-
- jar
-
- false
-
-
- /
- false
- true
-
-
- io.grpc.LoadBalancerProvider
-
-
-
-
-
-
- ${project.build.outputDirectory}
- .
-
-
-
diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml
index 39061fea820..79b88560263 100644
--- a/samples/snippets/pom.xml
+++ b/samples/snippets/pom.xml
@@ -33,7 +33,7 @@
com.google.cloud
libraries-bom
- 26.1.4
+ 26.1.5
pom
import
@@ -115,30 +115,61 @@
- spanner-google-cloud-samples
- maven-assembly-plugin
- 3.4.2
+ maven-resources-plugin
+
+
+ copy-resources
+ validate
+
+ copy-resources
+
+
+ ${project.build.directory}/spanner-snippets
+
+
+ resources
+ true
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/spanner-snippets/lib
+ false
+ false
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
-
- assembly-descriptor.xml
-
+ spanner-snippets/spanner-google-cloud-samples
+ false
com.example.spanner.SpannerSample
+ true
+ lib/
-
-
- make-assembly
- package
-
- single
-
-
-
org.apache.maven.plugins
diff --git a/versions.txt b/versions.txt
index 038bb96ac5b..6dc1e7ccffd 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
# Format:
# module:released-version:current-version
-proto-google-cloud-spanner-admin-instance-v1:6.33.0:6.33.0
-proto-google-cloud-spanner-v1:6.33.0:6.33.0
-proto-google-cloud-spanner-admin-database-v1:6.33.0:6.33.0
-grpc-google-cloud-spanner-v1:6.33.0:6.33.0
-grpc-google-cloud-spanner-admin-instance-v1:6.33.0:6.33.0
-grpc-google-cloud-spanner-admin-database-v1:6.33.0:6.33.0
-google-cloud-spanner:6.33.0:6.33.0
+proto-google-cloud-spanner-admin-instance-v1:6.34.0:6.34.0
+proto-google-cloud-spanner-v1:6.34.0:6.34.0
+proto-google-cloud-spanner-admin-database-v1:6.34.0:6.34.0
+grpc-google-cloud-spanner-v1:6.34.0:6.34.0
+grpc-google-cloud-spanner-admin-instance-v1:6.34.0:6.34.0
+grpc-google-cloud-spanner-admin-database-v1:6.34.0:6.34.0
+google-cloud-spanner:6.34.0:6.34.0