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}");