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 <[email protected]>
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>. */