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 4c137e4732..a05c5c94bf 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 @@ -1361,7 +1361,10 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor slotList = project.getOutput(); + List slotList = project.getProjects() + .stream() + .map(e -> e.toSlot()) + .collect(Collectors.toList()); // For hash join node, use vSrcToOutputSMap to describe the expression calculation, use // vIntermediateTupleDescList as input, and set vOutputTupleDesc as the final output. // TODO: HashJoinNode's be implementation is not support projection yet, remove this after when supported. diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/ApplyRuleJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/ApplyRuleJob.java index 1f653b22f4..d3e6031e3f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/ApplyRuleJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/ApplyRuleJob.java @@ -76,6 +76,7 @@ public class ApplyRuleJob extends Job { continue; } GroupExpression newGroupExpression = result.correspondingExpression; + newGroupExpression.setFromRule(rule); if (newPlan instanceof LogicalPlan) { pushJob(new OptimizeGroupExpressionJob(newGroupExpression, context)); } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java index 4555935f25..370fabaf0e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java @@ -56,6 +56,9 @@ public class GroupExpression { private long estOutputRowCount = -1; + //Record the rule that generate this plan. It's used for debugging + private Rule fromRule; + // Mapping from output properties to the corresponding best cost, statistics, and child properties. // key is the physical properties the group expression support for its parent // and value is cost and request physical properties to its children. @@ -99,6 +102,10 @@ public class GroupExpression { return children.size(); } + public void setFromRule(Rule rule) { + this.fromRule = rule; + } + public Group getOwnerGroup() { return ownerGroup; }