Skip to content

Commit bf686ff

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 1d52fd2 commit bf686ff

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: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ public static MaterializedViewRewriteMode parse(String str) {
451451
public static final String MATERIALIZED_VIEW_REWRITE_MODE = "materialized_view_rewrite_mode";
452452

453453
public static final String QUERY_DEBUG_OPTIONS = "query_debug_options";
454+
public static final String ENABLE_MATERIALIZED_VIEW_REWRITE_FOR_INSERT = "enable_materialized_view_for_insert";
454455

455456
public static final String ENABLE_SYNC_MATERIALIZED_VIEW_REWRITE = "enable_sync_materialized_view_rewrite";
456457
public static final String ENABLE_RULE_BASED_MATERIALIZED_VIEW_REWRITE =
@@ -1267,6 +1268,12 @@ public void setCboPushDownTopNLimit(long cboPushDownTopNLimit) {
12671268
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_REWRITE)
12681269
private boolean enableMaterializedViewRewrite = true;
12691270

1271+
/**
1272+
* Whether enable materialized-view rewrite for INSERT statement
1273+
*/
1274+
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_REWRITE_FOR_INSERT)
1275+
private boolean enableMaterializedViewRewriteForInsert = false;
1276+
12701277
@VarAttr(name = ENABLE_SYNC_MATERIALIZED_VIEW_REWRITE)
12711278
private boolean enableSyncMaterializedViewRewrite = true;
12721279

@@ -2465,6 +2472,14 @@ public void setEnableMaterializedViewRewrite(boolean enableMaterializedViewRewri
24652472
this.enableMaterializedViewRewrite = enableMaterializedViewRewrite;
24662473
}
24672474

2475+
public boolean isEnableMaterializedViewRewriteForInsert() {
2476+
return enableMaterializedViewRewriteForInsert;
2477+
}
2478+
2479+
public void setEnableMaterializedViewRewriteForInsert(boolean value) {
2480+
this.enableMaterializedViewRewriteForInsert = value;
2481+
}
2482+
24682483
public boolean isEnableMaterializedViewUnionRewrite() {
24692484
return enableMaterializedViewUnionRewrite;
24702485
}
@@ -3000,7 +3015,11 @@ public static Map<String, NonDefaultValue> parseFrom(String content) {
30003015
}
30013016

30023017
@Override
3003-
public Object clone() throws CloneNotSupportedException {
3004-
return super.clone();
3018+
public Object clone() {
3019+
try {
3020+
return super.clone();
3021+
} catch (CloneNotSupportedException e) {
3022+
throw new RuntimeException(e);
3023+
}
30053024
}
30063025
}

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

257257
public static SessionVariable newSessionVariable() {
258-
try {
259-
return (SessionVariable) DEFAULT_SESSION_VARIABLE.clone();
260-
} catch (CloneNotSupportedException e) {
261-
LOG.warn(e);
262-
}
263-
return null;
258+
return (SessionVariable) DEFAULT_SESSION_VARIABLE.clone();
264259
}
265260

266261
// 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
@@ -43,6 +43,7 @@
4343
import com.starrocks.planner.OlapTableSink;
4444
import com.starrocks.planner.PlanFragment;
4545
import com.starrocks.qe.ConnectContext;
46+
import com.starrocks.qe.SessionVariable;
4647
import com.starrocks.sql.analyzer.AnalyzeState;
4748
import com.starrocks.sql.analyzer.ExpressionAnalyzer;
4849
import com.starrocks.sql.analyzer.Field;
@@ -154,16 +155,21 @@ public ExecPlan plan(InsertStmt insertStmt, ConnectContext session) {
154155
logicalPlan = new LogicalPlan(optExprBuilder, outputColumns, logicalPlan.getCorrelation());
155156

156157
// TODO: remove forceDisablePipeline when all the operators support pipeline engine.
158+
SessionVariable currentVariable = session.getSessionVariable();
157159
boolean isEnablePipeline = session.getSessionVariable().isEnablePipelineEngine();
158160
boolean canUsePipeline = isEnablePipeline && DataSink.canTableSinkUsePipeline(targetTable);
159161
boolean forceDisablePipeline = isEnablePipeline && !canUsePipeline;
160162
boolean prevIsEnableLocalShuffleAgg = session.getSessionVariable().isEnableLocalShuffleAgg();
163+
boolean previousMVRewrite = currentVariable.isEnableMaterializedViewRewrite();
164+
boolean enableMVRewrite = currentVariable.isEnableMaterializedViewRewriteForInsert() &&
165+
currentVariable.isEnableMaterializedViewRewrite();
161166
try (PlannerProfile.ScopedTimer ignore = PlannerProfile.getScopedTimer("InsertPlanner")) {
162167
if (forceDisablePipeline) {
163168
session.getSessionVariable().setEnablePipelineEngine(false);
164169
}
165170
// Non-query must use the strategy assign scan ranges per driver sequence, which local shuffle agg cannot use.
166171
session.getSessionVariable().setEnableLocalShuffleAgg(false);
172+
session.getSessionVariable().setEnableMaterializedViewRewrite(enableMVRewrite);
167173

168174
Optimizer optimizer = new Optimizer();
169175
PhysicalPropertySet requiredPropertySet = createPhysicalPropertySet(insertStmt, outputColumns);
@@ -297,6 +303,7 @@ public ExecPlan plan(InsertStmt insertStmt, ConnectContext session) {
297303
if (forceDisablePipeline) {
298304
session.getSessionVariable().setEnablePipelineEngine(true);
299305
}
306+
session.getSessionVariable().setEnableMaterializedViewRewrite(previousMVRewrite);
300307
}
301308
}
302309

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
@@ -25,6 +25,7 @@
2525
import com.starrocks.catalog.UniqueConstraint;
2626
import com.starrocks.common.Config;
2727
import com.starrocks.common.FeConstants;
28+
import com.starrocks.qe.SessionVariable;
2829
import com.starrocks.qe.ShowResultSet;
2930
import com.starrocks.server.GlobalStateMgr;
3031
import com.starrocks.sql.ast.AlterTableStmt;
@@ -2143,4 +2144,29 @@ public void testQueryIncludingExcludingMVNames() throws Exception {
21432144
starRocksAssert.dropMaterializedView("mv_agg_1");
21442145
starRocksAssert.dropMaterializedView("mv_agg_2");
21452146
}
2147+
2148+
@Test
2149+
public void testInsertMV() throws Exception {
2150+
String mvName = "mv_insert";
2151+
createAndRefreshMv("create materialized view " + mvName +
2152+
" distributed by hash(v1) " +
2153+
"refresh async as " +
2154+
"select * from t0");
2155+
String sql = "insert into t0 select * from t0";
2156+
2157+
// enable
2158+
{
2159+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(true);
2160+
starRocksAssert.query(sql).explainContains(mvName);
2161+
}
2162+
2163+
// disable
2164+
{
2165+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(false);
2166+
starRocksAssert.query(sql).explainWithout(mvName);
2167+
}
2168+
2169+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(
2170+
SessionVariable.DEFAULT_SESSION_VARIABLE.isEnableMaterializedViewRewriteForInsert());
2171+
}
21462172
}

0 commit comments

Comments
 (0)