Skip to content

Commit 09a1499

Browse files
committed
[CALCITE-7386] An error occurred while using TopDownGeneralDecorrelator to process the aggregate(col) filter
1 parent 341e8d5 commit 09a1499

2 files changed

Lines changed: 20 additions & 4 deletions

File tree

core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.apache.calcite.linq4j.function.Experimental;
2020
import org.apache.calcite.plan.RelOptCostImpl;
21+
import org.apache.calcite.plan.RelOptRule;
2122
import org.apache.calcite.plan.RelOptUtil;
2223
import org.apache.calcite.plan.Strong;
2324
import org.apache.calcite.plan.hep.HepPlanner;
@@ -35,6 +36,7 @@
3536
import org.apache.calcite.rel.core.SetOp;
3637
import org.apache.calcite.rel.core.Sort;
3738
import org.apache.calcite.rel.rules.CoreRules;
39+
import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
3840
import org.apache.calcite.rel.type.RelDataType;
3941
import org.apache.calcite.rex.RexCall;
4042
import org.apache.calcite.rex.RexCorrelVariable;
@@ -196,10 +198,26 @@ private TopDownGeneralDecorrelator createSubDecorrelator() {
196198
* @return Equivalent node without correlation
197199
*/
198200
public static RelNode decorrelateQuery(RelNode rel, RelBuilder builder) {
201+
// Use a custom FILTER_PROJECT_TRANSPOSE that does not push filters through
202+
// projects containing V2M (measure) expressions. Pushing a filter past a
203+
// V2M-carrying project changes the scope of the measure computation and
204+
// produces incorrect aggregate results.
205+
RelOptRule filterProjectTransposeNoV2m =
206+
CoreRules.FILTER_PROJECT_TRANSPOSE.config
207+
.as(FilterProjectTransposeRule.Config.class)
208+
.withOperandSupplier(b0 ->
209+
b0.operand(Filter.class)
210+
.predicate(f -> !RexUtil.containsCorrelation(f.getCondition()))
211+
.oneInput(b1 ->
212+
b1.operand(Project.class)
213+
.predicate(p -> !RexUtil.find(SqlKind.V2M).inProject(p))
214+
.anyInputs()))
215+
.as(FilterProjectTransposeRule.Config.class)
216+
.toRule();
199217
HepProgram preProgram = HepProgram.builder()
200218
.addRuleCollection(
201219
ImmutableList.of(
202-
CoreRules.FILTER_PROJECT_TRANSPOSE,
220+
filterProjectTransposeNoV2m,
203221
CoreRules.FILTER_INTO_JOIN,
204222
CoreRules.FILTER_CORRELATE))
205223
.build();
@@ -226,7 +244,7 @@ public static RelNode decorrelateQuery(RelNode rel, RelBuilder builder) {
226244
HepProgram postProgram = HepProgram.builder()
227245
.addRuleCollection(
228246
ImmutableList.of(
229-
CoreRules.FILTER_PROJECT_TRANSPOSE,
247+
filterProjectTransposeNoV2m,
230248
CoreRules.FILTER_INTO_JOIN,
231249
CoreRules.MARK_TO_SEMI_OR_ANTI_JOIN_RULE,
232250
CoreRules.PROJECT_MERGE,

core/src/test/resources/sql/measure.iq

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,6 @@ group by deptno, deptno2;
667667

668668
!ok
669669

670-
!if (use_old_decorr) {
671670
# Measure with FILTER
672671
select job,
673672
c,
@@ -690,7 +689,6 @@ group by job;
690689
(3 rows)
691690

692691
!ok
693-
!}
694692

695693
!if (false) {
696694
# Null values in GROUP BY

0 commit comments

Comments
 (0)