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

rubenql 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 f26bd431dd [CALCITE-7135] SqlToRelConverter throws AssertionError on 
ARRAY subquery order by a field that is not present on the final projection 
(follow-up)
f26bd431dd is described below

commit f26bd431dddfa9d16120a4b024b380b60cbc93ee
Author: Ruben Quesada Lopez <[email protected]>
AuthorDate: Tue Oct 28 12:26:47 2025 +0000

    [CALCITE-7135] SqlToRelConverter throws AssertionError on ARRAY subquery 
order by a field that is not present on the final projection (follow-up)
---
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 12 ++++-----
 .../apache/calcite/test/SqlToRelConverterTest.java | 13 +++++++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 31 ++++++++++++++++++++++
 .../org/apache/calcite/test/SqlOperatorTest.java   |  2 +-
 4 files changed, 51 insertions(+), 7 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java 
b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 1fddc3f6ea..66d0ed8c72 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -5708,20 +5708,20 @@ ImmutableList<RelNode> retrieveCursors() {
           query = Iterables.getOnlyElement(call.getOperandList());
           // let top=true to make the query be top-level query,
           // then ORDER BY will be reserved.
-          root = convertQueryRecursive(query, true, null);
-          return RexSubQuery.array(root.rel);
+          root = convertQuery(query, false, true);
+          return RexSubQuery.array(root.project());
 
         case MAP_QUERY_CONSTRUCTOR:
           call = (SqlCall) expr;
           query = Iterables.getOnlyElement(call.getOperandList());
-          root = convertQueryRecursive(query, false, null);
-          return RexSubQuery.map(root.rel);
+          root = convertQuery(query, false, true);
+          return RexSubQuery.map(root.project());
 
         case MULTISET_QUERY_CONSTRUCTOR:
           call = (SqlCall) expr;
           query = Iterables.getOnlyElement(call.getOperandList());
-          root = convertQueryRecursive(query, false, null);
-          return RexSubQuery.multiset(root.rel);
+          root = convertQuery(query, false, true);
+          return RexSubQuery.multiset(root.project());
 
         default:
           break;
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 e1ca9b715a..d5648f9776 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -4354,6 +4354,11 @@ void checkCorrelatedMapSubQuery(boolean expand) {
     sql(sql).ok();
   }
 
+  @Test void testArraySubqueryOrderByProjectedFieldWithoutExpand() {
+    final String sql = "SELECT ARRAY(SELECT empno FROM emp ORDER BY empno)";
+    fixture().withFactory(f -> f.withSqlToRelConfig(c -> 
c.withExpand(false))).withSql(sql).ok();
+  }
+
   /** Test case for <a 
href="https://issues.apache.org/jira/browse/CALCITE-7135";>[CALCITE-7135]
    * SqlToRelConverter throws AssertionError on ARRAY subquery order by a 
field that
    * is not present on the final projection</a>. */
@@ -4362,6 +4367,14 @@ void checkCorrelatedMapSubQuery(boolean expand) {
     sql(sql).ok();
   }
 
+  /** Test case for <a 
href="https://issues.apache.org/jira/browse/CALCITE-7135";>[CALCITE-7135]
+   * SqlToRelConverter throws AssertionError on ARRAY subquery order by a 
field that
+   * is not present on the final projection</a>. */
+  @Test void testArraySubqueryOrderByNonProjectedFieldWithoutExpand() {
+    final String sql = "SELECT ARRAY(SELECT empno FROM emp ORDER BY ename)";
+    fixture().withFactory(f -> f.withSqlToRelConfig(c -> 
c.withExpand(false))).withSql(sql).ok();
+  }
+
   /**
    * Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-3003";>[CALCITE-3003]
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 462dab0a57..a530308abf 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -569,6 +569,22 @@ LogicalProject(EXPR$0=[$1])
         LogicalSort(sort0=[$1], dir0=[ASC])
           LogicalProject(EMPNO=[$0], ENAME=[$1])
             LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testArraySubqueryOrderByNonProjectedFieldWithoutExpand">
+    <Resource name="sql">
+      <![CDATA[SELECT ARRAY(SELECT empno FROM emp ORDER BY ename)]]>
+    </Resource>
+    <Resource name="plan">
+      <![CDATA[
+LogicalProject(EXPR$0=[ARRAY({
+LogicalProject(EMPNO=[$0])
+  LogicalSort(sort0=[$1], dir0=[ASC])
+    LogicalProject(EMPNO=[$0], ENAME=[$1])
+      LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+})])
+  LogicalValues(tuples=[[{ 0 }]])
 ]]>
     </Resource>
   </TestCase>
@@ -585,6 +601,21 @@ LogicalProject(EXPR$0=[$1])
       LogicalSort(sort0=[$0], dir0=[ASC])
         LogicalProject(EMPNO=[$0])
           LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testArraySubqueryOrderByProjectedFieldWithoutExpand">
+    <Resource name="sql">
+      <![CDATA[SELECT ARRAY(SELECT empno FROM emp ORDER BY empno)]]>
+    </Resource>
+    <Resource name="plan">
+      <![CDATA[
+LogicalProject(EXPR$0=[ARRAY({
+LogicalSort(sort0=[$0], dir0=[ASC])
+  LogicalProject(EMPNO=[$0])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+})])
+  LogicalValues(tuples=[[{ 0 }]])
 ]]>
     </Resource>
   </TestCase>
diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java 
b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
index a35ae72694..b11a968458 100644
--- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
@@ -13654,7 +13654,7 @@ private static void 
checkArrayConcatAggFuncFails(SqlOperatorFixture t) {
         + "where x > 1 order by x asc limit 1)",
         "(INTEGER NOT NULL, INTEGER NOT NULL) MAP NOT NULL", "{3=4}");
     f.check("select map(select x,y from (values(1,2),(3,4)) as t(x,y) order by 
x desc)",
-        "(INTEGER NOT NULL, INTEGER NOT NULL) MAP NOT NULL", "{1=2, 3=4}");
+        "(INTEGER NOT NULL, INTEGER NOT NULL) MAP NOT NULL", "{3=4, 1=2}");
     f.check("select map(select x,y from (values(1,2),(3,4)) as t(x,y) "
             + "where x > 1 order by x desc)",
         "(INTEGER NOT NULL, INTEGER NOT NULL) MAP NOT NULL", "{3=4}");

Reply via email to