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/02/13 23:29:13 UTC

calcite git commit: [CALCITE-365] AssertionError while translating query with WITH and correlated sub-query

Repository: calcite
Updated Branches:
  refs/heads/master 7f9f4a165 -> 57b38db5e


[CALCITE-365] AssertionError while translating query with WITH and correlated sub-query


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

Branch: refs/heads/master
Commit: 57b38db5ee1ee31b444fbd535d8df574f8cd7e11
Parents: 7f9f4a1
Author: Julian Hyde <jh...@apache.org>
Authored: Mon Feb 13 14:11:32 2017 -0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Feb 13 14:11:32 2017 -0800

----------------------------------------------------------------------
 .../apache/calcite/sql2rel/RelDecorrelator.java | 15 ++++++--
 .../calcite/sql2rel/SqlToRelConverter.java      |  3 +-
 .../calcite/test/SqlToRelConverterTest.java     | 11 ++++++
 .../calcite/test/SqlToRelConverterTest.xml      | 22 ++++++++++++
 core/src/test/resources/sql/misc.iq             |  5 ++-
 core/src/test/resources/sql/sub-query.iq        | 37 ++++++++++++++++++++
 6 files changed, 86 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/57b38db5/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 a526d2c..9ef7b21 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
@@ -707,7 +707,7 @@ public class RelDecorrelator implements ReflectiveVisitor {
 
       final RelNode oldInput = getCorRel(corVar);
       assert oldInput != null;
-      final Frame frame = map.get(oldInput);
+      final Frame frame = getFrame(oldInput, true);
       assert frame != null;
       final RelNode newInput = frame.r;
 
@@ -741,7 +741,7 @@ public class RelDecorrelator implements ReflectiveVisitor {
     for (Correlation corVar : correlations) {
       final RelNode oldInput = getCorRel(corVar);
       assert oldInput != null;
-      final RelNode newInput = map.get(oldInput).r;
+      final RelNode newInput = getFrame(oldInput, true).r;
       assert newInput != null;
 
       if (!joinedInputRelSet.contains(newInput)) {
@@ -776,7 +776,7 @@ public class RelDecorrelator implements ReflectiveVisitor {
       // the correlated variables.
       final RelNode oldInput = getCorRel(corVar);
       assert oldInput != null;
-      final Frame frame = map.get(oldInput);
+      final Frame frame = getFrame(oldInput, true);
       final RelNode newInput = frame.r;
       assert newInput != null;
 
@@ -802,6 +802,15 @@ public class RelDecorrelator implements ReflectiveVisitor {
     return r;
   }
 
+  private Frame getFrame(RelNode r, boolean safe) {
+    final Frame frame = map.get(r);
+    if (frame == null && safe) {
+      return new Frame(r, ImmutableSortedMap.<Correlation, Integer>of(),
+          identityMap(r.getRowType().getFieldCount()));
+    }
+    return frame;
+  }
+
   private RelNode getCorRel(Correlation corVar) {
     final RelNode r = cm.mapCorVarToCorRel.get(corVar.corr);
     return r.getInput(0);

http://git-wip-us.apache.org/repos/asf/calcite/blob/57b38db5/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 33afe15..60dd66d 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -3984,7 +3984,8 @@ public class SqlToRelConverter {
             builder.addAll(c.getRowType().getFieldList());
             if (i == resolve.path.steps().get(0).i) {
               for (RelDataTypeField field : c.getRowType().getFieldList()) {
-                fields.put(field.getName(), field.getIndex() + offset);
+                fields.put(c.translate(field.getName()),
+                    field.getIndex() + offset);
               }
             }
             ++i;

http://git-wip-us.apache.org/repos/asf/calcite/blob/57b38db5/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 ce7248a..344f770 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -731,6 +731,17 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
     sql(sql).expand(false).ok();
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-365">[CALCITE-365]
+   * AssertionError while translating query with WITH and correlated
+   * sub-query</a>. */
+  @Test public void testWithExists() {
+    final String sql = "with t (a, b) as (select * from (values (1, 2)))\n"
+        + "select * from t where exists (\n"
+        + "  select 1 from emp where deptno = t.a)";
+    sql(sql).ok();
+  }
+
   @Test public void testTableExtend() {
     final String sql = "select * from dept extend (x varchar(5) not null)";
     sql(sql).ok();

http://git-wip-us.apache.org/repos/asf/calcite/blob/57b38db5/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 443d764..80a7439 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -3940,4 +3940,26 @@ LogicalProject(EMPNO=[$0])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testWithExists">
+        <Resource name="sql">
+            <![CDATA[with t (a, b) as (select * from (values (1, 2)))
+select * from t where exists (
+  select 1 from emp where deptno = t.a)]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(A=[$0], B=[$1])
+  LogicalProject(EXPR$0=[$0], EXPR$1=[$1], $f0=[$2])
+    LogicalFilter(condition=[IS NOT NULL($2)])
+      LogicalCorrelate(correlation=[$cor0], joinType=[LEFT], requiredColumns=[{0}])
+        LogicalProject(EXPR$0=[$0], EXPR$1=[$1])
+          LogicalValues(tuples=[[{ 1, 2 }]])
+        LogicalAggregate(group=[{}], agg#0=[MIN($0)])
+          LogicalProject($f0=[true])
+            LogicalProject(EXPR$0=[1])
+              LogicalFilter(condition=[=($7, $cor0.A)])
+                LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+    </TestCase>
 </Root>

http://git-wip-us.apache.org/repos/asf/calcite/blob/57b38db5/core/src/test/resources/sql/misc.iq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/misc.iq b/core/src/test/resources/sql/misc.iq
index 9d856ba..39a32d5 100644
--- a/core/src/test/resources/sql/misc.iq
+++ b/core/src/test/resources/sql/misc.iq
@@ -693,7 +693,6 @@ EnumerableCalc(expr#0..1=[{inputs}], expr#2=[1], expr#3=[=($t0, $t2)], proj#0..1
 
 # [HIVE-5873] Semi-join to count sub-query
 # [CALCITE-365] AssertionError while translating query with WITH and correlated sub-query
-!if (false) {
 with parts (PNum, OrderOnHand)
      as (select * from (values (3, 6), (10, 1), (8, 0)) as t(PNum, OrderOnHand)),
   supply (PNum, Qty)
@@ -707,11 +706,11 @@ where orderOnHand
 | PNUM |
 +------+
 |    8 |
+|   10 |
 +------+
-(1 row)
+(2 rows)
 
 !ok
-!}
 
 # [HIVE-7362]
 # Just checking that HAVING-EXISTS works.

http://git-wip-us.apache.org/repos/asf/calcite/blob/57b38db5/core/src/test/resources/sql/sub-query.iq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/sub-query.iq b/core/src/test/resources/sql/sub-query.iq
index c509ce2..a545af5 100644
--- a/core/src/test/resources/sql/sub-query.iq
+++ b/core/src/test/resources/sql/sub-query.iq
@@ -438,6 +438,43 @@ where sal + 100 not in (
 !ok
 !}
 
+# [CALCITE-356] AssertionError while translating query with WITH and correlated sub-query
+with t (a, b) as (select * from (values (1, 2)))
+select * from t where exists (select 1 from "scott".emp where deptno = t.a);
+EnumerableCalc(expr#0..2=[{inputs}], proj#0..1=[{exprs}])
+  EnumerableCorrelate(correlation=[$cor0], joinType=[INNER], requiredColumns=[{0}])
+    EnumerableValues(tuples=[[{ 1, 2 }]])
+    EnumerableAggregate(group=[{0}])
+      EnumerableCalc(expr#0..7=[{inputs}], expr#8=[true], expr#9=[CAST($t7):INTEGER], expr#10=[$cor0], expr#11=[$t10.A], expr#12=[=($t9, $t11)], i=[$t8], $condition=[$t12])
+        EnumerableTableScan(table=[[scott, EMP]])
+!plan
+
+# Similar query, identical plan
+with t as (select * from (values (1, 2)) as t(a, b))
+select * from t where exists (select 1 from "scott".emp where deptno = t.a);
+EnumerableCalc(expr#0..2=[{inputs}], proj#0..1=[{exprs}])
+  EnumerableCorrelate(correlation=[$cor0], joinType=[INNER], requiredColumns=[{0}])
+    EnumerableValues(tuples=[[{ 1, 2 }]])
+    EnumerableAggregate(group=[{0}])
+      EnumerableCalc(expr#0..7=[{inputs}], expr#8=[true], expr#9=[CAST($t7):INTEGER], expr#10=[$cor0], expr#11=[$t10.A], expr#12=[=($t9, $t11)], i=[$t8], $condition=[$t12])
+        EnumerableTableScan(table=[[scott, EMP]])
+!plan
+
+# Uncorrelated
+with t (a, b) as (select * from (values (60, 'b')))
+select * from t where a in (select deptno from "scott".dept);
+EnumerableSemiJoin(condition=[=($0, $2)], joinType=[inner])
+  EnumerableValues(tuples=[[{ 60, 'b' }]])
+  EnumerableTableScan(table=[[scott, DEPT]])
+!plan
++---+---+
+| A | B |
++---+---+
++---+---+
+(0 rows)
+
+!ok
+
 # [CALCITE-864] Correlation variable has incorrect row type if it is populated
 # by right side of a Join
 select *