diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java index 584cf5e1ebcd3e..78b0e8825ca34a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java @@ -61,6 +61,7 @@ import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.SlotReference; +import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator; import org.apache.doris.nereids.trees.expressions.functions.AggCombinerFunctionBuilder; import org.apache.doris.nereids.trees.expressions.functions.FunctionBuilder; import org.apache.doris.nereids.trees.expressions.functions.agg.BitmapUnion; @@ -284,8 +285,8 @@ private LogicalPlan preAggForRandomDistribution(LogicalOlapScan olapScan) { if (function == null) { return olapScan; } - Alias alias = new Alias(exprId, ImmutableList.of(function), col.getName(), - olapScan.qualified(), true); + Alias alias = new Alias(StatementScopeIdGenerator.newExprId(), ImmutableList.of(function), + col.getName(), olapScan.qualified(), true); outputExpressions.add(alias); } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/BindRelationTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/BindRelationTest.java index eaeaa3b2edda8b..428254a91c472a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/BindRelationTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/BindRelationTest.java @@ -20,10 +20,16 @@ import org.apache.doris.nereids.analyzer.UnboundRelation; import org.apache.doris.nereids.pattern.GeneratedPlanPatterns; import org.apache.doris.nereids.rules.RulePromise; +import org.apache.doris.nereids.trees.expressions.Alias; +import org.apache.doris.nereids.trees.expressions.ExprId; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; +import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanVisitor; +import org.apache.doris.nereids.util.PlanChecker; import org.apache.doris.nereids.util.PlanRewriter; import org.apache.doris.utframe.TestWithFeService; @@ -31,6 +37,11 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + class BindRelationTest extends TestWithFeService implements GeneratedPlanPatterns { private static final String DB1 = "db1"; private static final String DB2 = "db2"; @@ -93,6 +104,38 @@ void bindRandomAggTable() { plan.getOutput().get(1).getQualifier()); } + @Test + void testBindRandomAggTableExprIdSame() { + connectContext.getSessionVariable().setDisableNereidsRules("PRUNE_EMPTY_PARTITION"); + connectContext.getState().setIsQuery(true); + PlanChecker.from(connectContext) + .checkPlannerResult("select * from db1.tagg", + planner -> { + List collectedAlias = new ArrayList<>(); + planner.getCascadesContext().getRewritePlan().accept( + new DefaultPlanVisitor>() { + @Override + public Void visitLogicalAggregate(LogicalAggregate aggregate, + List context) { + for (Expression expression : aggregate.getExpressions()) { + collectedAlias.addAll( + expression.collectToList(Alias.class::isInstance)); + } + return super.visitLogicalAggregate(aggregate, context); + } + }, collectedAlias); + for (Alias alias : collectedAlias) { + for (Expression child : alias.children()) { + Set childExpressionSet = + child.collectToSet(NamedExpression.class::isInstance).stream() + .map(expr -> ((NamedExpression) expr).getExprId()) + .collect(Collectors.toSet()); + Assertions.assertFalse(childExpressionSet.contains(alias.getExprId())); + } + } + }); + } + @Override public RulePromise defaultPromise() { return RulePromise.REWRITE;