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(

Reply via email to