This is an automated email from the ASF dual-hosted git repository.
mbudiu 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 cf91ec8f36 [CALCITE-7070] FILTER_REDUCE_EXPRESSIONS crashes on
expression BETWEEN ( NULL) AND X
cf91ec8f36 is described below
commit cf91ec8f36e1f7cf9656e2f794d8f78a2b43d88c
Author: Mihai Budiu <[email protected]>
AuthorDate: Mon Jun 23 14:29:54 2025 -0700
[CALCITE-7070] FILTER_REDUCE_EXPRESSIONS crashes on expression BETWEEN (
NULL) AND X
Signed-off-by: Mihai Budiu <[email protected]>
---
.../main/java/org/apache/calcite/rex/RexSimplify.java | 3 +--
.../java/org/apache/calcite/test/RelOptRulesTest.java | 10 ++++++++++
.../org/apache/calcite/test/RelOptRulesTest.xml | 18 ++++++++++++++++++
3 files changed, 29 insertions(+), 2 deletions(-)
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 ed1b019d58..bffcf60a1b 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java
@@ -1965,8 +1965,7 @@ private static <C extends Comparable<C>> RangeSet<C>
residue(RexNode ref,
if (comparison != null && comparison.ref.equals(ref)) {
final C c1 = comparison.literal.getValueAs(clazz);
if (c1 == null) {
- throw new AssertionError("value must not be null in "
- + comparison.literal);
+ continue;
}
switch (predicate.getKind()) {
case NOT_EQUALS:
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index b8241d4e1b..a92b57de42 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -4057,6 +4057,16 @@ private void
checkPushJoinThroughUnionOnRightDoesNotMatchSemiOrAntiJoin(JoinRelT
.check();
}
+ /** Test case for <a
href="https://issues.apache.org/jira/browse/CALCITE-7070">[CALCITE-7070]
+ * FILTER_REDUCE_EXPRESSIONS crashes on expression BETWEEN ( NULL) AND
X</a>. */
+ @Test void testFilterReduceCrash() {
+ final String sql = "SELECT + 54 FROM emp WHERE NOT CAST ( CAST(empno AS
DOUBLE) AS INTEGER ) "
+ + "NOT BETWEEN ( NULL ) AND 89";
+ sql(sql)
+ .withRule(CoreRules.FILTER_REDUCE_EXPRESSIONS)
+ .check();
+ }
+
/** Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-570">[CALCITE-570]
* ReduceExpressionsRule throws "duplicate key" exception</a>. */
diff --git
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index c00c7dc012..e3d2473a54 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -5424,6 +5424,24 @@ LogicalAggregate(group=[{}], EXPR$0=[COUNT()])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
}))])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testFilterReduceCrash">
+ <Resource name="sql">
+ <![CDATA[SELECT + 54 FROM emp WHERE NOT CAST ( CAST(empno AS DOUBLE) AS
INTEGER ) NOT BETWEEN ( NULL ) AND 89]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(EXPR$0=[54])
+ LogicalFilter(condition=[NOT(NOT(AND(>=(CAST(CAST($0):DOUBLE NOT
NULL):INTEGER NOT NULL, null), <=(CAST(CAST($0):DOUBLE NOT NULL):INTEGER NOT
NULL, 89))))])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalProject(EXPR$0=[54])
+ LogicalValues(tuples=[[]])
]]>
</Resource>
</TestCase>