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 c1aed981042 branch-3.0: [fix](mtmv) Fix collecting mv candidates when
dml controlled by enable_dml_materialized_view_rewrite switch #48374 (#49261)
c1aed981042 is described below
commit c1aed981042295a058820b124387bb1c050c5609
Author: seawinde <[email protected]>
AuthorDate: Mon Apr 7 11:52:54 2025 +0800
branch-3.0: [fix](mtmv) Fix collecting mv candidates when dml controlled by
enable_dml_materialized_view_rewrite switch #48374 (#49261)
### What problem does this PR solve?
pr: https://github.com/apache/doris/pull/48374
commitId: 0c9ce720
---
.../java/org/apache/doris/nereids/CascadesContext.java | 6 +++---
.../java/org/apache/doris/nereids/StatementContext.java | 5 +++--
.../org/apache/doris/nereids/jobs/executor/Analyzer.java | 2 --
...Collector.java => TableCollectAndHookInitializer.java} | 8 +++++---
.../java/org/apache/doris/nereids/rules/RuleType.java | 1 +
.../rules/analysis/AddInitMaterializationHook.java | 15 +++++++++++----
.../doris/nereids/rules/analysis/CollectRelation.java | 12 +++++++++++-
.../src/main/java/org/apache/doris/qe/StmtExecutor.java | 4 ----
8 files changed, 34 insertions(+), 19 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
index 25870476390..1486f03e269 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
@@ -23,7 +23,7 @@ import org.apache.doris.nereids.hint.Hint;
import org.apache.doris.nereids.jobs.Job;
import org.apache.doris.nereids.jobs.JobContext;
import org.apache.doris.nereids.jobs.executor.Analyzer;
-import org.apache.doris.nereids.jobs.executor.TableCollector;
+import org.apache.doris.nereids.jobs.executor.TableCollectAndHookInitializer;
import org.apache.doris.nereids.jobs.rewrite.RewriteBottomUpJob;
import org.apache.doris.nereids.jobs.rewrite.RewriteTopDownJob;
import
org.apache.doris.nereids.jobs.rewrite.RootPlanTreeRewriteJob.RootRewriteJobContext;
@@ -224,8 +224,8 @@ public class CascadesContext implements ScheduleContext {
this.memo = new Memo(getConnectContext(), plan);
}
- public TableCollector newTableCollector() {
- return new TableCollector(this);
+ public TableCollectAndHookInitializer newTableCollector() {
+ return new TableCollectAndHookInitializer(this);
}
public Analyzer newAnalyzer() {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
index ffe9f38a262..a0a39c67af9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
@@ -72,6 +72,7 @@ import java.util.BitSet;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -201,7 +202,7 @@ public class StatementContext implements Closeable {
private FormatOptions formatOptions = FormatOptions.getDefault();
- private final List<PlannerHook> plannerHooks = new ArrayList<>();
+ private final Set<PlannerHook> plannerHooks = new HashSet<>();
private String disableJoinReorderReason;
@@ -625,7 +626,7 @@ public class StatementContext implements Closeable {
return formatOptions;
}
- public List<PlannerHook> getPlannerHooks() {
+ public Set<PlannerHook> getPlannerHooks() {
return plannerHooks;
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java
index ea6781dc912..caf091d4392 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java
@@ -19,7 +19,6 @@ package org.apache.doris.nereids.jobs.executor;
import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.jobs.rewrite.RewriteJob;
-import org.apache.doris.nereids.rules.analysis.AddInitMaterializationHook;
import
org.apache.doris.nereids.rules.analysis.AdjustAggregateNullableForEmptySet;
import org.apache.doris.nereids.rules.analysis.AnalyzeCTE;
import org.apache.doris.nereids.rules.analysis.BindExpression;
@@ -103,7 +102,6 @@ public class Analyzer extends AbstractBatchJobExecutor {
bottomUp(new BindExpression()),
topDown(new BindSink()),
bottomUp(new CheckAfterBind()),
- bottomUp(new AddInitMaterializationHook()),
bottomUp(
new ProjectToGlobalAggregate(),
// this rule check's the logicalProject node's isDistinct
property
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/TableCollector.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/TableCollectAndHookInitializer.java
similarity index 85%
rename from
fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/TableCollector.java
rename to
fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/TableCollectAndHookInitializer.java
index 0ae433262ef..01ce6687ecb 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/TableCollector.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/TableCollectAndHookInitializer.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.jobs.executor;
import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.jobs.rewrite.RewriteJob;
+import org.apache.doris.nereids.rules.analysis.AddInitMaterializationHook;
import org.apache.doris.nereids.rules.analysis.CollectRelation;
import org.apache.doris.nereids.trees.plans.logical.LogicalView;
@@ -30,7 +31,7 @@ import java.util.List;
* Bind symbols according to metadata in the catalog, perform semantic
analysis, etc.
* TODO: revisit the interface after subquery analysis is supported.
*/
-public class TableCollector extends AbstractBatchJobExecutor {
+public class TableCollectAndHookInitializer extends AbstractBatchJobExecutor {
public static final List<RewriteJob> COLLECT_JOBS =
buildCollectTableJobs();
@@ -39,7 +40,7 @@ public class TableCollector extends AbstractBatchJobExecutor {
*
* @param cascadesContext current context for analyzer
*/
- public TableCollector(CascadesContext cascadesContext) {
+ public TableCollectAndHookInitializer(CascadesContext cascadesContext) {
super(cascadesContext);
}
@@ -59,12 +60,13 @@ public class TableCollector extends
AbstractBatchJobExecutor {
private static List<RewriteJob> buildCollectTableJobs() {
return notTraverseChildrenOf(
ImmutableSet.of(LogicalView.class),
- TableCollector::buildCollectorJobs
+ TableCollectAndHookInitializer::buildCollectorJobs
);
}
private static List<RewriteJob> buildCollectorJobs() {
return jobs(
+ topDown(new AddInitMaterializationHook()),
topDown(new CollectRelation())
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
index 5a399830889..ce42490361b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java
@@ -41,6 +41,7 @@ public enum RuleType {
BINDING_INSERT_TARGET_TABLE(RuleTypeClass.REWRITE),
INIT_MATERIALIZATION_HOOK_FOR_FILE_SINK(RuleTypeClass.REWRITE),
INIT_MATERIALIZATION_HOOK_FOR_TABLE_SINK(RuleTypeClass.REWRITE),
+ INIT_MATERIALIZATION_HOOK_FOR_RESULT_SINK(RuleTypeClass.REWRITE),
BINDING_INSERT_FILE(RuleTypeClass.REWRITE),
BINDING_ONE_ROW_RELATION_SLOT(RuleTypeClass.REWRITE),
BINDING_RELATION(RuleTypeClass.REWRITE),
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AddInitMaterializationHook.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AddInitMaterializationHook.java
index bf19c4311d7..8e52942c99c 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AddInitMaterializationHook.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AddInitMaterializationHook.java
@@ -20,7 +20,7 @@ package org.apache.doris.nereids.rules.analysis;
import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
import
org.apache.doris.nereids.rules.exploration.mv.InitConsistentMaterializationContextHook;
-import org.apache.doris.nereids.trees.plans.logical.LogicalTableSink;
+import
org.apache.doris.nereids.rules.exploration.mv.InitMaterializationContextHook;
import com.google.common.collect.ImmutableList;
@@ -28,7 +28,7 @@ import java.util.List;
/**
* Add init materialization hook for table sink and file sink
- * */
+ */
public class AddInitMaterializationHook implements AnalysisRuleFactory {
@Override
@@ -41,13 +41,20 @@ public class AddInitMaterializationHook implements
AnalysisRuleFactory {
}
return ctx.root;
})),
- RuleType.INIT_MATERIALIZATION_HOOK_FOR_TABLE_SINK.build(
- any().when(LogicalTableSink.class::isInstance)
+
RuleType.INIT_MATERIALIZATION_HOOK_FOR_TABLE_SINK.build(unboundTableSink()
.thenApply(ctx -> {
if
(ctx.connectContext.getSessionVariable().isEnableDmlMaterializedViewRewrite()) {
ctx.statementContext.addPlannerHook(InitConsistentMaterializationContextHook.INSTANCE);
}
return ctx.root;
+ })),
+
RuleType.INIT_MATERIALIZATION_HOOK_FOR_RESULT_SINK.build(unboundResultSink()
+ .thenApply(ctx -> {
+ if
(ctx.connectContext.getSessionVariable().isEnableMaterializedViewRewrite()
+ &&
ctx.connectContext.getState().isQuery()) {
+
ctx.statementContext.addPlannerHook(InitMaterializationContextHook.INSTANCE);
+ }
+ return ctx.root;
}))
);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectRelation.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectRelation.java
index 8f5ba27d2e4..efcefb2951f 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectRelation.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectRelation.java
@@ -25,6 +25,7 @@ import org.apache.doris.common.Pair;
import org.apache.doris.mtmv.BaseTableInfo;
import org.apache.doris.nereids.CTEContext;
import org.apache.doris.nereids.CascadesContext;
+import org.apache.doris.nereids.PlannerHook;
import org.apache.doris.nereids.StatementContext.TableFrom;
import org.apache.doris.nereids.analyzer.UnboundRelation;
import org.apache.doris.nereids.analyzer.UnboundResultSink;
@@ -35,6 +36,7 @@ import org.apache.doris.nereids.pattern.MatchingContext;
import org.apache.doris.nereids.properties.PhysicalProperties;
import org.apache.doris.nereids.rules.Rule;
import org.apache.doris.nereids.rules.RuleType;
+import
org.apache.doris.nereids.rules.exploration.mv.InitMaterializationContextHook;
import org.apache.doris.nereids.trees.expressions.CTEId;
import org.apache.doris.nereids.trees.expressions.SubqueryExpr;
import org.apache.doris.nereids.trees.plans.Plan;
@@ -196,7 +198,15 @@ public class CollectRelation implements
AnalysisRuleFactory {
}
private void collectMTMVCandidates(TableIf table, CascadesContext
cascadesContext) {
- if
(cascadesContext.getConnectContext().getSessionVariable().enableMaterializedViewRewrite)
{
+ boolean shouldCollect = false;
+ for (PlannerHook plannerHook :
cascadesContext.getStatementContext().getPlannerHooks()) {
+ // only collect when InitMaterializationContextHook exists in
planner hooks
+ if (plannerHook instanceof InitMaterializationContextHook) {
+ shouldCollect = true;
+ break;
+ }
+ }
+ if (shouldCollect) {
Set<MTMV> mtmvSet =
Env.getCurrentEnv().getMtmvService().getRelationManager()
.getAllMTMVs(Lists.newArrayList(new BaseTableInfo(table)));
LOG.info("table {} related mv set is {}", new
BaseTableInfo(table), mtmvSet);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index ccf77962522..de4b47d8232 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -147,7 +147,6 @@ import org.apache.doris.nereids.exceptions.ParseException;
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
import org.apache.doris.nereids.minidump.MinidumpUtils;
import org.apache.doris.nereids.parser.NereidsParser;
-import
org.apache.doris.nereids.rules.exploration.mv.InitMaterializationContextHook;
import org.apache.doris.nereids.trees.plans.commands.Command;
import org.apache.doris.nereids.trees.plans.commands.CreatePolicyCommand;
import org.apache.doris.nereids.trees.plans.commands.CreateTableCommand;
@@ -830,9 +829,6 @@ public class StmtExecutor {
// t3: observer fe receive editlog creating the table from the
master fe
syncJournalIfNeeded();
planner = new NereidsPlanner(statementContext);
- if
(context.getSessionVariable().isEnableMaterializedViewRewrite()) {
-
statementContext.addPlannerHook(InitMaterializationContextHook.INSTANCE);
- }
try {
planner.plan(parsedStmt,
context.getSessionVariable().toThrift());
checkBlockRules();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]