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 <w...@selectdb.com> 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: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org