Skip to content

Commit 46d24fd

Browse files
murphyatworkZhangg7723
authored andcommitted
[Enhancement] add switch enable_materialized_view_rewrite_for_insert (StarRocks#37505)
Signed-off-by: Murphy <[email protected]> Signed-off-by: 张敢 <[email protected]>
1 parent 4a69657 commit 46d24fd

File tree

4 files changed

+55
-8
lines changed

4 files changed

+55
-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
@@ -462,6 +462,8 @@ public static MaterializedViewRewriteMode parse(String str) {
462462

463463
public static final String MATERIALIZED_VIEW_REWRITE_MODE = "materialized_view_rewrite_mode";
464464

465+
public static final String ENABLE_MATERIALIZED_VIEW_REWRITE_FOR_INSERT = "enable_materialized_view_for_insert";
466+
465467
public static final String ENABLE_SYNC_MATERIALIZED_VIEW_REWRITE = "enable_sync_materialized_view_rewrite";
466468
public static final String ENABLE_RULE_BASED_MATERIALIZED_VIEW_REWRITE =
467469
"enable_rule_based_materialized_view_rewrite";
@@ -1332,6 +1334,12 @@ public void setEnableParallelMerge(boolean enableParallelMerge) {
13321334
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_REWRITE)
13331335
private boolean enableMaterializedViewRewrite = true;
13341336

1337+
/**
1338+
* Whether enable materialized-view rewrite for INSERT statement
1339+
*/
1340+
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_REWRITE_FOR_INSERT)
1341+
private boolean enableMaterializedViewRewriteForInsert = false;
1342+
13351343
@VarAttr(name = ENABLE_SYNC_MATERIALIZED_VIEW_REWRITE)
13361344
private boolean enableSyncMaterializedViewRewrite = true;
13371345

@@ -2618,6 +2626,14 @@ public void setEnableMaterializedViewRewrite(boolean enableMaterializedViewRewri
26182626
this.enableMaterializedViewRewrite = enableMaterializedViewRewrite;
26192627
}
26202628

2629+
public boolean isEnableMaterializedViewRewriteForInsert() {
2630+
return enableMaterializedViewRewriteForInsert;
2631+
}
2632+
2633+
public void setEnableMaterializedViewRewriteForInsert(boolean value) {
2634+
this.enableMaterializedViewRewriteForInsert = value;
2635+
}
2636+
26212637
public boolean isEnableMaterializedViewUnionRewrite() {
26222638
return enableMaterializedViewUnionRewrite;
26232639
}
@@ -3214,7 +3230,11 @@ public static Map<String, NonDefaultValue> parseFrom(String content) {
32143230
}
32153231

32163232
@Override
3217-
public Object clone() throws CloneNotSupportedException {
3218-
return super.clone();
3233+
public Object clone() {
3234+
try {
3235+
return super.clone();
3236+
} catch (CloneNotSupportedException e) {
3237+
throw new RuntimeException(e);
3238+
}
32193239
}
32203240
}

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
@@ -270,12 +270,7 @@ private static boolean setValue(Object obj, Field field, String value) throws Dd
270270
}
271271

272272
public static SessionVariable newSessionVariable() {
273-
try {
274-
return (SessionVariable) DEFAULT_SESSION_VARIABLE.clone();
275-
} catch (CloneNotSupportedException e) {
276-
LOG.warn(e);
277-
}
278-
return null;
273+
return (SessionVariable) DEFAULT_SESSION_VARIABLE.clone();
279274
}
280275

281276
// Check if this setVar can be set correctly

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,16 +166,21 @@ public ExecPlan plan(InsertStmt insertStmt, ConnectContext session) {
166166
logicalPlan = new LogicalPlan(optExprBuilder, outputColumns, logicalPlan.getCorrelation());
167167

168168
// TODO: remove forceDisablePipeline when all the operators support pipeline engine.
169+
SessionVariable currentVariable = session.getSessionVariable();
169170
boolean isEnablePipeline = session.getSessionVariable().isEnablePipelineEngine();
170171
boolean canUsePipeline = isEnablePipeline && DataSink.canTableSinkUsePipeline(targetTable);
171172
boolean forceDisablePipeline = isEnablePipeline && !canUsePipeline;
172173
boolean prevIsEnableLocalShuffleAgg = session.getSessionVariable().isEnableLocalShuffleAgg();
174+
boolean previousMVRewrite = currentVariable.isEnableMaterializedViewRewrite();
175+
boolean enableMVRewrite = currentVariable.isEnableMaterializedViewRewriteForInsert() &&
176+
currentVariable.isEnableMaterializedViewRewrite();
173177
try (Timer ignore = Tracers.watchScope("InsertPlanner")) {
174178
if (forceDisablePipeline) {
175179
session.getSessionVariable().setEnablePipelineEngine(false);
176180
}
177181
// Non-query must use the strategy assign scan ranges per driver sequence, which local shuffle agg cannot use.
178182
session.getSessionVariable().setEnableLocalShuffleAgg(false);
183+
session.getSessionVariable().setEnableMaterializedViewRewrite(enableMVRewrite);
179184

180185
Optimizer optimizer = new Optimizer();
181186
PhysicalPropertySet requiredPropertySet = createPhysicalPropertySet(insertStmt, outputColumns,
@@ -340,6 +345,7 @@ public ExecPlan plan(InsertStmt insertStmt, ConnectContext session) {
340345
if (forceDisablePipeline) {
341346
session.getSessionVariable().setEnablePipelineEngine(true);
342347
}
348+
session.getSessionVariable().setEnableMaterializedViewRewrite(previousMVRewrite);
343349
}
344350
}
345351

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.starrocks.common.AnalysisException;
2828
import com.starrocks.common.Config;
2929
import com.starrocks.common.FeConstants;
30+
import com.starrocks.qe.SessionVariable;
3031
import com.starrocks.qe.ShowResultSet;
3132
import com.starrocks.schema.MTable;
3233
import com.starrocks.sql.optimizer.CachingMvPlanContextBuilder;
@@ -1946,4 +1947,29 @@ public void testConvertToVarcharRange() throws AnalysisException {
19461947
Assert.assertEquals("20230910", range.lowerEndpoint().getKeys().get(0).getStringValue());
19471948
}
19481949
}
1950+
1951+
@Test
1952+
public void testInsertMV() throws Exception {
1953+
String mvName = "mv_insert";
1954+
createAndRefreshMv("create materialized view " + mvName +
1955+
" distributed by hash(v1) " +
1956+
"refresh async as " +
1957+
"select * from t0");
1958+
String sql = "insert into t0 select * from t0";
1959+
1960+
// enable
1961+
{
1962+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(true);
1963+
starRocksAssert.query(sql).explainContains(mvName);
1964+
}
1965+
1966+
// disable
1967+
{
1968+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(false);
1969+
starRocksAssert.query(sql).explainWithout(mvName);
1970+
}
1971+
1972+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(
1973+
SessionVariable.DEFAULT_SESSION_VARIABLE.isEnableMaterializedViewRewriteForInsert());
1974+
}
19491975
}

0 commit comments

Comments
 (0)