This is an automated email from the ASF dual-hosted git repository.

kgyrtkirk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 9924699  [CALCITE-2848] Simplifying a case statement's first branch 
should ignore its safety
9924699 is described below

commit 9924699e534516f47363aa30d23fb9e64e34ed29
Author: Zoltan Haindrich <[email protected]>
AuthorDate: Fri Feb 15 00:42:38 2019 +0100

    [CALCITE-2848] Simplifying a case statement's first branch should ignore 
its safety
    
    Earlier when a CASE expression had any condition/value which contained 
probably dangerous instructions,
    the rewrite to a boolean expression was abandoned.
    This change relaxes the check to omit it for first branch's condition - 
because that would be evaluated anyway.
---
 core/src/main/java/org/apache/calcite/rex/RexSimplify.java     | 3 ++-
 core/src/test/java/org/apache/calcite/test/RexProgramTest.java | 7 +++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

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 8fa8a8b..fb98d8d 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -952,7 +952,8 @@ public class RexSimplify {
     // but not interfere with the normal simplifcation recursion
     List<CaseBranch> branches = new ArrayList<>();
     for (CaseBranch branch : inputBranches) {
-      if (!isSafeExpression(branch.cond) || !isSafeExpression(branch.value)) {
+      if ((branches.size() > 0 && !isSafeExpression(branch.cond))
+          || !isSafeExpression(branch.value)) {
         return null;
       }
       RexNode cond;
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 0fa89d6..2304522 100644
--- a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java
@@ -1874,6 +1874,13 @@ public class RexProgramTest extends 
RexProgramBuilderBase {
     checkSimplifyUnchanged(caseNode);
   }
 
+  @Test public void testSimplifyCaseFirstBranchIsSafe() {
+    RexNode caseNode = case_(
+        gt(div(vIntNotNull(), literal(1)), literal(1)), falseLiteral,
+        trueLiteral);
+    checkSimplify(caseNode, "<=(/(?0.notNullInt0, 1), 1)");
+  }
+
   @Test public void testSimplifyAnd() {
     RelDataType booleanNotNullableType =
         typeFactory.createTypeWithNullability(

Reply via email to