You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2017/01/06 20:52:47 UTC

[3/5] calcite git commit: [CALCITE-1543] Correlated scalar sub-query with multiple aggregates gives AssertionError (Kurt Young)

[CALCITE-1543] Correlated scalar sub-query with multiple aggregates gives AssertionError (Kurt Young)

Add TPC-H test case (Julian Hyde)

Close apache/calcite#343


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/408285f0
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/408285f0
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/408285f0

Branch: refs/heads/master
Commit: 408285f08f0b8e0e019dc0c6fe02d8e05425f4a3
Parents: 8dd935e
Author: Kurt Young <yk...@gmail.com>
Authored: Wed Jan 4 11:57:50 2017 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Jan 6 10:45:52 2017 -0800

----------------------------------------------------------------------
 .../apache/calcite/sql2rel/RelDecorrelator.java |  1 -
 .../calcite/test/SqlToRelConverterTest.java     | 13 ++++++++
 .../calcite/test/SqlToRelConverterTest.xml      | 32 ++++++++++++++++++++
 .../apache/calcite/adapter/tpch/TpchTest.java   | 18 +++++++++++
 4 files changed, 63 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/408285f0/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
----------------------------------------------------------------------
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 41e262b..a526d2c 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
@@ -451,7 +451,6 @@ public class RelDecorrelator implements ReflectiveVisitor {
       // If input has not been rewritten, do not rewrite this rel.
       return null;
     }
-    assert !frame.corVarOutputPos.isEmpty();
     final RelNode newInput = frame.r;
 
     // map from newInput

http://git-wip-us.apache.org/repos/asf/calcite/blob/408285f0/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
----------------------------------------------------------------------
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 238113a..ef3840d 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -1742,6 +1742,19 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
     sql(sql).decorrelate(true).expand(true).ok();
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-1543">[CALCITE-1543]
+   * Correlated scalar sub-query with multiple aggregates gives
+   * AssertionError</a>. */
+  @Test public void testCorrelationMultiScalarAggregate() {
+    final String sql = "select sum(e1.empno)\n"
+        + "from emp e1, dept d1\n"
+        + "where e1.deptno = d1.deptno\n"
+        + "and e1.sal > (select avg(e2.sal) from emp e2\n"
+        + "  where e2.deptno = d1.deptno)";
+    sql(sql).decorrelate(true).expand(true).ok();
+  }
+
   @Test public void testCorrelationScalarAggAndFilterRex() {
     final String sql = "SELECT e1.empno\n"
         + "FROM emp e1, dept d1 where e1.deptno = d1.deptno\n"

http://git-wip-us.apache.org/repos/asf/calcite/blob/408285f0/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
----------------------------------------------------------------------
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 0b31805..cfbfa8f 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -2878,6 +2878,38 @@ LogicalProject(EMPNO=[$0])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testCorrelationMultiScalarAggregate">
+        <Resource name="sql">
+            <![CDATA[select sum(e1.empno)
+from emp e1, dept d1
+where e1.deptno = d1.deptno
+and e1.sal > (select avg(e2.sal) from emp e2
+  where e2.deptno = d1.deptno)]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalAggregate(group=[{}], EXPR$0=[SUM($0)])
+  LogicalProject(EMPNO=[$0])
+    LogicalProject(EMPNO=[$0])
+      LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], DEPTNO0=[$9], NAME=[$10], EXPR$0=[$12])
+        LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], DEPTNO0=[$9], NAME=[$10], DEPTNO00=[CAST($11):INTEGER], EXPR$0=[CAST($12):INTEGER])
+          LogicalJoin(condition=[AND(=($9, $11), >($5, $12))], joinType=[inner])
+            LogicalJoin(condition=[=($7, $9)], joinType=[inner])
+              LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+              LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+            LogicalAggregate(group=[{0}], EXPR$0=[AVG($1)])
+              LogicalProject(DEPTNO0=[$1], SAL=[$0])
+                LogicalProject(SAL=[$5], DEPTNO0=[$9])
+                  LogicalJoin(condition=[=($7, $9)], joinType=[inner])
+                    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+                    LogicalAggregate(group=[{0}])
+                      LogicalProject(DEPTNO0=[$9])
+                        LogicalJoin(condition=[=($7, $9)], joinType=[inner])
+                          LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+                          LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testCorrelationExistsAndFilter">
         <Resource name="sql">
             <![CDATA[SELECT e1.empno

http://git-wip-us.apache.org/repos/asf/calcite/blob/408285f0/plus/src/test/java/org/apache/calcite/adapter/tpch/TpchTest.java
----------------------------------------------------------------------
diff --git a/plus/src/test/java/org/apache/calcite/adapter/tpch/TpchTest.java b/plus/src/test/java/org/apache/calcite/adapter/tpch/TpchTest.java
index 0170520..7dee05d 100644
--- a/plus/src/test/java/org/apache/calcite/adapter/tpch/TpchTest.java
+++ b/plus/src/test/java/org/apache/calcite/adapter/tpch/TpchTest.java
@@ -779,6 +779,24 @@ public class TpchTest {
         .returnsCount(1500000);
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-1543">[CALCITE-1543]
+   * Correlated scalar sub-query with multiple aggregates gives
+   * AssertionError</a>. */
+  @Ignore("planning succeeds, but gives OutOfMemoryError during execution")
+  @Test public void testDecorrelateScalarAggregate() {
+    final String sql = "select sum(l_extendedprice)\n"
+        + "from lineitem, part\n"
+        + "where\n"
+        + "     p_partkey = l_partkey\n"
+        + "     and l_quantity > (\n"
+        + "       select avg(l_quantity)\n"
+        + "       from lineitem\n"
+        + "       where l_partkey = p_partkey\n"
+        + "    )\n";
+    with().query(sql).runs();
+  }
+
   @Test public void testCustomer() {
     with()
         .query("select * from tpch.customer")