This is an automated email from the ASF dual-hosted git repository.
zabetak 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 f7aa27ec2 [CALCITE-4913] Deduplicate correlated variables in SELECT
clause
f7aa27ec2 is described below
commit f7aa27ec22e843c5e27022f99237175d159699bb
Author: korlov42 <[email protected]>
AuthorDate: Fri Jun 3 11:43:05 2022 +0300
[CALCITE-4913] Deduplicate correlated variables in SELECT clause
Partial revert of deduplication in LogicalTableFunctionScan
(CALCITE-4673) since the deduplication in Project is more general and
covers the previous use-case as well.
Close apache/calcite#2825
---
.../apache/calcite/sql2rel/SqlToRelConverter.java | 23 +++++------
.../apache/calcite/test/SqlToRelConverterTest.java | 15 ++++++++
.../apache/calcite/test/SqlToRelConverterTest.xml | 44 +++++++++++++++++++++-
3 files changed, 69 insertions(+), 13 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 91d223c62..adc19e5d2 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -2696,16 +2696,6 @@ public class SqlToRelConverter {
validator().getValidatedNodeType(call),
columnMappings);
- final SqlValidatorScope selectScope =
- ((DelegatingScope) bb.scope()).getParent();
- final Blackboard seekBb = createBlackboard(selectScope, null, false);
-
- final CorrelationUse p = getCorrelationUse(seekBb, callRel);
- if (p != null) {
- assert p.r instanceof LogicalTableFunctionScan;
- callRel = (LogicalTableFunctionScan) p.r;
- }
-
bb.setRoot(callRel, true);
afterTableFunction(bb, call, callRel);
}
@@ -4400,7 +4390,18 @@ public class SqlToRelConverter {
relBuilder.push(bb.root())
.projectNamed(exprs, fieldNames, true);
- bb.setRoot(relBuilder.build(), false);
+
+ RelNode project = relBuilder.build();
+
+ final RelNode r;
+ final CorrelationUse p = getCorrelationUse(bb, project);
+ if (p != null) {
+ r = p.r;
+ } else {
+ r = project;
+ }
+
+ bb.setRoot(r, false);
assert bb.columnMonotonicities.isEmpty();
bb.columnMonotonicities.addAll(columnMonotonicityList);
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 41b38ec74..f4954e6da 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -1288,6 +1288,21 @@ class SqlToRelConverterTest extends SqlToRelTestBase {
+ "from emp e");
}
+ @Test void testCorrelatedScalarSubQueryInSelectList() {
+ Consumer<String> fn = sql -> {
+ sql(sql).withExpand(true).withDecorrelate(false)
+ .convertsTo("${planExpanded}");
+ sql(sql).withExpand(false).withDecorrelate(false)
+ .convertsTo("${planNotExpanded}");
+ };
+ fn.accept("select deptno,\n"
+ + " (select min(1) from emp where empno > d.deptno) as i0,\n"
+ + " (select min(0) from emp where deptno = d.deptno "
+ + " and ename = 'SMITH'"
+ + " and d.deptno > 0) as i1\n"
+ + "from dept as d");
+ }
+
@Test void testCorrelationLateralSubQuery() {
String sql = "SELECT deptno, ename\n"
+ "FROM\n"
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 7d883fbaa..82465eaad 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -664,6 +664,46 @@ LogicalProject(EMPNO=[$0], JOB=[$2])
]]>
</Resource>
</TestCase>
+ <TestCase name="testCorrelatedScalarSubQueryInSelectList">
+ <Resource name="planNotExpanded">
+ <![CDATA[
+LogicalProject(DEPTNO=[$0], I0=[$SCALAR_QUERY({
+LogicalAggregate(group=[{}], EXPR$0=[MIN($0)])
+ LogicalProject($f0=[1])
+ LogicalFilter(condition=[>($0, $cor0.DEPTNO)])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+})], I1=[$SCALAR_QUERY({
+LogicalAggregate(group=[{}], EXPR$0=[MIN($0)])
+ LogicalProject($f0=[0])
+ LogicalFilter(condition=[AND(=($7, $cor0.DEPTNO), =($1, 'SMITH'),
>($cor0.DEPTNO, 0))])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+})])
+ LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+ </Resource>
+ <Resource name="planExpanded">
+ <![CDATA[
+LogicalProject(DEPTNO=[$0], I0=[$2], I1=[$3])
+ LogicalCorrelate(correlation=[$cor1], joinType=[left], requiredColumns=[{0}])
+ LogicalCorrelate(correlation=[$cor0], joinType=[left],
requiredColumns=[{0}])
+ LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+ LogicalAggregate(group=[{}], EXPR$0=[MIN($0)])
+ LogicalProject($f0=[1])
+ LogicalFilter(condition=[>($0, $cor0.DEPTNO)])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ LogicalAggregate(group=[{}], EXPR$0=[MIN($0)])
+ LogicalProject($f0=[0])
+ LogicalFilter(condition=[AND(=($7, $cor1.DEPTNO), =($1, 'SMITH'),
>($cor1.DEPTNO, 0))])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ <Resource name="sql">
+ <![CDATA[select deptno,
+ (select min(1) from emp where empno > d.deptno) as i0,
+ (select min(0) from emp where deptno = d.deptno
and ename = 'SMITH' and d.deptno > 0) as i1
+from dept as d]]>
+ </Resource>
+ </TestCase>
<TestCase name="testCorrelatedSubQueryInAggregate">
<Resource name="sql">
<![CDATA[SELECT SUM(
@@ -7258,11 +7298,11 @@ LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2],
MGR=[$3], HIREDATE=[$4], SAL=[$
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
})], EMP_MULTISET=[MULTISET({
LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4],
SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
- LogicalFilter(condition=[=($7, $cor1.DEPTNO)])
+ LogicalFilter(condition=[=($7, $cor0.DEPTNO)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
})], JOB_MAP=[MAP({
LogicalProject(EMPNO=[$0], JOB=[$2])
- LogicalFilter(condition=[=($7, $cor2.DEPTNO)])
+ LogicalFilter(condition=[=($7, $cor0.DEPTNO)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
})])
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])