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

Reply via email to