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>. */

Reply via email to