[CALCITE-1982] NPE simplifying range expressions when literal value is null
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/d633402c Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/d633402c Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/d633402c Branch: refs/heads/branch-1.14 Commit: d633402c41158da3fc00eebcf0e75b0c7da71450 Parents: 67071b6 Author: Jesus Camacho Rodriguez <[email protected]> Authored: Tue Sep 12 10:13:17 2017 -0700 Committer: Jesus Camacho Rodriguez <[email protected]> Committed: Tue Sep 12 10:13:17 2017 -0700 ---------------------------------------------------------------------- .../main/java/org/apache/calcite/rex/RexSimplify.java | 11 ++++++++--- .../java/org/apache/calcite/test/RexProgramTest.java | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d633402c/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 52c4795..286a697 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java @@ -613,13 +613,18 @@ public class RexSimplify { RexCall rightCast = (RexCall) right; comparedOperands.add(rightCast.getOperands().get(0).toString()); } - // Check for equality on different constants. If the same ref or CAST(ref) - // is equal to different constants, this condition cannot be satisfied, - // and hence it can be evaluated to FALSE final boolean leftRef = RexUtil.isReferenceOrAccess(left, true); final boolean rightRef = RexUtil.isReferenceOrAccess(right, true); final boolean leftConstant = left.isA(SqlKind.LITERAL); final boolean rightConstant = right.isA(SqlKind.LITERAL); + // Check for comparison with null values + if (leftConstant && ((RexLiteral) left).getValue() == null + || rightConstant && ((RexLiteral) right).getValue() == null) { + return rexBuilder.makeLiteral(false); + } + // Check for equality on different constants. If the same ref or CAST(ref) + // is equal to different constants, this condition cannot be satisfied, + // and hence it can be evaluated to FALSE if (term.getKind() == SqlKind.EQUALS) { if (leftRef && rightConstant) { final String literal = right.toString(); http://git-wip-us.apache.org/repos/asf/calcite/blob/d633402c/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 f82a265..b0467d6 100644 --- a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java +++ b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java @@ -1311,6 +1311,9 @@ public class RexProgramTest { checkSimplifyFilter( case_(aRef, trueLiteral, bRef, trueLiteral, cRef, falseLiteral, dRef, falseLiteral, unknownLiteral), "CAST(OR(?0.a, ?0.b)):BOOLEAN"); + + // condition with null value for range + checkSimplifyFilter(and(gt(aRef, unknownLiteral), ge(bRef, literal1)), "false"); } /** Unit test for
