This is an automated email from the ASF dual-hosted git repository.

zabetak 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 af6367d61e [CALCITE-7441] AggregateFilterToFilteredAggregateRule fails 
when WHERE condition is nullable
af6367d61e is described below

commit af6367d61e844164e4b5813c8d99deacc0831f22
Author: Stamatis Zampetakis <[email protected]>
AuthorDate: Fri Mar 13 15:59:21 2026 +0100

    [CALCITE-7441] AggregateFilterToFilteredAggregateRule fails when WHERE 
condition is nullable
---
 .../rules/AggregateFilterToFilteredAggregateRule.java |  4 ++++
 .../AggregateFilterToFilteredAggregateRuleTest.java   |  6 ++++++
 .../AggregateFilterToFilteredAggregateRuleTest.xml    | 19 +++++++++++++++++++
 3 files changed, 29 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterToFilteredAggregateRule.java
 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterToFilteredAggregateRule.java
index dd82f69762..f814b6b9b8 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterToFilteredAggregateRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/AggregateFilterToFilteredAggregateRule.java
@@ -22,6 +22,7 @@
 import org.apache.calcite.rel.core.AggregateCall;
 import org.apache.calcite.rel.core.Filter;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.tools.RelBuilder;
 
 import org.immutables.value.Value;
@@ -76,6 +77,9 @@ private AggregateFilterToFilteredAggregateRule(Config config) 
{
         return;
       }
       RexNode condition = filter.getCondition();
+      if (condition.getType().isNullable()) {
+        condition = builder.call(SqlStdOperatorTable.IS_TRUE, condition);
+      }
       // If the aggregate call has its own filter, combine it with the filter 
condition.
       if (aggCall.hasFilter()) {
         condition = builder.and(condition, builder.field(aggCall.filterArg));
diff --git 
a/core/src/test/java/org/apache/calcite/test/AggregateFilterToFilteredAggregateRuleTest.java
 
b/core/src/test/java/org/apache/calcite/test/AggregateFilterToFilteredAggregateRuleTest.java
index 9e6cd3ea33..326524e747 100644
--- 
a/core/src/test/java/org/apache/calcite/test/AggregateFilterToFilteredAggregateRuleTest.java
+++ 
b/core/src/test/java/org/apache/calcite/test/AggregateFilterToFilteredAggregateRuleTest.java
@@ -58,6 +58,12 @@ private static RelOptFixture sql(String sql) {
         .withRule(AGGREGATE_FILTER_TO_FILTERED_AGGREGATE).check();
   }
 
+  @Test void testSingleColumnAggregateWithFilterOnNullableColumn() {
+    String sql = "select sum(sal) from emp where mgr = 10";
+    sql(sql).withPreRule(AGGREGATE_PROJECT_MERGE)
+        .withRule(AGGREGATE_FILTER_TO_FILTERED_AGGREGATE).check();
+  }
+
   @Test void testSingleStarAggregate() {
     String sql = "select count(*) from emp where deptno = 10";
     sql(sql).withPreRule(AGGREGATE_PROJECT_MERGE)
diff --git 
a/core/src/test/resources/org/apache/calcite/test/AggregateFilterToFilteredAggregateRuleTest.xml
 
b/core/src/test/resources/org/apache/calcite/test/AggregateFilterToFilteredAggregateRuleTest.xml
index b31112c3f3..47ca7c9bd1 100644
--- 
a/core/src/test/resources/org/apache/calcite/test/AggregateFilterToFilteredAggregateRuleTest.xml
+++ 
b/core/src/test/resources/org/apache/calcite/test/AggregateFilterToFilteredAggregateRuleTest.xml
@@ -101,6 +101,25 @@ LogicalAggregate(group=[{}], EXPR$0=[SUM($5)])
 LogicalAggregate(group=[{}], EXPR$0=[SUM($0) FILTER $1])
   LogicalProject(SAL=[$5], $f9=[=($7, 10)])
     LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testSingleColumnAggregateWithFilterOnNullableColumn">
+    <Resource name="sql">
+      <![CDATA[select sum(sal) from emp where mgr = 10]]>
+    </Resource>
+    <Resource name="planBefore">
+      <![CDATA[
+LogicalAggregate(group=[{}], EXPR$0=[SUM($5)])
+  LogicalFilter(condition=[=($3, 10)])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+    <Resource name="planAfter">
+      <![CDATA[
+LogicalAggregate(group=[{}], EXPR$0=[SUM($0) FILTER $1])
+  LogicalProject(SAL=[$5], $f9=[IS TRUE(=($3, 10))])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
 ]]>
     </Resource>
   </TestCase>

Reply via email to