This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new 5c6e2a6052d branch-3.0: [fix](nereids) Fix the expr id are same but 
different expr when agg table with random distribute #52993 (#53619)
5c6e2a6052d is described below

commit 5c6e2a6052d9ff22f4d690ad6a66be51c880d226
Author: seawinde <[email protected]>
AuthorDate: Tue Aug 12 10:31:25 2025 +0800

    branch-3.0: [fix](nereids) Fix the expr id are same but different expr when 
agg table with random distribute #52993 (#53619)
    
    picked from #52993
---
 .../doris/nereids/rules/analysis/BindRelation.java |  5 ++-
 .../nereids/rules/analysis/BindRelationTest.java   | 43 ++++++++++++++++++++++
 2 files changed, 46 insertions(+), 2 deletions(-)

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 8db2e6f0c7a..274801f7fd6 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
@@ -59,6 +59,7 @@ import org.apache.doris.nereids.trees.expressions.Expression;
 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;
@@ -282,8 +283,8 @@ public class BindRelation extends OneAnalysisRuleFactory {
                 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 eaeaa3b2edd..428254a91c4 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 @@ package org.apache.doris.nereids.rules.analysis;
 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 com.google.common.collect.ImmutableList;
 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 @@ class BindRelationTest extends TestWithFeService implements 
GeneratedPlanPattern
                 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<Alias> collectedAlias = new ArrayList<>();
+                            
planner.getCascadesContext().getRewritePlan().accept(
+                                    new DefaultPlanVisitor<Void, 
List<Alias>>() {
+                                        @Override
+                                        public Void 
visitLogicalAggregate(LogicalAggregate<? extends Plan> aggregate,
+                                                List<Alias> 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<ExprId> 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;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to