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))]]>

Reply via email to