You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by vl...@apache.org on 2018/09/20 08:28:11 UTC
calcite git commit: Avoid simplification of cast(null as integer) to
false in filter expressions broken by [CALCITE-2555]
Repository: calcite
Updated Branches:
refs/heads/master 4f1b5eff9 -> 8f202e918
Avoid simplification of cast(null as integer) to false in filter expressions broken by [CALCITE-2555]
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/8f202e91
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/8f202e91
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/8f202e91
Branch: refs/heads/master
Commit: 8f202e9189a6c1d0abbd8da09d7643b9efd4ad40
Parents: 4f1b5ef
Author: Vladimir Sitnikov <si...@gmail.com>
Authored: Thu Sep 20 11:25:13 2018 +0300
Committer: Vladimir Sitnikov <si...@gmail.com>
Committed: Thu Sep 20 11:27:53 2018 +0300
----------------------------------------------------------------------
.../org/apache/calcite/rex/RexSimplify.java | 3 +-
.../org/apache/calcite/test/RexProgramTest.java | 7 +++++
.../test/fuzzer/RexProgramFuzzyTest.java | 29 +++++++++++++++++---
3 files changed, 34 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/8f202e91/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 9da8d4a..1f84dec 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -180,7 +180,8 @@ public class RexSimplify {
private RexNode simplify_(RexNode e) {
if (strong.isNull(e)) {
- if (unknownAsFalse) {
+ // NULL integer must not be converted to FALSE even in unknownAsFalse mode
+ if (unknownAsFalse && e.getType().getSqlTypeName() == SqlTypeName.BOOLEAN) {
return rexBuilder.makeLiteral(false);
}
return rexBuilder.makeNullLiteral(e.getType());
http://git-wip-us.apache.org/repos/asf/calcite/blob/8f202e91/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 bf17c9d..d73e533 100644
--- a/core/src/test/java/org/apache/calcite/test/RexProgramTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RexProgramTest.java
@@ -2120,6 +2120,13 @@ public class RexProgramTest extends RexProgramBuilderBase {
"...", "...");
}
+ @Test
+ public void simplifyNull() {
+ checkSimplify2(nullBool, "null", "false");
+ // null int must not be simplified to false
+ checkSimplify2(nullInt, "null", "null");
+ }
+
/** Converts a map to a string, sorting on the string representation of its
* keys. */
private static String getString(ImmutableMap<RexNode, RexNode> map) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/8f202e91/core/src/test/java/org/apache/calcite/test/fuzzer/RexProgramFuzzyTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/fuzzer/RexProgramFuzzyTest.java b/core/src/test/java/org/apache/calcite/test/fuzzer/RexProgramFuzzyTest.java
index 159e88d..006cb9b 100644
--- a/core/src/test/java/org/apache/calcite/test/fuzzer/RexProgramFuzzyTest.java
+++ b/core/src/test/java/org/apache/calcite/test/fuzzer/RexProgramFuzzyTest.java
@@ -17,10 +17,13 @@
package org.apache.calcite.test.fuzzer;
import org.apache.calcite.plan.Strong;
+import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.rex.RexUtil;
import org.apache.calcite.sql.SqlOperator;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.sql.type.SqlTypeUtil;
import org.apache.calcite.test.RexProgramBuilderBase;
import org.apache.calcite.util.ImmutableBitSet;
@@ -218,10 +221,18 @@ public class RexProgramFuzzyTest extends RexProgramBuilderBase {
}
if (STRONG.isNull(node)) {
if (unknownAsFalse) {
- if (!falseLiteral.equals(opt)) {
- assertEquals(nodeToString(node)
- + " is always null, so it should simplify to FALSE " + uaf,
- falseLiteral, opt);
+ if (node.getType().getSqlTypeName() == SqlTypeName.BOOLEAN) {
+ if (!falseLiteral.equals(opt)) {
+ assertEquals(nodeToString(node)
+ + " is always null boolean, so it should simplify to FALSE " + uaf,
+ falseLiteral, opt);
+ }
+ } else {
+ if (!RexLiteral.isNullLiteral(opt)) {
+ assertEquals(nodeToString(node)
+ + " is always null (non boolean), so it should simplify to NULL " + uaf,
+ rexBuilder.makeNullLiteral(node.getType()), opt);
+ }
}
} else {
if (!RexUtil.isNull(opt)) {
@@ -231,6 +242,16 @@ public class RexProgramFuzzyTest extends RexProgramBuilderBase {
}
}
}
+ if (opt.getType().isNullable() && !node.getType().isNullable()) {
+ fail(nodeToString(node) + " had non-nullable type " + opt.getType()
+ + ", and it was optimized to " + nodeToString(opt)
+ + " that has nullable type " + opt.getType()
+ + ", " + uaf);
+ }
+ if (!SqlTypeUtil.equalSansNullability(typeFactory, node.getType(), opt.getType())) {
+ assertEquals(nodeToString(node) + " has different type after simplification to "
+ + nodeToString(opt), node.getType(), opt.getType());
+ }
}
private static String nodeToString(RexNode node) {