This is an automated email from the ASF dual-hosted git repository. panxiaolei pushed a commit to branch tpc_preview3 in repository https://gitbox.apache.org/repos/asf/doris.git
commit e4981e83314fd632dd85f68836944e744d049350 Author: feiniaofeiafei <[email protected]> AuthorDate: Thu Nov 27 17:04:08 2025 +0800 fix --- .../glue/translator/PhysicalPlanTranslator.java | 2 +- .../translator/PhysicalPlanTranslatorTest.java | 41 +++++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java index dfc42ad653c..90a6bbc1119 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java @@ -1182,7 +1182,7 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla aggregationNode.setNereidsId(aggregate.getId()); context.getNereidsIdToPlanNodeIdMap().put(aggregate.getId(), aggregationNode.getId()); - if (isPartial) { + if (isPartial || aggregate.getAggregateParam().aggPhase.isLocal()) { aggregationNode.unsetNeedsFinalize(); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslatorTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslatorTest.java index e3ac7aff29c..04e59e6119f 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslatorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslatorTest.java @@ -35,9 +35,12 @@ import org.apache.doris.nereids.trees.plans.physical.PhysicalOlapScan; import org.apache.doris.nereids.trees.plans.physical.PhysicalProject; import org.apache.doris.nereids.types.IntegerType; import org.apache.doris.nereids.util.PlanConstructor; +import org.apache.doris.planner.AggregationNode; import org.apache.doris.planner.OlapScanNode; import org.apache.doris.planner.PlanFragment; import org.apache.doris.planner.PlanNode; +import org.apache.doris.planner.Planner; +import org.apache.doris.utframe.TestWithFeService; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -45,12 +48,13 @@ import mockit.Injectable; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; -public class PhysicalPlanTranslatorTest { +public class PhysicalPlanTranslatorTest extends TestWithFeService { @Test public void testOlapPrune(@Injectable LogicalProperties placeHolder) throws Exception { @@ -86,4 +90,39 @@ public class PhysicalPlanTranslatorTest { planNode.collect(OlapScanNode.class::isInstance, scanNodeList); Assertions.assertEquals(2, scanNodeList.get(0).getTupleDesc().getSlots().size()); } + + @Test + public void testAggNeedsFinalize() throws Exception { + createDatabase("test_db"); + createTable("create table test_db.t(a int, b int) distributed by hash(a) buckets 3 " + + "properties('replication_num' = '1');"); + connectContext.getSessionVariable().setDisableNereidsRules("prune_empty_partition"); + String querySql = "select b from test_db.t group by b"; + Planner planner = getSQLPlanner(querySql); + Assertions.assertNotNull(planner); + + List<PlanFragment> fragments = planner.getFragments(); + Assertions.assertNotNull(fragments); + Assertions.assertFalse(fragments.isEmpty()); + + List<AggregationNode> aggNodes = new ArrayList<>(); + for (PlanFragment fragment : fragments) { + PlanNode root = fragment.getPlanRoot(); + if (root != null) { + root.collect(AggregationNode.class::isInstance, aggNodes); + } + } + Assertions.assertEquals(2, aggNodes.size()); + Field needsFinalizeField = AggregationNode.class.getDeclaredField("needsFinalize"); + needsFinalizeField.setAccessible(true); + AggregationNode upperAggNode = aggNodes.get(0); + AggregationNode lowerAggNode = aggNodes.get(1); + + boolean lowerNeedsFinalize = needsFinalizeField.getBoolean(lowerAggNode); + Assertions.assertFalse(lowerNeedsFinalize, + "lower AggregationNode needsFinalize should be false"); + boolean upperNeedsFinalize = needsFinalizeField.getBoolean(upperAggNode); + Assertions.assertTrue(upperNeedsFinalize, + "upper AggregationNode needsFinalize should be true"); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
