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 2015/03/23 09:11:50 UTC

[6/8] incubator-calcite git commit: [CALCITE-614] IN clause in CASE in GROUP BY gives AssertionError

[CALCITE-614] IN clause in CASE in GROUP BY gives AssertionError


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

Branch: refs/heads/master
Commit: 321217ddd6629fda3e2620c39283c415724c123e
Parents: 119a399
Author: Julian Hyde <jh...@apache.org>
Authored: Mon Mar 16 13:40:35 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Mar 17 19:44:13 2015 -0700

----------------------------------------------------------------------
 .../calcite/sql2rel/SqlToRelConverter.java      | 38 ++++++++------------
 .../calcite/test/SqlToRelConverterTest.java     | 27 ++++++++++----
 .../calcite/test/SqlToRelConverterTest.xml      | 33 ++++++++++-------
 3 files changed, 56 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/321217dd/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 207b2dc..7fadfa0 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -4004,6 +4004,11 @@ public class SqlToRelConverter {
     }
 
     void registerSubquery(SqlNode node, RelOptUtil.Logic logic) {
+      for (SubQuery subQuery : subqueryList) {
+        if (node.equalsDeep(subQuery.node, false)) {
+          return;
+        }
+      }
       subqueryList.add(new SubQuery(node, logic));
     }
 
@@ -4039,14 +4044,19 @@ public class SqlToRelConverter {
         return rex;
       }
 
-      boolean needTruthTest;
-
       // Sub-queries and OVER expressions are not like ordinary
       // expressions.
       final SqlKind kind = expr.getKind();
       final SubQuery subQuery;
       switch (kind) {
       case CURSOR:
+      case IN:
+        subQuery = subqueryMap.get(expr);
+        assert subQuery != null;
+        rex = subQuery.expr;
+        assert rex != null : "rex != null";
+        return rex;
+
       case SELECT:
       case EXISTS:
       case SCALAR_QUERY:
@@ -4055,10 +4065,6 @@ public class SqlToRelConverter {
         rex = subQuery.expr;
         assert rex != null : "rex != null";
 
-        if (kind == SqlKind.CURSOR) {
-          // cursor reference is pre-baked
-          return rex;
-        }
         if (((kind == SqlKind.SCALAR_QUERY)
             || (kind == SqlKind.EXISTS))
             && isConvertedSubq(rex)) {
@@ -4067,11 +4073,8 @@ public class SqlToRelConverter {
           return rex;
         }
 
-        RexNode fieldAccess;
-        needTruthTest = false;
-
         // The indicator column is the last field of the subquery.
-        fieldAccess =
+        RexNode fieldAccess =
             rexBuilder.makeFieldAccess(
                 rex,
                 rex.getType().getFieldCount() - 1);
@@ -4079,13 +4082,8 @@ public class SqlToRelConverter {
         // The indicator column will be nullable if it comes from
         // the null-generating side of the join. For EXISTS, add an
         // "IS TRUE" check so that the result is "BOOLEAN NOT NULL".
-        if (fieldAccess.getType().isNullable()) {
-          if (kind == SqlKind.EXISTS) {
-            needTruthTest = true;
-          }
-        }
-
-        if (needTruthTest) {
+        if (fieldAccess.getType().isNullable()
+            && kind == SqlKind.EXISTS) {
           fieldAccess =
               rexBuilder.makeCall(
                   SqlStdOperatorTable.IS_NOT_NULL,
@@ -4093,12 +4091,6 @@ public class SqlToRelConverter {
         }
         return fieldAccess;
 
-      case IN:
-        subQuery = subqueryMap.get(expr);
-        assert subQuery != null;
-        assert subQuery.expr != null : "expr != null";
-        return subQuery.expr;
-
       case OVER:
         return convertOver(this, expr);
 

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/321217dd/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 04fd420..c19ec03 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -97,8 +97,8 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
 
   /**
    * Test case for
-   * <a href="https://issues.apache.org/jira/browse/CALCITE-245">CALCITE-245</a>,
-   * "Off-by-one translation of ON clause of JOIN".
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-245">[CALCITE-245]
+   * Off-by-one translation of ON clause of JOIN</a>.
    */
   @Test public void testConditionOffByOne() {
     // Bug causes the plan to contain
@@ -132,8 +132,9 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
   }
 
   /** Test case for
-   * <a href="https://issues.apache.org/jira/browse/CALCITE-74">CALCITE-74</a>,
-   * "JOIN ... USING fails in 3-way join with UnsupportedOperationException". */
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-74">[CALCITE-74]
+   * JOIN ... USING fails in 3-way join with
+   * UnsupportedOperationException</a>. */
   @Test public void testJoinUsingThreeWay() {
     check(
         "select *\n"
@@ -1081,9 +1082,9 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
   }
 
   /** Test case for
-   * <a href="https://issues.apache.org/jira/browse/CALCITE-412">CALCITE-412</a>,
-   * "RelFieldTrimmer: when trimming Sort, the collation and trait set don't
-   * match". */
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-412">[CALCITE-412]
+   * RelFieldTrimmer: when trimming Sort, the collation and trait set don't
+   * match</a>. */
   @Test public void testSortWithTrim() {
     tester.assertConvertsTo(
         "select ename from (select * from emp order by sal) a", "${plan}",
@@ -1124,6 +1125,18 @@ public class SqlToRelConverterTest extends SqlToRelTestBase {
   }
 
   /**
+   * Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-614">[CALCITE-614]
+   * IN within CASE within GROUP BY gives AssertionError</a>.
+   */
+  @Test public void testGroupByCaseIn() {
+    sql("select (CASE WHEN (deptno IN (10, 20)) THEN 0 ELSE deptno END),\n"
+        + " min(empno) from EMP\n"
+        + "group by (CASE WHEN (deptno IN (10, 20)) THEN 0 ELSE deptno END)")
+        .convertsTo("${plan}");
+  }
+
+  /**
    * Visitor that checks that every {@link RelNode} in a tree is valid.
    *
    * @see RelNode#isValid(boolean)

http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/321217dd/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 6566401..3cfde9d 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -2342,18 +2342,13 @@ FROM emp]]>
         </Resource>
         <Resource name="plan">
             <![CDATA[
-LogicalProject(EXPR$0=[$0])
-  LogicalJoin(condition=[true], joinType=[left])
-    LogicalAggregate(group=[{}], EXPR$0=[SUM($0)])
-      LogicalProject(EXPR$0=[$9])
-        LogicalJoin(condition=[true], joinType=[left])
-          LogicalTableScan(table=[[CATALOG, SALES, EMP]])
-          LogicalAggregate(group=[{}], EXPR$0=[MIN($0)])
-            LogicalProject(DEPTNO=[$0])
-              LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
-    LogicalAggregate(group=[{}], EXPR$0=[MIN($0)])
-      LogicalProject(DEPTNO=[$0])
-        LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+LogicalAggregate(group=[{}], EXPR$0=[SUM($0)])
+  LogicalProject(EXPR$0=[$9])
+    LogicalJoin(condition=[true], joinType=[left])
+      LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+      LogicalAggregate(group=[{}], EXPR$0=[MIN($0)])
+        LogicalProject(DEPTNO=[$0])
+          LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
 ]]>
         </Resource>
     </TestCase>
@@ -2401,4 +2396,18 @@ LogicalDelta
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testGroupByCaseIn">
+        <Resource name="sql">
+            <![CDATA[select (CASE WHEN (deptno IN (10, 20)) THEN 0 ELSE deptno END),
+ min(empno) from EMP
+group by (CASE WHEN (deptno IN (10, 20)) THEN 0 ELSE deptno END)]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalAggregate(group=[{0}], EXPR$1=[MIN($1)])
+  LogicalProject(EXPR$0=[CASE(OR(=($7, 10), =($7, 20)), 0, $7)], EMPNO=[$0])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+        </Resource>
+    </TestCase>
 </Root>