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