This is an automated email from the ASF dual-hosted git repository.

mihaibudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new db16969e89 [CALCITE-7581] 
RelDataTypeFactoryImpl.createStructType(List<>) should not be final
db16969e89 is described below

commit db16969e8987f3b25997229f4f9adfb8fe0ed329
Author: Mihai Budiu <[email protected]>
AuthorDate: Thu Jun 4 13:42:05 2026 -0700

    [CALCITE-7581] RelDataTypeFactoryImpl.createStructType(List<>) should not 
be final
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../calcite/rel/type/RelDataTypeFactoryImpl.java   |  2 +-
 .../calcite/sql/type/RelDataTypeSystemTest.java    | 51 ++++++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactoryImpl.java 
b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactoryImpl.java
index b5d901ec37..c0d90578fa 100644
--- a/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactoryImpl.java
+++ b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeFactoryImpl.java
@@ -190,7 +190,7 @@ private RelDataType createStructType(StructKind kind,
         });
   }
 
-  @Override public final RelDataType createStructType(
+  @Override public RelDataType createStructType(
       final List<? extends Map.Entry<String, RelDataType>> fieldList) {
     return createStructType(fieldList, false);
   }
diff --git 
a/core/src/test/java/org/apache/calcite/sql/type/RelDataTypeSystemTest.java 
b/core/src/test/java/org/apache/calcite/sql/type/RelDataTypeSystemTest.java
index 2a96292ead..58d56c99dd 100644
--- a/core/src/test/java/org/apache/calcite/sql/type/RelDataTypeSystemTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/type/RelDataTypeSystemTest.java
@@ -18,7 +18,9 @@
 
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeSystem;
 import org.apache.calcite.rel.type.RelDataTypeSystemImpl;
+import org.apache.calcite.rel.type.StructKind;
 import org.apache.calcite.runtime.CalciteException;
 import org.apache.calcite.runtime.Resources;
 import org.apache.calcite.sql.SqlLiteral;
@@ -27,12 +29,18 @@
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.calcite.sql.validate.SqlValidatorException;
+import org.apache.calcite.util.Pair;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
 import org.checkerframework.checker.nullness.qual.Nullable;
 import org.junit.jupiter.api.Test;
 
+import java.util.AbstractMap;
+import java.util.List;
+import java.util.Map;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -42,6 +50,49 @@
  * Tests the inference of return types using {@code RelDataTypeSystem}.
  */
 class RelDataTypeSystemTest {
+  /** A type factory which creates ROW types with PEEK_FIELDS_NO_EXPAND by 
default. */
+  private static class CustomTypeFactory extends SqlTypeFactoryImpl {
+    CustomTypeFactory() {
+      super(RelDataTypeSystem.DEFAULT);
+    }
+
+    @Override public RelDataType createStructType(
+        final List<RelDataType> typeList,
+        final List<String> fieldNameList) {
+      return super.createStructType(StructKind.PEEK_FIELDS_NO_EXPAND, 
typeList, fieldNameList);
+    }
+
+    // This method used to be final in the base class, and could not be 
overridden
+    @Override public RelDataType createStructType(
+        final List<? extends Map.Entry<String, RelDataType>> fieldList) {
+      return this.createStructType(Pair.right(fieldList), 
Pair.left(fieldList));
+    }
+
+    @Override @SuppressWarnings("deprecation")
+    public FieldInfoBuilder builder() {
+      return new FieldInfoBuilder(this).kind(StructKind.PEEK_FIELDS_NO_EXPAND);
+    }
+  }
+
+  @Test public void testCustomRecordFactory() {
+    // Test that ROW types generated by a custom factory all have the 
appropriate struct kind
+    CustomTypeFactory factory = new CustomTypeFactory();
+    RelDataType i = factory.createSqlType(SqlTypeName.INTEGER);
+    RelDataType rel = factory.createStructType(ImmutableList.of(i), 
ImmutableList.of("x"));
+    assertThat(rel.getStructKind(), is(StructKind.PEEK_FIELDS_NO_EXPAND));
+
+    RelDataType rowType = factory.builder()
+        .add("a", factory.createSqlType(SqlTypeName.INTEGER))
+        .add("b", factory.createSqlType(SqlTypeName.VARCHAR))
+        .build();
+    assertThat(rowType.getStructKind(), is(StructKind.PEEK_FIELDS_NO_EXPAND));
+
+    // Test case for https://issues.apache.org/jira/browse/CALCITE-7581
+    // RelDataTypeFactoryImpl.createStructType(List<>) should not be final
+    RelDataType rel2 =
+        factory.createStructType(ImmutableList.of(new 
AbstractMap.SimpleEntry<>("x", i)));
+    assertThat(rel2.getStructKind(), is(StructKind.PEEK_FIELDS_NO_EXPAND));
+  }
 
   /**
    * Custom type system class that overrides the default decimal plus type 
derivation and

Reply via email to