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>

Reply via email to