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