Skip to content

Commit 0c9ce72

Browse files
authored
[fix](mtmv) Fix collecting mv candidates when dml controlled by enable_dml_materialized_view_rewrite switch (#48374)
fix collecting mv candidates when dml controlled by enable_dml_materialized_view_rewrite switch if we run set command as following: set global enable_dml_materialized_view_rewrite = false; when we run refresh command as following refresh materialized view mv_name complete; should not try to collect candidates for mv rewritting, but now would collect candidates
1 parent be4e062 commit 0c9ce72

File tree

8 files changed

+34
-19
lines changed

8 files changed

+34
-19
lines changed

fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.apache.doris.nereids.jobs.Job;
2424
import org.apache.doris.nereids.jobs.JobContext;
2525
import org.apache.doris.nereids.jobs.executor.Analyzer;
26-
import org.apache.doris.nereids.jobs.executor.TableCollector;
26+
import org.apache.doris.nereids.jobs.executor.TableCollectAndHookInitializer;
2727
import org.apache.doris.nereids.jobs.rewrite.RewriteBottomUpJob;
2828
import org.apache.doris.nereids.jobs.rewrite.RewriteTopDownJob;
2929
import org.apache.doris.nereids.jobs.rewrite.RootPlanTreeRewriteJob.RootRewriteJobContext;
@@ -224,8 +224,8 @@ public void toMemo() {
224224
this.memo = new Memo(getConnectContext(), plan);
225225
}
226226

227-
public TableCollector newTableCollector() {
228-
return new TableCollector(this);
227+
public TableCollectAndHookInitializer newTableCollector() {
228+
return new TableCollectAndHookInitializer(this);
229229
}
230230

231231
public Analyzer newAnalyzer() {

fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import java.util.Collection;
7575
import java.util.Comparator;
7676
import java.util.HashMap;
77+
import java.util.HashSet;
7778
import java.util.LinkedHashMap;
7879
import java.util.List;
7980
import java.util.Map;
@@ -203,7 +204,7 @@ public enum TableFrom {
203204

204205
private FormatOptions formatOptions = FormatOptions.getDefault();
205206

206-
private final List<PlannerHook> plannerHooks = new ArrayList<>();
207+
private final Set<PlannerHook> plannerHooks = new HashSet<>();
207208

208209
private String disableJoinReorderReason;
209210

@@ -646,7 +647,7 @@ public FormatOptions getFormatOptions() {
646647
return formatOptions;
647648
}
648649

649-
public List<PlannerHook> getPlannerHooks() {
650+
public Set<PlannerHook> getPlannerHooks() {
650651
return plannerHooks;
651652
}
652653

fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import org.apache.doris.nereids.CascadesContext;
2121
import org.apache.doris.nereids.jobs.rewrite.RewriteJob;
22-
import org.apache.doris.nereids.rules.analysis.AddInitMaterializationHook;
2322
import org.apache.doris.nereids.rules.analysis.AdjustAggregateNullableForEmptySet;
2423
import org.apache.doris.nereids.rules.analysis.AnalyzeCTE;
2524
import org.apache.doris.nereids.rules.analysis.BindExpression;
@@ -106,7 +105,6 @@ private static List<RewriteJob> buildAnalyzerJobs() {
106105
bottomUp(new BindExpression()),
107106
topDown(new BindSink()),
108107
bottomUp(new CheckAfterBind()),
109-
bottomUp(new AddInitMaterializationHook()),
110108
topDown(new FillUpQualifyMissingSlot()),
111109
bottomUp(
112110
new ProjectToGlobalAggregate(),

fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/TableCollector.java renamed to fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/TableCollectAndHookInitializer.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import org.apache.doris.nereids.CascadesContext;
2121
import org.apache.doris.nereids.jobs.rewrite.RewriteJob;
22+
import org.apache.doris.nereids.rules.analysis.AddInitMaterializationHook;
2223
import org.apache.doris.nereids.rules.analysis.CollectRelation;
2324
import org.apache.doris.nereids.trees.plans.logical.LogicalView;
2425

@@ -30,7 +31,7 @@
3031
* Bind symbols according to metadata in the catalog, perform semantic analysis, etc.
3132
* TODO: revisit the interface after subquery analysis is supported.
3233
*/
33-
public class TableCollector extends AbstractBatchJobExecutor {
34+
public class TableCollectAndHookInitializer extends AbstractBatchJobExecutor {
3435

3536
public static final List<RewriteJob> COLLECT_JOBS = buildCollectTableJobs();
3637

@@ -39,7 +40,7 @@ public class TableCollector extends AbstractBatchJobExecutor {
3940
*
4041
* @param cascadesContext current context for analyzer
4142
*/
42-
public TableCollector(CascadesContext cascadesContext) {
43+
public TableCollectAndHookInitializer(CascadesContext cascadesContext) {
4344
super(cascadesContext);
4445

4546
}
@@ -59,12 +60,13 @@ public void collect() {
5960
private static List<RewriteJob> buildCollectTableJobs() {
6061
return notTraverseChildrenOf(
6162
ImmutableSet.of(LogicalView.class),
62-
TableCollector::buildCollectorJobs
63+
TableCollectAndHookInitializer::buildCollectorJobs
6364
);
6465
}
6566

6667
private static List<RewriteJob> buildCollectorJobs() {
6768
return jobs(
69+
topDown(new AddInitMaterializationHook()),
6870
topDown(new CollectRelation())
6971
);
7072
}

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public enum RuleType {
4141
BINDING_INSERT_TARGET_TABLE(RuleTypeClass.REWRITE),
4242
INIT_MATERIALIZATION_HOOK_FOR_FILE_SINK(RuleTypeClass.REWRITE),
4343
INIT_MATERIALIZATION_HOOK_FOR_TABLE_SINK(RuleTypeClass.REWRITE),
44+
INIT_MATERIALIZATION_HOOK_FOR_RESULT_SINK(RuleTypeClass.REWRITE),
4445
BINDING_INSERT_FILE(RuleTypeClass.REWRITE),
4546
BINDING_ONE_ROW_RELATION_SLOT(RuleTypeClass.REWRITE),
4647
BINDING_RELATION(RuleTypeClass.REWRITE),

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AddInitMaterializationHook.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@
2020
import org.apache.doris.nereids.rules.Rule;
2121
import org.apache.doris.nereids.rules.RuleType;
2222
import org.apache.doris.nereids.rules.exploration.mv.InitConsistentMaterializationContextHook;
23-
import org.apache.doris.nereids.trees.plans.logical.LogicalTableSink;
23+
import org.apache.doris.nereids.rules.exploration.mv.InitMaterializationContextHook;
2424

2525
import com.google.common.collect.ImmutableList;
2626

2727
import java.util.List;
2828

2929
/**
3030
* Add init materialization hook for table sink and file sink
31-
* */
31+
*/
3232
public class AddInitMaterializationHook implements AnalysisRuleFactory {
3333

3434
@Override
@@ -41,13 +41,20 @@ public List<Rule> buildRules() {
4141
}
4242
return ctx.root;
4343
})),
44-
RuleType.INIT_MATERIALIZATION_HOOK_FOR_TABLE_SINK.build(
45-
any().when(LogicalTableSink.class::isInstance)
44+
RuleType.INIT_MATERIALIZATION_HOOK_FOR_TABLE_SINK.build(unboundTableSink()
4645
.thenApply(ctx -> {
4746
if (ctx.connectContext.getSessionVariable().isEnableDmlMaterializedViewRewrite()) {
4847
ctx.statementContext.addPlannerHook(InitConsistentMaterializationContextHook.INSTANCE);
4948
}
5049
return ctx.root;
50+
})),
51+
RuleType.INIT_MATERIALIZATION_HOOK_FOR_RESULT_SINK.build(unboundResultSink()
52+
.thenApply(ctx -> {
53+
if (ctx.connectContext.getSessionVariable().isEnableMaterializedViewRewrite()
54+
&& ctx.connectContext.getState().isQuery()) {
55+
ctx.statementContext.addPlannerHook(InitMaterializationContextHook.INSTANCE);
56+
}
57+
return ctx.root;
5158
}))
5259
);
5360
}

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CollectRelation.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.doris.mtmv.BaseTableInfo;
2626
import org.apache.doris.nereids.CTEContext;
2727
import org.apache.doris.nereids.CascadesContext;
28+
import org.apache.doris.nereids.PlannerHook;
2829
import org.apache.doris.nereids.StatementContext.TableFrom;
2930
import org.apache.doris.nereids.analyzer.UnboundRelation;
3031
import org.apache.doris.nereids.analyzer.UnboundResultSink;
@@ -35,6 +36,7 @@
3536
import org.apache.doris.nereids.properties.PhysicalProperties;
3637
import org.apache.doris.nereids.rules.Rule;
3738
import org.apache.doris.nereids.rules.RuleType;
39+
import org.apache.doris.nereids.rules.exploration.mv.InitMaterializationContextHook;
3840
import org.apache.doris.nereids.trees.expressions.CTEId;
3941
import org.apache.doris.nereids.trees.expressions.SubqueryExpr;
4042
import org.apache.doris.nereids.trees.plans.Plan;
@@ -196,7 +198,15 @@ private void collectFromUnboundRelation(CascadesContext cascadesContext,
196198
}
197199

198200
private void collectMTMVCandidates(TableIf table, CascadesContext cascadesContext) {
199-
if (cascadesContext.getConnectContext().getSessionVariable().enableMaterializedViewRewrite) {
201+
boolean shouldCollect = false;
202+
for (PlannerHook plannerHook : cascadesContext.getStatementContext().getPlannerHooks()) {
203+
// only collect when InitMaterializationContextHook exists in planner hooks
204+
if (plannerHook instanceof InitMaterializationContextHook) {
205+
shouldCollect = true;
206+
break;
207+
}
208+
}
209+
if (shouldCollect) {
200210
Set<MTMV> mtmvSet = Env.getCurrentEnv().getMtmvService().getRelationManager()
201211
.getAllMTMVs(Lists.newArrayList(new BaseTableInfo(table)));
202212
if (LOG.isDebugEnabled()) {

fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@
149149
import org.apache.doris.nereids.glue.LogicalPlanAdapter;
150150
import org.apache.doris.nereids.minidump.MinidumpUtils;
151151
import org.apache.doris.nereids.parser.NereidsParser;
152-
import org.apache.doris.nereids.rules.exploration.mv.InitMaterializationContextHook;
153152
import org.apache.doris.nereids.trees.expressions.Placeholder;
154153
import org.apache.doris.nereids.trees.plans.Plan;
155154
import org.apache.doris.nereids.trees.plans.algebra.InlineTable;
@@ -842,9 +841,6 @@ private void executeByNereids(TUniqueId queryId) throws Exception {
842841
// t3: observer fe receive editlog creating the table from the master fe
843842
syncJournalIfNeeded();
844843
planner = new NereidsPlanner(statementContext);
845-
if (context.getSessionVariable().isEnableMaterializedViewRewrite()) {
846-
statementContext.addPlannerHook(InitMaterializationContextHook.INSTANCE);
847-
}
848844
try {
849845
planner.plan(parsedStmt, context.getSessionVariable().toThrift());
850846
checkBlockRules();

0 commit comments

Comments
 (0)