Skip to content

Commit ce73991

Browse files
committed
[Enhancement] add switch enable_materialized_view_rewrite_for_insert (#37505)
Signed-off-by: Murphy <[email protected]> (cherry picked from commit 1996cb1) Signed-off-by: Murphy <[email protected]> # Conflicts: # fe/fe-core/src/main/java/com/starrocks/qe/SessionVariable.java # fe/fe-core/src/main/java/com/starrocks/sql/InsertPlanner.java # fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rule/transformation/materialization/MvRewriteTest.java
1 parent ac37bb9 commit ce73991

File tree

4 files changed

+54
-8
lines changed

4 files changed

+54
-8
lines changed

fe/fe-core/src/main/java/com/starrocks/qe/SessionVariable.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,8 @@ public static MaterializedViewRewriteMode parse(String str) {
368368
}
369369
public static final String MATERIALIZED_VIEW_REWRITE_MODE = "materialized_view_rewrite_mode";
370370

371+
public static final String ENABLE_MATERIALIZED_VIEW_REWRITE_FOR_INSERT = "enable_materialized_view_for_insert";
372+
371373
public static final String ENABLE_RULE_BASED_MATERIALIZED_VIEW_REWRITE =
372374
"enable_rule_based_materialized_view_rewrite";
373375

@@ -965,6 +967,12 @@ public int getConnectorIoTasksPerScanOperator() {
965967
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_REWRITE)
966968
private boolean enableMaterializedViewRewrite = true;
967969

970+
/**
971+
* Whether enable materialized-view rewrite for INSERT statement
972+
*/
973+
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_REWRITE_FOR_INSERT)
974+
private boolean enableMaterializedViewRewriteForInsert = false;
975+
968976
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_UNION_REWRITE)
969977
private boolean enableMaterializedViewUnionRewrite = true;
970978

@@ -1855,6 +1863,14 @@ public void setEnableMaterializedViewRewrite(boolean enableMaterializedViewRewri
18551863
this.enableMaterializedViewRewrite = enableMaterializedViewRewrite;
18561864
}
18571865

1866+
public boolean isEnableMaterializedViewRewriteForInsert() {
1867+
return enableMaterializedViewRewriteForInsert;
1868+
}
1869+
1870+
public void setEnableMaterializedViewRewriteForInsert(boolean value) {
1871+
this.enableMaterializedViewRewriteForInsert = value;
1872+
}
1873+
18581874
public boolean isEnableMaterializedViewUnionRewrite() {
18591875
return enableMaterializedViewUnionRewrite;
18601876
}
@@ -2211,7 +2227,11 @@ public void replayFromJson(String json) throws IOException {
22112227
}
22122228

22132229
@Override
2214-
public Object clone() throws CloneNotSupportedException {
2215-
return super.clone();
2230+
public Object clone() {
2231+
try {
2232+
return super.clone();
2233+
} catch (CloneNotSupportedException e) {
2234+
throw new RuntimeException(e);
2235+
}
22162236
}
22172237
}

fe/fe-core/src/main/java/com/starrocks/qe/VariableMgr.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,7 @@ private static boolean setValue(Object obj, Field field, String value) throws Dd
235235
}
236236

237237
public static SessionVariable newSessionVariable() {
238-
try {
239-
return (SessionVariable) DEFAULT_SESSION_VARIABLE.clone();
240-
} catch (CloneNotSupportedException e) {
241-
LOG.warn(e);
242-
}
243-
return null;
238+
return (SessionVariable) DEFAULT_SESSION_VARIABLE.clone();
244239
}
245240

246241
// Check if this setVar can be set correctly

fe/fe-core/src/main/java/com/starrocks/sql/InsertPlanner.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.starrocks.planner.OlapTableSink;
2424
import com.starrocks.planner.PlanFragment;
2525
import com.starrocks.qe.ConnectContext;
26+
import com.starrocks.qe.SessionVariable;
2627
import com.starrocks.sql.analyzer.AnalyzeState;
2728
import com.starrocks.sql.analyzer.ExpressionAnalyzer;
2829
import com.starrocks.sql.analyzer.Field;
@@ -115,16 +116,21 @@ public ExecPlan plan(InsertStmt insertStmt, ConnectContext session) {
115116
logicalPlan = new LogicalPlan(optExprBuilder, outputColumns, logicalPlan.getCorrelation());
116117

117118
// TODO: remove forceDisablePipeline when all the operators support pipeline engine.
119+
SessionVariable currentVariable = session.getSessionVariable();
118120
boolean isEnablePipeline = session.getSessionVariable().isEnablePipelineEngine();
119121
boolean canUsePipeline = isEnablePipeline && DataSink.canTableSinkUsePipeline(insertStmt.getTargetTable());
120122
boolean forceDisablePipeline = isEnablePipeline && !canUsePipeline;
121123
boolean prevIsEnableLocalShuffleAgg = session.getSessionVariable().isEnableLocalShuffleAgg();
124+
boolean previousMVRewrite = currentVariable.isEnableMaterializedViewRewrite();
125+
boolean enableMVRewrite = currentVariable.isEnableMaterializedViewRewriteForInsert() &&
126+
currentVariable.isEnableMaterializedViewRewrite();
122127
try (PlannerProfile.ScopedTimer ignore = PlannerProfile.getScopedTimer("InsertPlanner")) {
123128
if (forceDisablePipeline) {
124129
session.getSessionVariable().setEnablePipelineEngine(false);
125130
}
126131
// Non-query must use the strategy assign scan ranges per driver sequence, which local shuffle agg cannot use.
127132
session.getSessionVariable().setEnableLocalShuffleAgg(false);
133+
session.getSessionVariable().setEnableMaterializedViewRewrite(enableMVRewrite);
128134

129135
Optimizer optimizer = new Optimizer();
130136
PhysicalPropertySet requiredPropertySet = createPhysicalPropertySet(insertStmt, outputColumns);
@@ -208,6 +214,7 @@ public ExecPlan plan(InsertStmt insertStmt, ConnectContext session) {
208214
if (forceDisablePipeline) {
209215
session.getSessionVariable().setEnablePipelineEngine(true);
210216
}
217+
session.getSessionVariable().setEnableMaterializedViewRewrite(previousMVRewrite);
211218
}
212219
}
213220

fe/fe-core/src/test/java/com/starrocks/sql/optimizer/rule/transformation/materialization/MvRewriteTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,28 @@ public void testPlanCache() throws Exception {
7171
}
7272
}
7373
}
74+
75+
@Test
76+
public void testInsertMV() throws Exception {
77+
String mvName = "mv_insert";
78+
createAndRefreshMv("test", mvName, "create materialized view " + mvName +
79+
" distributed by hash(v1) " +
80+
"refresh async as " +
81+
"select * from t0");
82+
String sql = "insert into t0 select * from t0";
83+
84+
// enable
85+
{
86+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(true);
87+
starRocksAssert.query(sql).explainContains(mvName);
88+
}
89+
90+
// disable
91+
{
92+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(false);
93+
starRocksAssert.query(sql).explainWithout(mvName);
94+
}
95+
96+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(false);
97+
}
7498
}

0 commit comments

Comments
 (0)