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>