This is an automated email from the ASF dual-hosted git repository. danny0405 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push: new 8d4820f [CALCITE-3847] Decorrelation for join with lateral table outputs wrong plan if the join condition contains correlation variables 8d4820f is described below commit 8d4820f208cd69f4377fca175c8b83ff16b1a912 Author: yuzhao.cyz <yuzhao....@gmail.com> AuthorDate: Mon Mar 9 20:03:13 2020 +0800 [CALCITE-3847] Decorrelation for join with lateral table outputs wrong plan if the join condition contains correlation variables --- .../java/org/apache/calcite/sql2rel/RelDecorrelator.java | 8 ++++++++ .../org/apache/calcite/test/SqlToRelConverterTest.java | 11 +++++++++++ .../org/apache/calcite/test/SqlToRelConverterTest.xml | 16 ++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java index 61b6422..65eee02 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java @@ -48,6 +48,7 @@ import org.apache.calcite.rel.logical.LogicalFilter; import org.apache.calcite.rel.logical.LogicalJoin; import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rel.logical.LogicalSnapshot; +import org.apache.calcite.rel.logical.LogicalTableFunctionScan; import org.apache.calcite.rel.metadata.RelMdUtil; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.rules.FilterCorrelateRule; @@ -1032,6 +1033,13 @@ public class RelDecorrelator implements ReflectiveVisitor { return decorrelateRel((RelNode) rel); } + public Frame decorrelateRel(LogicalTableFunctionScan rel) { + if (RexUtil.containsCorrelation(rel.getCall())) { + return null; + } + return decorrelateRel((RelNode) rel); + } + public Frame decorrelateRel(LogicalFilter rel) { return decorrelateRel((Filter) 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 b24e2f3..dc133ea 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java @@ -1195,6 +1195,17 @@ public class SqlToRelConverterTest extends SqlToRelTestBase { sql("select * from dept, lateral table(DEDUP(dept.deptno, dept.name))").ok(); } + /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-3847">[CALCITE-3847] + * Decorrelation for join with lateral table outputs wrong plan if the join + * condition contains correlation variables</a>. */ + @Test public void testJoinLateralTableWithConditionCorrelated() { + final String sql = "select deptno, r.num from dept join\n" + + " lateral table(ramp(dept.deptno)) as r(num)\n" + + " on deptno=num"; + sql(sql).ok(); + } + @Test public void testSample() { final String sql = "select * from emp tablesample substitute('DATASET1') where empno > 5"; 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 e710248..92ad19a 100644 --- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml @@ -453,6 +453,22 @@ LogicalProject(DEPTNO=[$0], NAME=[$1], NAME0=[$2]) ]]> </Resource> </TestCase> + <TestCase name="testJoinLateralTableWithConditionCorrelated"> + <Resource name="sql"> + <![CDATA[select deptno, r.num from dept join +lateral table(ramp(dept.deptno)) as r(num) +on deptno=num]]> + </Resource> + <Resource name="plan"> + <![CDATA[ +LogicalProject(DEPTNO=[$0], NUM=[$2]) + LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{0}]) + LogicalTableScan(table=[[CATALOG, SALES, DEPT]]) + LogicalFilter(condition=[=($cor0.DEPTNO, $0)]) + LogicalTableFunctionScan(invocation=[RAMP($cor0.DEPTNO)], rowType=[RecordType(INTEGER I)]) +]]> + </Resource> + </TestCase> <TestCase name="testCorrelatedSubQueryInAggregate"> <Resource name="sql"> <![CDATA[SELECT SUM(