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 <[email protected]>
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(