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");