This is an automated email from the ASF dual-hosted git repository.
hyuan 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 8d81495 [CALCITE-2903] Exception thrown when decorrelating query with
TEMPORAL TABLE
8d81495 is described below
commit 8d81495967533c556d861cfda8de5adcb9fd912c
Author: Haisheng Yuan <[email protected]>
AuthorDate: Fri Mar 8 21:20:14 2019 -0600
[CALCITE-2903] Exception thrown when decorrelating query with TEMPORAL TABLE
Close apache/calcite#1098
---
.../apache/calcite/sql2rel/RelDecorrelator.java | 13 +++++
.../apache/calcite/test/SqlToRelConverterTest.java | 44 ++++++++++++++++
.../apache/calcite/test/SqlToRelConverterTest.xml | 61 ++++++++++++++++++++++
3 files changed, 118 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 da674d9..1846a18 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
@@ -46,6 +46,7 @@ import org.apache.calcite.rel.logical.LogicalCorrelate;
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.LogicalSort;
import org.apache.calcite.rel.metadata.RelMdUtil;
import org.apache.calcite.rel.metadata.RelMetadataQuery;
@@ -989,6 +990,18 @@ public class RelDecorrelator implements ReflectiveVisitor {
}
/**
+ * Rewrite LogicalSnapshot.
+ *
+ * @param rel the snapshot rel to rewrite
+ */
+ public Frame decorrelateRel(LogicalSnapshot rel) {
+ if (RexUtil.containsCorrelation(rel.getPeriod())) {
+ return null;
+ }
+ return decorrelateRel((RelNode) rel);
+ }
+
+ /**
* Rewrite LogicalFilter.
*
* @param rel the filter rel to rewrite
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 d416eb8..b5749b1 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -1084,6 +1084,50 @@ public class SqlToRelConverterTest extends
SqlToRelTestBase {
sql(sql).ok();
}
+ /**
+ * Lateral join with temporal table, both snapshot's input scan
+ * and snapshot's period reference outer columns. Should not
+ * decorrelate join.
+ */
+ @Test public void testCrossJoinTemporalTable1() {
+ final String sql = "select stream *\n"
+ + "from orders\n"
+ + "cross join lateral (\n"
+ + " select * from products_temporal for system_time\n"
+ + " as of orders.rowtime\n"
+ + " where orders.productid = products_temporal.productid)\n";
+ sql(sql).ok();
+ }
+
+ /**
+ * Lateral join with temporal table, snapshot's input scan
+ * reference outer columns, but snapshot's period is static.
+ * Should be able to decorrelate join.
+ */
+ @Test public void testCrossJoinTemporalTable2() {
+ final String sql = "select stream *\n"
+ + "from orders\n"
+ + "cross join lateral (\n"
+ + " select * from products_temporal for system_time\n"
+ + " as of TIMESTAMP '2011-01-02 00:00:00'\n"
+ + " where orders.productid = products_temporal.productid)\n";
+ sql(sql).ok();
+ }
+
+ /**
+ * Lateral join with temporal table, snapshot's period reference
+ * outer columns. Should not decorrelate join.
+ */
+ @Test public void testCrossJoinTemporalTable3() {
+ final String sql = "select stream *\n"
+ + "from orders\n"
+ + "cross join lateral (\n"
+ + " select * from products_temporal for system_time\n"
+ + " as of orders.rowtime\n"
+ + " where products_temporal.productid > 1)\n";
+ sql(sql).ok();
+ }
+
/** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-1732">[CALCITE-1732]
* IndexOutOfBoundsException when using LATERAL TABLE with more than one
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 24289d3..dc4219c 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -285,6 +285,67 @@ LogicalDelta
]]>
</Resource>
</TestCase>
+ <TestCase name="testCrossJoinTemporalTable1">
+ <Resource name="sql">
+ <![CDATA[select stream *
+ from orders
+ join products_temporal for system_time as of orders.rowtime
+ on orders.productid = products_temporal.productid]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalDelta
+ LogicalProject(ROWTIME=[$0], PRODUCTID=[$1], ORDERID=[$2], PRODUCTID0=[$3],
NAME=[$4], SUPPLIERID=[$5], SYS_START=[$6], SYS_END=[$7])
+ LogicalCorrelate(correlation=[$cor1], joinType=[inner],
requiredColumns=[{0, 1}])
+ LogicalTableScan(table=[[CATALOG, SALES, ORDERS]])
+ LogicalProject(PRODUCTID=[$0], NAME=[$1], SUPPLIERID=[$2],
SYS_START=[$3], SYS_END=[$4])
+ LogicalFilter(condition=[=($cor1.PRODUCTID, $0)])
+ LogicalSnapshot(period=[$cor1.ROWTIME])
+ LogicalTableScan(table=[[CATALOG, SALES, PRODUCTS_TEMPORAL]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testCrossJoinTemporalTable2">
+ <Resource name="sql">
+ <![CDATA[select stream *
+ from orders
+ cross join lateral (
+ select * from products_temporal for system_time
+ as of TIMESTAMP '2011-01-02 00:00:00'
+ where orders.productid = products_temporal.productid)]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalDelta
+ LogicalProject(ROWTIME=[$0], PRODUCTID=[$1], ORDERID=[$2], PRODUCTID0=[$3],
NAME=[$4], SUPPLIERID=[$5], SYS_START=[$6], SYS_END=[$7])
+ LogicalJoin(condition=[=($1, $8)], joinType=[inner])
+ LogicalTableScan(table=[[CATALOG, SALES, ORDERS]])
+ LogicalProject(PRODUCTID=[$0], NAME=[$1], SUPPLIERID=[$2],
SYS_START=[$3], SYS_END=[$4], PRODUCTID5=[$0])
+ LogicalSnapshot(period=[2011-01-02 00:00:00])
+ LogicalTableScan(table=[[CATALOG, SALES, PRODUCTS_TEMPORAL]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testCrossJoinTemporalTable3">
+ <Resource name="sql">
+ <![CDATA[select stream *
+ from orders
+ join products_temporal for system_time as of orders.rowtime
+ on products_temporal.productid > 1]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalDelta
+ LogicalProject(ROWTIME=[$0], PRODUCTID=[$1], ORDERID=[$2], PRODUCTID0=[$3],
NAME=[$4], SUPPLIERID=[$5], SYS_START=[$6], SYS_END=[$7])
+ LogicalCorrelate(correlation=[$cor0], joinType=[inner],
requiredColumns=[{0}])
+ LogicalTableScan(table=[[CATALOG, SALES, ORDERS]])
+ LogicalProject(PRODUCTID=[$0], NAME=[$1], SUPPLIERID=[$2],
SYS_START=[$3], SYS_END=[$4])
+ LogicalFilter(condition=[>($0, 1)])
+ LogicalSnapshot(period=[$cor0.ROWTIME])
+ LogicalTableScan(table=[[CATALOG, SALES, PRODUCTS_TEMPORAL]])
+]]>
+ </Resource>
+ </TestCase>
<TestCase name="testCollectionTableWithLateral3">
<Resource name="sql">
<![CDATA[select * from dept, lateral table(DEDUP(dept.deptno,
dept.name))]]>