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 2016/11/23 02:41:38 UTC

calcite git commit: [CALCITE-1502] AssertionError in ReduceExpressionsRule when CASE is used with optional value and literal (Serhii Harnyk)

Repository: calcite
Updated Branches:
  refs/heads/master b196b26d0 -> 9b62ab3dc


[CALCITE-1502] AssertionError in ReduceExpressionsRule when CASE is used with optional value and literal (Serhii Harnyk)

Close apache/calcite#328


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

Branch: refs/heads/master
Commit: 9b62ab3dca7c3c8aac3f8c0106ecc459a291d9a6
Parents: b196b26
Author: Serhii-Harnyk <se...@gmail.com>
Authored: Tue Nov 22 13:22:57 2016 +0000
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Nov 22 18:40:52 2016 -0800

----------------------------------------------------------------------
 .../java/org/apache/calcite/rex/RexUtil.java    |  7 ++++---
 .../apache/calcite/test/RelOptRulesTest.java    | 12 +++++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml | 21 ++++++++++++++++++++
 3 files changed, 37 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/9b62ab3d/core/src/main/java/org/apache/calcite/rex/RexUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexUtil.java b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
index 5766177..0301d7a 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
@@ -1819,10 +1819,11 @@ public class RexUtil {
     }
     assert newOperands.size() % 2 == 1;
     if (newOperands.size() == 1 || values.size() == 1) {
-      if (!call.getType().equals(newOperands.get(newOperands.size() - 1).getType())) {
-        return rexBuilder.makeCast(call.getType(), newOperands.get(newOperands.size() - 1));
+      final RexNode last = Util.last(newOperands);
+      if (!call.getType().equals(last.getType())) {
+        return rexBuilder.makeAbstractCast(call.getType(), last);
       }
-      return newOperands.get(newOperands.size() - 1);
+      return last;
     }
   trueFalse:
     if (call.getType().getSqlTypeName() == SqlTypeName.BOOLEAN) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/9b62ab3d/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index 82269b3..a87da61 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -213,6 +213,18 @@ public class RelOptRulesTest extends RelOptTestBase {
     checkPlanning(tester, preProgram, hepPlanner, sql);
   }
 
+  @Test public void testReduceNullableCase() {
+    HepProgramBuilder builder = new HepProgramBuilder();
+    builder.addRuleClass(ReduceExpressionsRule.class);
+    HepPlanner hepPlanner = new HepPlanner(builder.build());
+    hepPlanner.addRule(ReduceExpressionsRule.PROJECT_INSTANCE);
+
+    final String sql = "SELECT CASE WHEN 1=2 "
+      + "THEN cast((values(1)) as integer) "
+      + "ELSE 2 end from (values(1))";
+    sql(sql).with(hepPlanner).check();
+  }
+
   @Test public void testProjectToWindowRuleForMultipleWindows() {
     HepProgram preProgram = new HepProgramBuilder()
         .build();

http://git-wip-us.apache.org/repos/asf/calcite/blob/9b62ab3d/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 6c97d6a..0e7432f 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -61,6 +61,27 @@ LogicalProject(SAL=[$5])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testReduceNullableCase">
+        <Resource name="sql">
+            <![CDATA[SELECT CASE WHEN 1=2 THEN cast((values(1)) as integer) ELSE 2 end as state_nm from (values(1)) as a]]>
+        </Resource>
+        <Resource name="planBefore">
+            <![CDATA[
+LogicalProject(EXPR$0=[CASE(=(1, 2), CAST($1):INTEGER, 2)])
+  LogicalJoin(condition=[true], joinType=[left])
+    LogicalValues(tuples=[[{ 1 }]])
+    LogicalValues(tuples=[[{ 1 }]])
+]]>
+        </Resource>
+        <Resource name="planAfter">
+            <![CDATA[
+LogicalProject(EXPR$0=[CAST(2):INTEGER])
+  LogicalJoin(condition=[true], joinType=[left])
+    LogicalValues(tuples=[[{ 1 }]])
+    LogicalValues(tuples=[[{ 1 }]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testWindowInParenthesis">
         <Resource name="sql">
             <![CDATA[select count(*) over (w), count(*) over w