You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2025/11/08 13:14:31 UTC
(doris) branch branch-4.0 updated: branch-4.0: [optimize](nereids) explain plan process print change point #57772 (#57787)
This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.0 by this push:
new 219b30f35a7 branch-4.0: [optimize](nereids) explain plan process print change point #57772 (#57787)
219b30f35a7 is described below
commit 219b30f35a754b8c35fcdc1a92f359ba1bc19db1
Author: github-actions[bot] <41...@users.noreply.github.com>
AuthorDate: Sat Nov 8 21:14:25 2025 +0800
branch-4.0: [optimize](nereids) explain plan process print change point #57772 (#57787)
Cherry-picked from #57772
Co-authored-by: 924060929 <la...@selectdb.com>
---
.../main/java/org/apache/doris/nereids/NereidsPlanner.java | 4 +++-
.../nereids/jobs/rewrite/BottomUpVisitorRewriteJob.java | 4 ++--
.../apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java | 4 +++-
.../doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java | 12 ++++++------
.../apache/doris/nereids/jobs/rewrite/RewriteJobContext.java | 5 +++++
.../doris/nereids/jobs/rewrite/RootPlanTreeRewriteJob.java | 1 +
.../doris/nereids/jobs/rewrite/TopDownVisitorRewriteJob.java | 4 ++--
.../org/apache/doris/nereids/trees/plans/AbstractPlan.java | 12 +++++++++---
.../java/org/apache/doris/nereids/trees/plans/FakePlan.java | 2 +-
.../main/java/org/apache/doris/nereids/trees/plans/Plan.java | 6 +++++-
.../test/java/org/apache/doris/nereids/stats/DummyPlan.java | 2 +-
11 files changed, 38 insertions(+), 18 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
index 75c2b3fe7f5..f701ff0edfd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
@@ -235,7 +235,9 @@ public class NereidsPlanner extends Planner {
case ALL_PLAN:
cascadesContext.addPlanProcess(
new PlanProcess("ImplementSqlCache",
- parsedPlan.treeString(), physicalPlan.treeString())
+ parsedPlan.treeString(false, parsedPlan),
+ physicalPlan.treeString(false, physicalPlan)
+ )
);
break;
default: {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/BottomUpVisitorRewriteJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/BottomUpVisitorRewriteJob.java
index bda6f1ed7af..7bec8269ccf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/BottomUpVisitorRewriteJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/BottomUpVisitorRewriteJob.java
@@ -133,9 +133,9 @@ public class BottomUpVisitorRewriteJob implements RewriteJob {
currentRule.acceptPlan(result);
if (cascadesContext.showPlanProcess()) {
- String beforeShape = processState.getNewestPlan().treeString(true);
+ String beforeShape = processState.getNewestPlan().treeString(true, plan);
String afterShape = processState.updateChildAndGetNewest(originParent, childIndex, result)
- .treeString(true);
+ .treeString(true, result);
cascadesContext.addPlanProcess(
new PlanProcess(currentRule.getRuleType().name(), beforeShape, afterShape)
);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java
index 43cf331d429..67d57730868 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java
@@ -68,7 +68,9 @@ public class CustomRewriteJob implements RewriteJob {
if (!root.deepEquals(rewrittenRoot)) {
if (cascadesContext.showPlanProcess()) {
PlanProcess planProcess = new PlanProcess(
- ruleType.name(), root.treeString(true), rewrittenRoot.treeString(true));
+ ruleType.name(),
+ root.treeString(true, root),
+ rewrittenRoot.treeString(true, rewrittenRoot));
cascadesContext.addPlanProcess(planProcess);
}
// if rewrite success, record the rule type
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java
index 85925132aa0..346373e7bb0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java
@@ -64,13 +64,13 @@ public abstract class PlanTreeRewriteJob extends Job {
NereidsTracer.logRewriteEvent(rule.toString(), pattern, plan, newPlan);
String traceBefore = null;
if (showPlanProcess) {
- traceBefore = getCurrentPlanTreeString();
+ traceBefore = getCurrentPlanTreeString(rewriteJobContext, null);
}
rewriteJobContext.result = newPlan;
context.setRewritten(true);
rule.acceptPlan(newPlan);
if (showPlanProcess) {
- String traceAfter = getCurrentPlanTreeString();
+ String traceAfter = getCurrentPlanTreeString(rewriteJobContext, newPlan);
PlanProcess planProcess = new PlanProcess(rule.getRuleType().name(), traceBefore, traceAfter);
cascadesContext.addPlanProcess(planProcess);
}
@@ -130,11 +130,11 @@ public abstract class PlanTreeRewriteJob extends Job {
}
}
- private String getCurrentPlanTreeString() {
- return context.getCascadesContext()
+ private String getCurrentPlanTreeString(RewriteJobContext rewriteJobContext, Plan rewrittenPlan) {
+ Plan newestPlan = context.getCascadesContext()
.getCurrentRootRewriteJobContext().get()
- .getNewestPlan()
- .treeString(true);
+ .getNewestPlan();
+ return newestPlan.treeString(true, rewrittenPlan == null ? rewriteJobContext.tmpPlan : rewrittenPlan);
}
static class RewriteResult {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteJobContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteJobContext.java
index 060bb8edd62..2ef71f9b2ad 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteJobContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteJobContext.java
@@ -30,6 +30,7 @@ public class RewriteJobContext {
final int childIndexInParentContext;
final Plan plan;
final RewriteJobContext[] childrenContext;
+ Plan tmpPlan;
Plan result;
/** RewriteJobContext */
@@ -46,6 +47,10 @@ public class RewriteJobContext {
this.batchId = batchId;
}
+ public void setTmpPlan(Plan tmp) {
+ this.tmpPlan = tmp;
+ }
+
public void setResult(Plan result) {
this.result = result;
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RootPlanTreeRewriteJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RootPlanTreeRewriteJob.java
index b8e7e49c905..b4115bc0219 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RootPlanTreeRewriteJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RootPlanTreeRewriteJob.java
@@ -185,6 +185,7 @@ public class RootPlanTreeRewriteJob implements RewriteJob {
}
private void linkResult(Plan result) {
+ rewriteJobContext.tmpPlan = result;
if (parentJob != null) {
parentJob.childrenResult[rewriteJobContext.childIndexInParentContext] = result;
} else {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/TopDownVisitorRewriteJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/TopDownVisitorRewriteJob.java
index 46c53f9bd5c..5275de0eb0a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/TopDownVisitorRewriteJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/TopDownVisitorRewriteJob.java
@@ -116,9 +116,9 @@ public class TopDownVisitorRewriteJob implements RewriteJob {
Plan newPlan = transform.get(0);
currentRule.acceptPlan(originPlan);
if (cascadesContext.showPlanProcess()) {
- String beforeShape = processState.getNewestPlan().treeString(true);
+ String beforeShape = processState.getNewestPlan().treeString(true, originPlan);
String afterShape = processState.updateChildAndGetNewest(originParent, childIndex, newPlan)
- .treeString(true);
+ .treeString(true, newPlan);
cascadesContext.addPlanProcess(
new PlanProcess(currentRule.getRuleType().name(), beforeShape, afterShape)
);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java
index 15ae8b9c1c1..271b008362c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/AbstractPlan.java
@@ -251,19 +251,25 @@ public abstract class AbstractPlan extends AbstractTreeNode<Plan> implements Pla
return !hasUnboundChild.get();
}
+ @Override
+ public String treeString(boolean printStates) {
+ return treeString(printStates, null);
+ }
+
/**
* Get tree like string describing query plan.
*
* @return tree like string describing query plan
*/
@Override
- public String treeString(boolean printStates) {
+ public String treeString(boolean printStates, Object specialPlan) {
return TreeStringUtils.treeString(this,
plan -> {
+ String specialPrefix = specialPlan == plan ? "**" : "";
if (printStates && plan instanceof Plan) {
- return plan + ", states: " + ((Plan) plan).getMutableStates();
+ return specialPrefix + plan + ", states: " + ((Plan) plan).getMutableStates();
}
- return plan.toString();
+ return specialPrefix + plan.toString();
},
plan -> {
if (plan instanceof TreeStringPlan) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/FakePlan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/FakePlan.java
index f0a4af107c5..16f1475d4e9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/FakePlan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/FakePlan.java
@@ -101,7 +101,7 @@ public class FakePlan implements Plan, BlockFuncDepsPropagation {
}
@Override
- public String treeString(boolean printStates) {
+ public String treeString(boolean printStates, Object specialPlan) {
return "DUMMY";
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/Plan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/Plan.java
index 2d564e94bcc..7d174ff28bc 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/Plan.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/Plan.java
@@ -188,7 +188,11 @@ public interface Plan extends TreeNode<Plan> {
return treeString(false);
}
- String treeString(boolean printStates);
+ default String treeString(boolean printStates) {
+ return treeString(printStates, null);
+ }
+
+ String treeString(boolean printStates, Object specialPlan);
Plan withGroupExpression(Optional<GroupExpression> groupExpression);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/DummyPlan.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/DummyPlan.java
index 138482c0440..c81ee57441b 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/DummyPlan.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/DummyPlan.java
@@ -74,7 +74,7 @@ public class DummyPlan implements Plan {
}
@Override
- public String treeString(boolean printStates) {
+ public String treeString(boolean printStates, Object specialPlan) {
return "";
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org