From 75c580a680fc541a3da5a0a4dc06fda680c27b50 Mon Sep 17 00:00:00 2001 From: Arnaud Lacurie Date: Wed, 12 Nov 2025 17:31:19 +0000 Subject: [PATCH 1/2] Add ResultSet MetaData tests to assert current behavior with underlying struct type names --- .../recordlayer/StructDataMetadataTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/StructDataMetadataTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/StructDataMetadataTest.java index 597ae0b4ce..e00284e334 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/StructDataMetadataTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/StructDataMetadataTest.java @@ -125,6 +125,28 @@ void canReadSingleStruct() throws Exception { } } + @Test + void canReadProjectedStructTypeNameInNestedStar() throws Exception { + try (final RelationalResultSet resultSet = statement.executeQuery("SELECT (*) FROM T")) { + Assertions.assertTrue(resultSet.next(), "Did not find a record!"); + RelationalStruct struct = resultSet.getStruct(1).getStruct("ST1"); + Assertions.assertEquals("STRUCT_1", struct.getMetaData().getTypeName()); + } + } + + // When projecting *, the underlying struct types are lost and replaced with a generic UUID type. + // This test should be replaced with the correct expected behavior once this is fixed. + // When projecting (*), everything works as expected, see `canReadProjectedStructTypeNameInNestedStar`. + // See https://github.com/FoundationDB/fdb-record-layer/issues/3743 + @Test + void cannotReadProjectedStructTypeNameInUnnestedStar() throws Exception { + try (final RelationalResultSet resultSet = statement.executeQuery("SELECT * FROM T")) { + Assertions.assertTrue(resultSet.next(), "Did not find a record!"); + RelationalStruct struct = resultSet.getStruct("ST1"); + Assertions.assertNotEquals("STRUCT_1", struct.getMetaData().getTypeName()); + } + } + @Test void errorAccessingNonExistentColumn() throws Exception { try (final RelationalResultSet resultSet = statement.executeGet("T", new KeySet().setKeyColumn("NAME", "test_record_1"), Options.NONE)) { From ae4058901d407c1d8ae737a01ecbf7a44af8624b Mon Sep 17 00:00:00 2001 From: Arnaud Lacurie Date: Wed, 12 Nov 2025 17:35:37 +0000 Subject: [PATCH 2/2] Add additional test --- .../relational/recordlayer/StructDataMetadataTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/StructDataMetadataTest.java b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/StructDataMetadataTest.java index e00284e334..01f74d76ff 100644 --- a/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/StructDataMetadataTest.java +++ b/fdb-relational-core/src/test/java/com/apple/foundationdb/relational/recordlayer/StructDataMetadataTest.java @@ -147,6 +147,15 @@ void cannotReadProjectedStructTypeNameInUnnestedStar() throws Exception { } } + @Test + void canReadProjectedStructTypeNameDirectlyProjected() throws Exception { + try (final RelationalResultSet resultSet = statement.executeQuery("SELECT ST1 FROM T")) { + Assertions.assertTrue(resultSet.next(), "Did not find a record!"); + RelationalStruct struct = resultSet.getStruct("ST1"); + Assertions.assertEquals("STRUCT_1", struct.getMetaData().getTypeName()); + } + } + @Test void errorAccessingNonExistentColumn() throws Exception { try (final RelationalResultSet resultSet = statement.executeGet("T", new KeySet().setKeyColumn("NAME", "test_record_1"), Options.NONE)) {