Repository: calcite
Updated Branches:
  refs/heads/master 9d6899c91 -> b78dd4a7e


[CALCITE-2586] RexSimplify: case with repeated branches results in assertion 
error (pengzhiwei)

closes #860


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

Branch: refs/heads/master
Commit: b78dd4a7e33607357ef530d0adb358e9741d9941
Parents: 9d6899c
Author: pengzhiwei <pengzhiwei2...@icloud.com>
Authored: Mon Sep 24 15:57:34 2018 +0800
Committer: Vladimir Sitnikov <sitnikov.vladi...@gmail.com>
Committed: Mon Sep 24 23:54:23 2018 +0300

----------------------------------------------------------------------
 core/src/main/java/org/apache/calcite/rex/RexSimplify.java     | 6 +++---
 core/src/main/java/org/apache/calcite/rex/RexUtil.java         | 4 +++-
 core/src/test/java/org/apache/calcite/test/RexProgramTest.java | 6 ++++++
 3 files changed, 12 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/b78dd4a7/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java 
b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
index c905fb8..5358f7f 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -705,11 +705,11 @@ public class RexSimplify {
           notTerms.add(pair.e.getKey());
         }
       }
-      final RexNode disjunction = RexUtil.composeDisjunction(rexBuilder, 
terms);
+      RexNode disjunction = RexUtil.composeDisjunction(rexBuilder, terms);
       if (!call.getType().equals(disjunction.getType())) {
-        return rexBuilder.makeCast(call.getType(), disjunction);
+        disjunction = rexBuilder.makeCast(call.getType(), disjunction);
       }
-      return disjunction;
+      return simplify_(disjunction);
     }
     if (newOperands.equals(operands)) {
       return call;

http://git-wip-us.apache.org/repos/asf/calcite/blob/b78dd4a7/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 d509ecb..0e44c25 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
@@ -1872,7 +1872,9 @@ public class RexUtil {
                 RexCall call2 = (RexCall) e2;
                 if (call2.getOperands().get(0)
                     .equals(call.getOperands().get(0))
-                    && call2.getOperands().get(1) instanceof RexLiteral) {
+                    && call2.getOperands().get(1) instanceof RexLiteral
+                    && !call.getOperands().get(1)
+                          .equals(call2.getOperands().get(1))) {
                   return false;
                 }
               }

http://git-wip-us.apache.org/repos/asf/calcite/blob/b78dd4a7/core/src/test/java/org/apache/calcite/test/RexProgramTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java 
b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java
index 00b20e4..4aa6a2c 100644
--- a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java
@@ -1120,6 +1120,12 @@ public class RexProgramTest extends 
RexProgramBuilderBase {
             falseLiteral, trueLiteral),
         "OR(?0.a, AND(?0.d, NOT(?0.b), NOT(?0.c)), AND(NOT(?0.b), NOT(?0.c), 
NOT(?0.e)))");
 
+    checkSimplify(
+        case_(eq(falseLiteral, falseLiteral), falseLiteral,
+              eq(falseLiteral, falseLiteral), trueLiteral,
+              trueLiteral
+    ), "false");
+
     // is null, applied to not-null value
     checkSimplify(rexBuilder.makeCall(SqlStdOperatorTable.IS_NULL, aRef),
         "false");

Reply via email to