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 88041d0c0c [CALCITE-7910] `Minus` and `Intersect` lose `StructKind` of
nested `ROW` types in row type derivation
88041d0c0c is described below
commit 88041d0c0cc4677c77d49edfeb02c2b2def9f994
Author: Sergey Nuyanzin <[email protected]>
AuthorDate: Sat Oct 31 11:45:30 2026 +0100
[CALCITE-7910] `Minus` and `Intersect` lose `StructKind` of nested `ROW`
types in row type derivation
---
.../org/apache/calcite/sql/type/ReturnTypes.java | 2 +-
.../org/apache/calcite/test/RelBuilderTest.java | 24 ++++++++++++++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
b/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
index 2ad00299f8..c93c7288c9 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
@@ -662,7 +662,7 @@ private static RelDataType deriveNullable(
List<RelDataType> inputTypes) {
if (type.isStruct()) {
final RelDataTypeFactory.Builder builder =
- new RelDataTypeFactory.Builder(typeFactory);
+ new
RelDataTypeFactory.Builder(typeFactory).kind(type.getStructKind());
final List<RelDataTypeField> fields = type.getFieldList();
for (int i = 0; i < fields.size(); i++) {
final List<RelDataType> fieldInputTypes = new ArrayList<>();
diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
index 257f1dfeb5..128dc7f386 100644
--- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
@@ -50,6 +50,7 @@
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.rel.type.StructKind;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexCorrelVariable;
import org.apache.calcite.rex.RexFieldCollation;
@@ -2654,6 +2655,29 @@ void testUnionTypeDerivation(boolean all) {
assertThat(root.getRowType(), hasRelDataType(expectedRowType));
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-7910">[CALCITE-7910]
+ * Minus and Intersect lose StructKind of nested ROW types in row type
derivation</a>. */
+ @Test void testMinusPreservesNestedStructKind() {
+ final RelBuilder builder = RelBuilder.create(config().build());
+ final RelDataTypeFactory typeFactory = builder.getTypeFactory();
+ final RelDataType inner =
+ typeFactory.createStructType(StructKind.PEEK_FIELDS_NO_EXPAND,
+ ImmutableList.of(typeFactory.createSqlType(SqlTypeName.INTEGER),
+ typeFactory.createSqlType(SqlTypeName.VARCHAR)),
+ ImmutableList.of("_1", "_2"));
+ final RelDataType rowType =
+ new RelDataTypeFactory.Builder(typeFactory)
+ .add("a", SqlTypeName.BIGINT)
+ .add("b", inner)
+ .build();
+
+ final RelNode minus =
+ builder.values(rowType).values(rowType).minus(false).build();
+
+ assertThat(minus.getRowType(), is(rowType));
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-1522">[CALCITE-1522]
* Fix error message for SetOp with incompatible args</a>. */