You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by li...@apache.org on 2023/06/14 07:13:07 UTC
[calcite] branch main updated: [CALCITE-5759] 'SEARCH(1, Sarg[IS NOT NULL])' should be simplified to 'TRUE'
This is an automated email from the ASF dual-hosted git repository.
libenchao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 10f1744709 [CALCITE-5759] 'SEARCH(1, Sarg[IS NOT NULL])' should be simplified to 'TRUE'
10f1744709 is described below
commit 10f1744709cc7d897651314c03b69f8e4b959bce
Author: Runkang He <hr...@gmail.com>
AuthorDate: Sat Jun 10 11:39:37 2023 +0800
[CALCITE-5759] 'SEARCH(1, Sarg[IS NOT NULL])' should be simplified to 'TRUE'
Close apache/calcite#3257
---
.../java/org/apache/calcite/rex/RexSimplify.java | 3 +-
.../org/apache/calcite/rex/RexProgramTest.java | 66 ++++++++++++++++++++++
2 files changed, 68 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 b22ec3a77f..9068726a49 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -2125,7 +2125,8 @@ public class RexSimplify {
RexLiteral literal = (RexLiteral) call.getOperands().get(1);
final Sarg sarg = castNonNull(literal.getValueAs(Sarg.class));
if (sarg.isAll() || sarg.isNone()) {
- return RexUtil.simpleSarg(rexBuilder, a, sarg, unknownAs);
+ RexNode rexNode = RexUtil.simpleSarg(rexBuilder, a, sarg, unknownAs);
+ return simplify(rexNode, unknownAs);
}
// Remove null from sarg if the left-hand side is never null
if (sarg.nullAs != UNKNOWN) {
diff --git a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
index 8d695afbde..499b92525f 100644
--- a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
+++ b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java
@@ -1768,6 +1768,72 @@ class RexProgramTest extends RexProgramTestBase {
checkSimplify(expr, simplified);
}
+ /** Unit test for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-5759">[CALCITE-5759]
+ * 'SEARCH(1, Sarg[IS NOT NULL])' should be simplified to 'TRUE'</a>. */
+ @Test void testSimplifySearchWithSpecialSargIsNotNull() {
+ // "SEARCH(1, Sarg[IS NOT NULL])" simplifies to "true"
+ RexNode intLiteral =
+ rexBuilder.makeLiteral(1, typeFactory.createSqlType(SqlTypeName.INTEGER));
+ final RangeSet<Integer> setNone = ImmutableRangeSet.of();
+ final RangeSet<Integer> setAll = setNone.complement();
+ final Sarg<Integer> sarg =
+ Sarg.of(RexUnknownAs.FALSE, setAll);
+ RexNode rexNode =
+ rexBuilder.makeCall(SqlStdOperatorTable.SEARCH, intLiteral,
+ rexBuilder.makeSearchArgumentLiteral(sarg, intLiteral.getType()));
+ checkSimplify(rexNode, "true");
+ }
+
+ /** Unit test for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-5759">[CALCITE-5759]
+ * 'SEARCH(1, Sarg[IS NOT NULL])' should be simplified to 'TRUE'</a>. */
+ @Test void testSimplifySearchWithSpecialSargIsNull() {
+ // "SEARCH(1, Sarg[IS NULL])" simplifies to "false"
+ RexNode intLiteral =
+ rexBuilder.makeLiteral(1, typeFactory.createSqlType(SqlTypeName.INTEGER));
+ final RangeSet<Integer> setNone = ImmutableRangeSet.of();
+ final Sarg<Integer> sarg =
+ Sarg.of(RexUnknownAs.TRUE, setNone);
+ RexNode rexNode =
+ rexBuilder.makeCall(SqlStdOperatorTable.SEARCH, intLiteral,
+ rexBuilder.makeSearchArgumentLiteral(sarg, intLiteral.getType()));
+ checkSimplify(rexNode, "false");
+ }
+
+ /** Unit test for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-5759">[CALCITE-5759]
+ * 'SEARCH(1, Sarg[IS NOT NULL])' should be simplified to 'TRUE'</a>. */
+ @Test void testSimplifySearchWithSpecialSargEqual() {
+ // "SEARCH(1, Sarg[=])" simplifies to "true"
+ RexNode intLiteral =
+ rexBuilder.makeLiteral(1, typeFactory.createSqlType(SqlTypeName.INTEGER));
+ final RangeSet<Integer> setNone = ImmutableRangeSet.of();
+ final RangeSet<Integer> setAll = setNone.complement();
+ final Sarg<Integer> sarg =
+ Sarg.of(RexUnknownAs.UNKNOWN, setAll);
+ RexNode rexNode =
+ rexBuilder.makeCall(SqlStdOperatorTable.SEARCH, intLiteral,
+ rexBuilder.makeSearchArgumentLiteral(sarg, intLiteral.getType()));
+ checkSimplify(rexNode, "true");
+ }
+
+ /** Unit test for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-5759">[CALCITE-5759]
+ * 'SEARCH(1, Sarg[IS NOT NULL])' should be simplified to 'TRUE'</a>. */
+ @Test void testSimplifySearchWithSpecialSargNotEqual() {
+ // "SEARCH(1, Sarg[<>])" simplifies to "false"
+ RexNode intLiteral =
+ rexBuilder.makeLiteral(1, typeFactory.createSqlType(SqlTypeName.INTEGER));
+ final RangeSet<Integer> setNone = ImmutableRangeSet.of();
+ final Sarg<Integer> sarg =
+ Sarg.of(RexUnknownAs.UNKNOWN, setNone);
+ RexNode rexNode =
+ rexBuilder.makeCall(SqlStdOperatorTable.SEARCH, intLiteral,
+ rexBuilder.makeSearchArgumentLiteral(sarg, intLiteral.getType()));
+ checkSimplify(rexNode, "false");
+ }
+
/** Unit test for
* <a href="https://issues.apache.org/jira/browse/CALCITE-4352">[CALCITE-4352]
* OR simplification incorrectly loses term</a>. */