diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml
index b484ee0606..67e70bd077 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.2
+ uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.52.3
with:
bom-path: google-cloud-bigtable-bom/pom.xml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 61b22d277b..d4cc2a9353 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
# Changelog
+## [2.67.1](https://github.com/googleapis/java-bigtable/compare/v2.67.0...v2.67.1) (2025-10-08)
+
+
+### Dependencies
+
+* Update shared dependencies ([#2686](https://github.com/googleapis/java-bigtable/issues/2686)) ([d7eaa02](https://github.com/googleapis/java-bigtable/commit/d7eaa02d89a63d9f9197d26e430267eff200b126))
+
## [2.67.0](https://github.com/googleapis/java-bigtable/compare/v2.66.0...v2.67.0) (2025-09-24)
diff --git a/README.md b/README.md
index 4732358aba..e00f7b84b6 100644
--- a/README.md
+++ b/README.md
@@ -56,13 +56,13 @@ implementation 'com.google.cloud:google-cloud-bigtable'
If you are using Gradle without BOM, add this to your dependencies:
```Groovy
-implementation 'com.google.cloud:google-cloud-bigtable:2.67.0'
+implementation 'com.google.cloud:google-cloud-bigtable:2.67.1'
```
If you are using SBT, add this to your dependencies:
```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-bigtable" % "2.67.0"
+libraryDependencies += "com.google.cloud" % "google-cloud-bigtable" % "2.67.1"
```
## Authentication
@@ -470,7 +470,7 @@ Java is a registered trademark of Oracle and/or its affiliates.
[kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-bigtable/java11.html
[stability-image]: https://img.shields.io/badge/stability-stable-green
[maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-bigtable.svg
-[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-bigtable/2.67.0
+[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-bigtable/2.67.1
[authentication]: https://github.com/googleapis/google-cloud-java#authentication
[auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes
[predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles
diff --git a/google-cloud-bigtable-bom/pom.xml b/google-cloud-bigtable-bom/pom.xml
index 8325a15a4f..c877dced0b 100644
--- a/google-cloud-bigtable-bom/pom.xml
+++ b/google-cloud-bigtable-bom/pom.xml
@@ -3,12 +3,12 @@
4.0.0
com.google.cloud
google-cloud-bigtable-bom
- 2.67.0
+ 2.67.1
pom
com.google.cloud
sdk-platform-java-config
- 3.52.2
+ 3.52.3
@@ -63,37 +63,37 @@
com.google.cloud
google-cloud-bigtable
- 2.67.0
+ 2.67.1
com.google.cloud
google-cloud-bigtable-emulator
- 0.204.0
+ 0.204.1
com.google.cloud
google-cloud-bigtable-emulator-core
- 0.204.0
+ 0.204.1
com.google.api.grpc
grpc-google-cloud-bigtable-admin-v2
- 2.67.0
+ 2.67.1
com.google.api.grpc
grpc-google-cloud-bigtable-v2
- 2.67.0
+ 2.67.1
com.google.api.grpc
proto-google-cloud-bigtable-admin-v2
- 2.67.0
+ 2.67.1
com.google.api.grpc
proto-google-cloud-bigtable-v2
- 2.67.0
+ 2.67.1
diff --git a/google-cloud-bigtable-deps-bom/pom.xml b/google-cloud-bigtable-deps-bom/pom.xml
index 2da2422484..362af617c9 100644
--- a/google-cloud-bigtable-deps-bom/pom.xml
+++ b/google-cloud-bigtable-deps-bom/pom.xml
@@ -7,13 +7,13 @@
com.google.cloud
sdk-platform-java-config
- 3.52.2
+ 3.52.3
com.google.cloud
google-cloud-bigtable-deps-bom
- 2.67.0
+ 2.67.1
pom
Google Cloud Bigtable Dependency BOM
@@ -68,7 +68,7 @@
com.google.cloud
gapic-libraries-bom
- 1.69.0
+ 1.70.0
pom
import
diff --git a/google-cloud-bigtable-emulator-core/pom.xml b/google-cloud-bigtable-emulator-core/pom.xml
index c8f05a4e33..6d7e40339d 100644
--- a/google-cloud-bigtable-emulator-core/pom.xml
+++ b/google-cloud-bigtable-emulator-core/pom.xml
@@ -7,12 +7,12 @@
google-cloud-bigtable-parent
com.google.cloud
- 2.67.0
+ 2.67.1
Google Cloud Java - Bigtable Emulator Core
google-cloud-bigtable-emulator-core
- 0.204.0
+ 0.204.1
A Java wrapper for the Cloud Bigtable emulator.
diff --git a/google-cloud-bigtable-emulator/pom.xml b/google-cloud-bigtable-emulator/pom.xml
index b6f558afab..47fdaba859 100644
--- a/google-cloud-bigtable-emulator/pom.xml
+++ b/google-cloud-bigtable-emulator/pom.xml
@@ -5,7 +5,7 @@
4.0.0
google-cloud-bigtable-emulator
- 0.204.0
+ 0.204.1
Google Cloud Java - Bigtable Emulator
https://github.com/googleapis/java-bigtable
@@ -14,7 +14,7 @@
com.google.cloud
google-cloud-bigtable-parent
- 2.67.0
+ 2.67.1
scm:git:git@github.com:googleapis/java-bigtable.git
@@ -81,14 +81,14 @@
com.google.cloud
google-cloud-bigtable-deps-bom
- 2.67.0
+ 2.67.1
pom
import
com.google.cloud
google-cloud-bigtable-bom
- 2.67.0
+ 2.67.1
pom
import
@@ -99,7 +99,7 @@
com.google.cloud
google-cloud-bigtable-emulator-core
- 0.204.0
+ 0.204.1
diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml
index 02797097f7..e12ee05dcf 100644
--- a/google-cloud-bigtable/pom.xml
+++ b/google-cloud-bigtable/pom.xml
@@ -2,7 +2,7 @@
4.0.0
google-cloud-bigtable
- 2.67.0
+ 2.67.1
jar
Google Cloud Bigtable
https://github.com/googleapis/java-bigtable
@@ -12,11 +12,11 @@
com.google.cloud
google-cloud-bigtable-parent
- 2.67.0
+ 2.67.1
- 2.67.0
+ 2.67.1
google-cloud-bigtable
@@ -54,14 +54,14 @@
com.google.cloud
google-cloud-bigtable-deps-bom
- 2.67.0
+ 2.67.1
pom
import
com.google.cloud
google-cloud-bigtable-bom
- 2.67.0
+ 2.67.1
pom
import
diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java
index 6d36a55a71..34a12ed901 100644
--- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java
+++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java
@@ -20,6 +20,6 @@
@InternalApi("For internal use only")
public final class Version {
// {x-version-update-start:google-cloud-bigtable:current}
- public static String VERSION = "2.67.0";
+ public static String VERSION = "2.67.1";
// {x-version-update-end}
}
diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/it/BigtableLogicalViewIT.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/it/BigtableLogicalViewIT.java
index d73d68d48f..31aa1b49dd 100644
--- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/it/BigtableLogicalViewIT.java
+++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/it/BigtableLogicalViewIT.java
@@ -35,6 +35,7 @@
import io.grpc.StatusRuntimeException;
import java.util.List;
import java.util.logging.Logger;
+import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
@@ -71,6 +72,13 @@ public void setUp() throws InterruptedException {
testTable = createTestTable(testEnvRule.env().getTableAdminClient());
}
+ @After
+ public void tearDown() throws InterruptedException {
+ if (testTable != null) {
+ testEnvRule.env().getTableAdminClient().deleteTable(testTable.getId());
+ }
+ }
+
@Test
public void createLogicalViewAndGetLogicalViewTest() {
String logicalViewId = prefixGenerator.newPrefix();
diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/it/SampleRowsIT.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/it/SampleRowsIT.java
index 6b71bac5b0..063d0d1f50 100644
--- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/it/SampleRowsIT.java
+++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/it/SampleRowsIT.java
@@ -104,6 +104,8 @@ public void testOnAuthorizedView()
.env()
.getTableAdminClient()
.deleteAuthorizedView(testAuthorizedView.getTableId(), testAuthorizedView.getId());
+
+ testEnvRule.env().getTableAdminClient().deleteTable(testAuthorizedView.getTableId());
}
private static AuthorizedView createPreSplitTableAndAuthorizedView() {
diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/test_helpers/env/TestEnvRule.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/test_helpers/env/TestEnvRule.java
index 47d6b6ddf9..86fc88adff 100644
--- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/test_helpers/env/TestEnvRule.java
+++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/test_helpers/env/TestEnvRule.java
@@ -165,16 +165,20 @@ void cleanUpStale() throws ExecutionException, InterruptedException, IOException
* @param stalePrefix
*/
private void cleanupStaleTables(String stalePrefix) {
+ LOGGER.info("Start cleaning up stale tables with stalePrefix=" + stalePrefix);
for (String tableId : env().getTableAdminClient().listTables()) {
if (!tableId.startsWith(PrefixGenerator.PREFIX)) {
+ LOGGER.info("Skip cleaning up table: " + tableId);
continue;
}
if (stalePrefix.compareTo(tableId) > 0) {
+ LOGGER.info("Preparing stale table for delete: " + tableId);
prepTableForDelete(tableId);
try {
+ LOGGER.info("Deleting stable table: " + tableId);
env().getTableAdminClient().deleteTable(tableId);
- } catch (NotFoundException ignored) {
-
+ } catch (NotFoundException e) {
+ LOGGER.log(Level.WARNING, "Deleting stale table failed: " + tableId, e);
}
}
}
diff --git a/grpc-google-cloud-bigtable-admin-v2/pom.xml b/grpc-google-cloud-bigtable-admin-v2/pom.xml
index 14d55f9fbb..7fec33a803 100644
--- a/grpc-google-cloud-bigtable-admin-v2/pom.xml
+++ b/grpc-google-cloud-bigtable-admin-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-cloud-bigtable-admin-v2
- 2.67.0
+ 2.67.1
grpc-google-cloud-bigtable-admin-v2
GRPC library for grpc-google-cloud-bigtable-admin-v2
com.google.cloud
google-cloud-bigtable-parent
- 2.67.0
+ 2.67.1
@@ -18,14 +18,14 @@
com.google.cloud
google-cloud-bigtable-deps-bom
- 2.67.0
+ 2.67.1
pom
import
com.google.cloud
google-cloud-bigtable-bom
- 2.67.0
+ 2.67.1
pom
import
diff --git a/grpc-google-cloud-bigtable-v2/pom.xml b/grpc-google-cloud-bigtable-v2/pom.xml
index c1f4b85fae..c64370aa83 100644
--- a/grpc-google-cloud-bigtable-v2/pom.xml
+++ b/grpc-google-cloud-bigtable-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-cloud-bigtable-v2
- 2.67.0
+ 2.67.1
grpc-google-cloud-bigtable-v2
GRPC library for grpc-google-cloud-bigtable-v2
com.google.cloud
google-cloud-bigtable-parent
- 2.67.0
+ 2.67.1
@@ -18,14 +18,14 @@
com.google.cloud
google-cloud-bigtable-deps-bom
- 2.67.0
+ 2.67.1
pom
import
com.google.cloud
google-cloud-bigtable-bom
- 2.67.0
+ 2.67.1
pom
import
diff --git a/pom.xml b/pom.xml
index 58ffd92001..629b6bb583 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
google-cloud-bigtable-parent
pom
- 2.67.0
+ 2.67.1
Google Cloud Bigtable Parent
https://github.com/googleapis/java-bigtable
@@ -14,7 +14,7 @@
com.google.cloud
sdk-platform-java-config
- 3.52.2
+ 3.52.3
@@ -156,27 +156,27 @@
com.google.api.grpc
proto-google-cloud-bigtable-v2
- 2.67.0
+ 2.67.1
com.google.api.grpc
proto-google-cloud-bigtable-admin-v2
- 2.67.0
+ 2.67.1
com.google.api.grpc
grpc-google-cloud-bigtable-v2
- 2.67.0
+ 2.67.1
com.google.api.grpc
grpc-google-cloud-bigtable-admin-v2
- 2.67.0
+ 2.67.1
com.google.cloud
google-cloud-bigtable
- 2.67.0
+ 2.67.1
diff --git a/proto-google-cloud-bigtable-admin-v2/pom.xml b/proto-google-cloud-bigtable-admin-v2/pom.xml
index f2a7d55ed3..b1ee033241 100644
--- a/proto-google-cloud-bigtable-admin-v2/pom.xml
+++ b/proto-google-cloud-bigtable-admin-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-bigtable-admin-v2
- 2.67.0
+ 2.67.1
proto-google-cloud-bigtable-admin-v2
PROTO library for proto-google-cloud-bigtable-admin-v2
com.google.cloud
google-cloud-bigtable-parent
- 2.67.0
+ 2.67.1
@@ -18,14 +18,14 @@
com.google.cloud
google-cloud-bigtable-deps-bom
- 2.67.0
+ 2.67.1
pom
import
com.google.cloud
google-cloud-bigtable-bom
- 2.67.0
+ 2.67.1
pom
import
diff --git a/proto-google-cloud-bigtable-v2/pom.xml b/proto-google-cloud-bigtable-v2/pom.xml
index c1dd7a1ce5..e7151b9357 100644
--- a/proto-google-cloud-bigtable-v2/pom.xml
+++ b/proto-google-cloud-bigtable-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-cloud-bigtable-v2
- 2.67.0
+ 2.67.1
proto-google-cloud-bigtable-v2
PROTO library for proto-google-cloud-bigtable-v2
com.google.cloud
google-cloud-bigtable-parent
- 2.67.0
+ 2.67.1
@@ -18,14 +18,14 @@
com.google.cloud
google-cloud-bigtable-deps-bom
- 2.67.0
+ 2.67.1
pom
import
com.google.cloud
google-cloud-bigtable-bom
- 2.67.0
+ 2.67.1
pom
import
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 3445cbec13..3153c8d8dd 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,7 +28,7 @@
com.google.cloud
google-cloud-bigtable
- 2.67.0
+ 2.67.1
diff --git a/test-proxy/pom.xml b/test-proxy/pom.xml
index 6963457d37..4ec0f53a36 100644
--- a/test-proxy/pom.xml
+++ b/test-proxy/pom.xml
@@ -12,11 +12,11 @@
google-cloud-bigtable-parent
com.google.cloud
- 2.67.0
+ 2.67.1
- 2.67.0
+ 2.67.1
diff --git a/test-proxy/src/main/java/com/google/cloud/bigtable/testproxy/CbtTestProxy.java b/test-proxy/src/main/java/com/google/cloud/bigtable/testproxy/CbtTestProxy.java
index da205c3d3d..122bc51439 100644
--- a/test-proxy/src/main/java/com/google/cloud/bigtable/testproxy/CbtTestProxy.java
+++ b/test-proxy/src/main/java/com/google/cloud/bigtable/testproxy/CbtTestProxy.java
@@ -706,7 +706,8 @@ public void executeQuery(
.dataClient()
.executeQuery(
BoundStatementDeserializer.toBoundStatement(preparedStatement, request));
- responseObserver.onNext(ResultSetSerializer.toExecuteQueryResult(resultSet));
+ responseObserver.onNext(
+ new ResultSetSerializer(request.getProtoDescriptors()).toExecuteQueryResult(resultSet));
} catch (InterruptedException e) {
responseObserver.onError(e);
return;
diff --git a/test-proxy/src/main/java/com/google/cloud/bigtable/testproxy/ResultSetSerializer.java b/test-proxy/src/main/java/com/google/cloud/bigtable/testproxy/ResultSetSerializer.java
index 1868108efc..2467ce5299 100644
--- a/test-proxy/src/main/java/com/google/cloud/bigtable/testproxy/ResultSetSerializer.java
+++ b/test-proxy/src/main/java/com/google/cloud/bigtable/testproxy/ResultSetSerializer.java
@@ -35,13 +35,124 @@
import com.google.cloud.bigtable.data.v2.models.sql.ResultSet;
import com.google.cloud.bigtable.data.v2.models.sql.SqlType;
import com.google.cloud.bigtable.data.v2.models.sql.StructReader;
+import com.google.protobuf.AbstractMessage;
import com.google.protobuf.ByteString;
+import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
+import com.google.protobuf.DescriptorProtos.FileDescriptorSet;
+import com.google.protobuf.Descriptors.Descriptor;
+import com.google.protobuf.Descriptors.DescriptorValidationException;
+import com.google.protobuf.Descriptors.EnumDescriptor;
+import com.google.protobuf.Descriptors.FileDescriptor;
+import com.google.protobuf.DynamicMessage;
+import com.google.protobuf.ProtocolMessageEnum;
import java.time.Instant;
+import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class ResultSetSerializer {
- public static ExecuteQueryResult toExecuteQueryResult(ResultSet resultSet)
+
+ // This is a helper enum to satisfy the type constraints of {@link StructReader#getProtoEnum}.
+ private static class DummyEnum implements ProtocolMessageEnum {
+
+ private final int value;
+ private final EnumDescriptor descriptor;
+
+ private DummyEnum(int value, EnumDescriptor descriptor) {
+ this.value = value;
+ this.descriptor = descriptor;
+ }
+
+ @Override
+ public int getNumber() {
+ return value;
+ }
+
+ @Override
+ public com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() {
+ return descriptor.findValueByNumber(value);
+ }
+
+ @Override
+ public com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() {
+ return descriptor;
+ }
+ }
+
+ /**
+ * A map of all known message descriptors, keyed by their fully qualified name (e.g.,
+ * "my.package.MyMessage").
+ */
+ private final java.util.Map messageDescriptorMap;
+
+ /**
+ * A map of all known enum descriptors, keyed by their fully qualified name (e.g.,
+ * "my.package.MyEnum").
+ */
+ private final java.util.Map enumDescriptorMap;
+
+ /**
+ * Helper function to recursively adds a message descriptor and all its nested types to the map.
+ */
+ private void populateDescriptorMapsRecursively(Descriptor descriptor) {
+ messageDescriptorMap.put(descriptor.getFullName(), descriptor);
+
+ for (EnumDescriptor nestedEnum : descriptor.getEnumTypes()) {
+ enumDescriptorMap.put(nestedEnum.getFullName(), nestedEnum);
+ }
+ for (Descriptor nestedMessage : descriptor.getNestedTypes()) {
+ populateDescriptorMapsRecursively(nestedMessage);
+ }
+ }
+
+ /**
+ * Creates a serializer with a descriptor cache built from the provided FileDescriptorSet. This is
+ * useful for handling PROTO or ENUM types that require schema lookup.
+ *
+ * @param descriptorSet A set containing one or more .proto file definitions and all their
+ * non-standard dependencies. All .proto file must be provided in dependency order.
+ * @throws IllegalArgumentException if the descriptorSet contains unresolvable dependencies.
+ */
+ public ResultSetSerializer(FileDescriptorSet descriptorSet) throws IllegalArgumentException {
+ this.messageDescriptorMap = new HashMap<>();
+ this.enumDescriptorMap = new HashMap<>();
+ java.util.Map builtDescriptors = new HashMap<>();
+
+ for (FileDescriptorProto fileDescriptorProto : descriptorSet.getFileList()) {
+ // Collect dependencies. This code require files inside the descriptor set to be sorted
+ // according to the dependency order.
+ List dependencies = new ArrayList<>();
+ for (String dependencyName : fileDescriptorProto.getDependencyList()) {
+ FileDescriptor dependency = builtDescriptors.get(dependencyName);
+ if (dependency != null) {
+ // Dependency is already built, add it.
+ dependencies.add(dependency);
+ }
+ // Dependency is not in our set. We assume it's a well-known type (e.g.,
+ // google/protobuf/timestamp.proto) that buildFrom() can find and link automatically.
+ }
+
+ try {
+ FileDescriptor fileDescriptor =
+ FileDescriptor.buildFrom(
+ fileDescriptorProto, dependencies.toArray(new FileDescriptor[0]));
+ builtDescriptors.put(fileDescriptor.getName(), fileDescriptor);
+ // Now, populate both message and enum maps with all messages/enums in this file.
+ for (EnumDescriptor enumDescriptor : fileDescriptor.getEnumTypes()) {
+ enumDescriptorMap.put(enumDescriptor.getFullName(), enumDescriptor);
+ }
+ for (Descriptor messageDescriptor : fileDescriptor.getMessageTypes()) {
+ populateDescriptorMapsRecursively(messageDescriptor);
+ }
+ } catch (DescriptorValidationException e) {
+ throw new IllegalArgumentException(
+ "Failed to build descriptor for " + fileDescriptorProto.getName(), e);
+ }
+ }
+ }
+
+ public ExecuteQueryResult toExecuteQueryResult(ResultSet resultSet)
throws ExecutionException, InterruptedException {
ExecuteQueryResult.Builder resultBuilder = ExecuteQueryResult.newBuilder();
for (ColumnMetadata columnMetadata : resultSet.getMetadata().getColumns()) {
@@ -64,7 +175,7 @@ public static ExecuteQueryResult toExecuteQueryResult(ResultSet resultSet)
return resultBuilder.build();
}
- private static Value toProtoValue(Object value, SqlType> type) {
+ private Value toProtoValue(Object value, SqlType> type) {
if (value == null) {
return Value.getDefaultInstance();
}
@@ -72,16 +183,20 @@ private static Value toProtoValue(Object value, SqlType> type) {
Value.Builder valueBuilder = Value.newBuilder();
switch (type.getCode()) {
case BYTES:
- case PROTO:
valueBuilder.setBytesValue((ByteString) value);
break;
+ case PROTO:
+ valueBuilder.setBytesValue(((AbstractMessage) value).toByteString());
+ break;
case STRING:
valueBuilder.setStringValue((String) value);
break;
case INT64:
- case ENUM:
valueBuilder.setIntValue((Long) value);
break;
+ case ENUM:
+ valueBuilder.setIntValue(((ProtocolMessageEnum) value).getNumber());
+ break;
case FLOAT32:
valueBuilder.setFloatValue((Float) value);
break;
@@ -151,7 +266,7 @@ private static Value toProtoValue(Object value, SqlType> type) {
return valueBuilder.build();
}
- private static Object getColumn(StructReader struct, int fieldIndex, SqlType> fieldType) {
+ private Object getColumn(StructReader struct, int fieldIndex, SqlType> fieldType) {
if (struct.isNull(fieldIndex)) {
return null;
}
@@ -162,8 +277,15 @@ private static Object getColumn(StructReader struct, int fieldIndex, SqlType>
case BOOL:
return struct.getBoolean(fieldIndex);
case BYTES:
- case PROTO:
return struct.getBytes(fieldIndex);
+ case PROTO:
+ SchemalessProto protoType = (SchemalessProto) fieldType;
+ Descriptor descriptor = messageDescriptorMap.get(protoType.getMessageName());
+ if (descriptor == null) {
+ throw new IllegalArgumentException(
+ "Descriptor for message " + protoType.getMessageName() + " could not be found");
+ }
+ return struct.getProtoMessage(fieldIndex, DynamicMessage.getDefaultInstance(descriptor));
case DATE:
return struct.getDate(fieldIndex);
case FLOAT32:
@@ -171,8 +293,19 @@ private static Object getColumn(StructReader struct, int fieldIndex, SqlType>
case FLOAT64:
return struct.getDouble(fieldIndex);
case INT64:
- case ENUM:
return struct.getLong(fieldIndex);
+ case ENUM:
+ SchemalessEnum enumType = (SchemalessEnum) fieldType;
+ EnumDescriptor enumDescriptor = enumDescriptorMap.get(enumType.getEnumName());
+ if (enumDescriptor == null) {
+ throw new IllegalArgumentException(
+ "Descriptor for enum " + enumType.getEnumName() + " could not be found");
+ }
+ // We need to extract the integer value of the enum. `getProtoEnum` is the only
+ // available method, but it is designed for static enum types. To work around this,
+ // we can pass a lambda that constructs our DummyEnum with the captured integer value
+ // and the descriptor from the outer scope.
+ return struct.getProtoEnum(fieldIndex, number -> new DummyEnum(number, enumDescriptor));
case MAP:
return struct.getMap(fieldIndex, (SqlType.Map, ?>) fieldType);
case STRING:
diff --git a/test-proxy/src/main/proto/test_proxy.proto b/test-proxy/src/main/proto/test_proxy.proto
index b82354b08e..34cf534425 100644
--- a/test-proxy/src/main/proto/test_proxy.proto
+++ b/test-proxy/src/main/proto/test_proxy.proto
@@ -20,6 +20,7 @@ import "google/api/client.proto";
import "google/bigtable/v2/bigtable.proto";
import "google/bigtable/v2/data.proto";
import "google/protobuf/duration.proto";
+import "google/protobuf/descriptor.proto";
import "google/rpc/status.proto";
option go_package = "./testproxypb";
@@ -256,6 +257,9 @@ message ExecuteQueryRequest {
// The raw request to the Bigtable server.
google.bigtable.v2.ExecuteQueryRequest request = 2;
+
+ // The file descriptor set for the query.
+ google.protobuf.FileDescriptorSet proto_descriptors = 3;
}
// Response from test proxy service for ExecuteQueryRequest.
diff --git a/versions.txt b/versions.txt
index 2a73a4cac6..7b066e63db 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
# Format:
# module:released-version:current-version
-google-cloud-bigtable:2.67.0:2.67.0
-grpc-google-cloud-bigtable-admin-v2:2.67.0:2.67.0
-grpc-google-cloud-bigtable-v2:2.67.0:2.67.0
-proto-google-cloud-bigtable-admin-v2:2.67.0:2.67.0
-proto-google-cloud-bigtable-v2:2.67.0:2.67.0
-google-cloud-bigtable-emulator:0.204.0:0.204.0
-google-cloud-bigtable-emulator-core:0.204.0:0.204.0
+google-cloud-bigtable:2.67.1:2.67.1
+grpc-google-cloud-bigtable-admin-v2:2.67.1:2.67.1
+grpc-google-cloud-bigtable-v2:2.67.1:2.67.1
+proto-google-cloud-bigtable-admin-v2:2.67.1:2.67.1
+proto-google-cloud-bigtable-v2:2.67.1:2.67.1
+google-cloud-bigtable-emulator:0.204.1:0.204.1
+google-cloud-bigtable-emulator-core:0.204.1:0.204.1