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>