From 0f93ee87936b198afdef93489a6e9c2290e5a7df Mon Sep 17 00:00:00 2001 From: jakevin Date: Fri, 15 Dec 2023 16:18:16 +0800 Subject: [PATCH] [fix](Nereids): TransposeSemiJoinAgg can't apply in Scalar Agg (#28434) Scalar Agg shouldn't be pushdown, it will cause wrong result --- .../nereids/rules/rewrite/TransposeSemiJoinAgg.java | 4 ++++ .../rules/rewrite/TransposeSemiJoinAggTest.java | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAgg.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAgg.java index 864b5bb03a..9ae2e14be5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAgg.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAgg.java @@ -51,6 +51,10 @@ public class TransposeSemiJoinAgg extends OneRewriteRuleFactory { public static boolean canTranspose(LogicalAggregate aggregate, LogicalJoin join) { Set canPushDownSlots = PushDownFilterThroughAggregation.getCanPushDownSlots(aggregate); + // avoid push down scalar agg. + if (canPushDownSlots.isEmpty()) { + return false; + } Set leftConditionSlot = join.getLeftConditionSlot(); return canPushDownSlots.containsAll(leftConditionSlot); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAggTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAggTest.java index 4c49d3f640..b79e01e478 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAggTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/TransposeSemiJoinAggTest.java @@ -18,6 +18,7 @@ package org.apache.doris.nereids.rules.rewrite; import org.apache.doris.common.Pair; +import org.apache.doris.nereids.trees.expressions.functions.agg.Sum; import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; @@ -49,4 +50,15 @@ class TransposeSemiJoinAggTest implements MemoPatternMatchSupported { ); } + @Test + void rejectScalarAgg() { + LogicalPlan plan = new LogicalPlanBuilder(scan1) + .agg(ImmutableList.of(), ImmutableList.of((new Sum(scan1.getOutput().get(0))).alias("sum"))) + .join(scan2, JoinType.LEFT_SEMI_JOIN, Pair.of(0, 0)) + .build(); + PlanChecker.from(MemoTestUtils.createConnectContext(), plan) + .applyTopDown(new TransposeSemiJoinAgg()) + .matchesFromRoot(leftSemiLogicalJoin(logicalAggregate(), logicalOlapScan())); + } + }