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 *