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 911cea7ad7 [CALCITE-7723] Queries using Collect with ROW results throw 
AssertionFailure
911cea7ad7 is described below

commit 911cea7ad7a2a978587f0a464b0370a27b65e1fc
Author: Mihai Budiu <[email protected]>
AuthorDate: Mon Aug 17 12:02:11 2026 -0700

    [CALCITE-7723] Queries using Collect with ROW results throw AssertionFailure
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../sql2rel/RelStructuredTypeFlattener.java        |  8 +++---
 .../apache/calcite/test/SqlToRelConverterTest.java | 16 ++++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 30 ++++++++++++++++++++++
 3 files changed, 50 insertions(+), 4 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java 
b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java
index 6489edb05d..3ab73813eb 100644
--- 
a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java
+++ 
b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java
@@ -229,9 +229,6 @@ private RelNode tryRestructure(RelNode root, RelNode 
flattened) {
           .projectNamed(structuringExps, resultFieldNames, true)
           .build();
       restructured = RelOptUtil.copyRelHints(flattened, restructured);
-      // REVIEW jvs 23-Mar-2005:  How do we make sure that this
-      // implementation stays in Java?  Fennel can't handle
-      // structured types.
       return restructured;
     } else {
       return flattened;
@@ -513,7 +510,10 @@ public void rewriteRel(LogicalCorrelate rel) {
   }
 
   public void rewriteRel(Collect rel) {
-    rewriteGeneric(rel);
+    // Flattening does not rewrite collection element types
+    final RelNode newInput =
+        tryRestructure(rel.getInput(), getNewForOldRel(rel.getInput()));
+    setNewForOldRel(rel, rel.copy(rel.getTraitSet(), newInput));
   }
 
   public void rewriteRel(Uncollect rel) {
diff --git 
a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java 
b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index 05093c2d3c..fb814f3e88 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -4635,6 +4635,22 @@ void checkCorrelatedMapSubQuery(boolean expand) {
     sql(sql).ok();
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7723";>[CALCITE-7723]
+   * Queries using Collect with ROW results throw AssertionFailure</a>. */
+  @Test void testArraySubqueryOfNestedRow() {
+    final String sql = "SELECT ARRAY(SELECT ROW(ROW(1, 2), 3) FROM (VALUES 
(0)))";
+    sql(sql).ok();
+  }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7723";>[CALCITE-7723]
+   * Queries using Collect with ROW results throw AssertionFailure</a>. */
+  @Test void testMapSubqueryOfNestedRow() {
+    final String sql = "SELECT MAP(SELECT ROW(1, 2), 'x' FROM (VALUES (0)))";
+    sql(sql).ok();
+  }
+
   @Test void testArraySubqueryOrderByProjectedField() {
     final String sql = "SELECT ARRAY(SELECT empno FROM emp ORDER BY empno)";
     sql(sql).ok();
diff --git 
a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml 
b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index bafc21fc62..38479e0da8 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -634,6 +634,21 @@ LogicalProject(EXPR$0=[$1])
     Collect(field=[EXPR$0])
       LogicalProject(EMPNO=[$0])
         LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testArraySubqueryOfNestedRow">
+    <Resource name="sql">
+      <![CDATA[SELECT ARRAY(SELECT ROW(ROW(1, 2), 3) FROM (VALUES (0)))]]>
+    </Resource>
+    <Resource name="plan">
+      <![CDATA[
+LogicalProject(EXPR$0=[$1])
+  LogicalJoin(condition=[true], joinType=[inner])
+    LogicalValues(tuples=[[{ 0 }]])
+    Collect(field=[EXPR$0])
+      LogicalProject(EXPR$0=[ROW(ROW($0, $1), $2)])
+        LogicalValues(tuples=[[{ 1, 2, 3 }]])
 ]]>
     </Resource>
   </TestCase>
@@ -5342,6 +5357,21 @@ LogicalProject(DEPTNO=[$7], NAME=[$10])
   LogicalJoin(condition=[=($7, $9)], joinType=[left])
     LogicalTableScan(table=[[CATALOG, SALES, EMP]])
     LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testMapSubqueryOfNestedRow">
+    <Resource name="sql">
+      <![CDATA[SELECT MAP(SELECT ROW(1, 2), 'x' FROM (VALUES (0)))]]>
+    </Resource>
+    <Resource name="plan">
+      <![CDATA[
+LogicalProject(EXPR$0=[$1])
+  LogicalJoin(condition=[true], joinType=[inner])
+    LogicalValues(tuples=[[{ 0 }]])
+    Collect(field=[EXPR$0])
+      LogicalProject(EXPR$0=[ROW($0, $1)], EXPR$1=[$2])
+        LogicalValues(tuples=[[{ 1, 2, 'x' }]])
 ]]>
     </Resource>
   </TestCase>

Reply via email to