Skip to content

Commit 9ba5592

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 11c79cd commit 9ba5592

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
@@ -402,6 +402,7 @@ public static MaterializedViewRewriteMode parse(String str) {
402402
}
403403
}
404404
public static final String MATERIALIZED_VIEW_REWRITE_MODE = "materialized_view_rewrite_mode";
405+
public static final String ENABLE_MATERIALIZED_VIEW_REWRITE_FOR_INSERT = "enable_materialized_view_for_insert";
405406

406407
public static final String ENABLE_RULE_BASED_MATERIALIZED_VIEW_REWRITE =
407408
"enable_rule_based_materialized_view_rewrite";
@@ -1124,6 +1125,12 @@ public int getConnectorIoTasksPerScanOperator() {
11241125
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_REWRITE)
11251126
private boolean enableMaterializedViewRewrite = true;
11261127

1128+
/**
1129+
* Whether enable materialized-view rewrite for INSERT statement
1130+
*/
1131+
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_REWRITE_FOR_INSERT)
1132+
private boolean enableMaterializedViewRewriteForInsert = false;
1133+
11271134
@VarAttr(name = ENABLE_MATERIALIZED_VIEW_UNION_REWRITE)
11281135
private boolean enableMaterializedViewUnionRewrite = true;
11291136

@@ -2143,6 +2150,14 @@ public void setEnableMaterializedViewRewrite(boolean enableMaterializedViewRewri
21432150
this.enableMaterializedViewRewrite = enableMaterializedViewRewrite;
21442151
}
21452152

2153+
public boolean isEnableMaterializedViewRewriteForInsert() {
2154+
return enableMaterializedViewRewriteForInsert;
2155+
}
2156+
2157+
public void setEnableMaterializedViewRewriteForInsert(boolean value) {
2158+
this.enableMaterializedViewRewriteForInsert = value;
2159+
}
2160+
21462161
public boolean isEnableMaterializedViewUnionRewrite() {
21472162
return enableMaterializedViewUnionRewrite;
21482163
}
@@ -2628,7 +2643,11 @@ public void replayFromJson(String json) throws IOException {
26282643
}
26292644

26302645
@Override
2631-
public Object clone() throws CloneNotSupportedException {
2632-
return super.clone();
2646+
public Object clone() {
2647+
try {
2648+
return super.clone();
2649+
} catch (CloneNotSupportedException e) {
2650+
throw new RuntimeException(e);
2651+
}
26332652
}
26342653
}

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

254254
public static SessionVariable newSessionVariable() {
255-
try {
256-
return (SessionVariable) DEFAULT_SESSION_VARIABLE.clone();
257-
} catch (CloneNotSupportedException e) {
258-
LOG.warn(e);
259-
}
260-
return null;
255+
return (SessionVariable) DEFAULT_SESSION_VARIABLE.clone();
261256
}
262257

263258
// 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
@@ -39,6 +39,7 @@
3939
import com.starrocks.planner.OlapTableSink;
4040
import com.starrocks.planner.PlanFragment;
4141
import com.starrocks.qe.ConnectContext;
42+
import com.starrocks.qe.SessionVariable;
4243
import com.starrocks.sql.analyzer.AnalyzeState;
4344
import com.starrocks.sql.analyzer.ExpressionAnalyzer;
4445
import com.starrocks.sql.analyzer.Field;
@@ -134,16 +135,21 @@ public ExecPlan plan(InsertStmt insertStmt, ConnectContext session) {
134135
logicalPlan = new LogicalPlan(optExprBuilder, outputColumns, logicalPlan.getCorrelation());
135136

136137
// TODO: remove forceDisablePipeline when all the operators support pipeline engine.
138+
SessionVariable currentVariable = session.getSessionVariable();
137139
boolean isEnablePipeline = session.getSessionVariable().isEnablePipelineEngine();
138140
boolean canUsePipeline = isEnablePipeline && DataSink.canTableSinkUsePipeline(insertStmt.getTargetTable());
139141
boolean forceDisablePipeline = isEnablePipeline && !canUsePipeline;
140142
boolean prevIsEnableLocalShuffleAgg = session.getSessionVariable().isEnableLocalShuffleAgg();
143+
boolean previousMVRewrite = currentVariable.isEnableMaterializedViewRewrite();
144+
boolean enableMVRewrite = currentVariable.isEnableMaterializedViewRewriteForInsert() &&
145+
currentVariable.isEnableMaterializedViewRewrite();
141146
try (PlannerProfile.ScopedTimer ignore = PlannerProfile.getScopedTimer("InsertPlanner")) {
142147
if (forceDisablePipeline) {
143148
session.getSessionVariable().setEnablePipelineEngine(false);
144149
}
145150
// Non-query must use the strategy assign scan ranges per driver sequence, which local shuffle agg cannot use.
146151
session.getSessionVariable().setEnableLocalShuffleAgg(false);
152+
session.getSessionVariable().setEnableMaterializedViewRewrite(enableMVRewrite);
147153

148154
Optimizer optimizer = new Optimizer();
149155
PhysicalPropertySet requiredPropertySet = createPhysicalPropertySet(insertStmt, outputColumns);
@@ -268,6 +274,7 @@ public ExecPlan plan(InsertStmt insertStmt, ConnectContext session) {
268274
if (forceDisablePipeline) {
269275
session.getSessionVariable().setEnablePipelineEngine(true);
270276
}
277+
session.getSessionVariable().setEnableMaterializedViewRewrite(previousMVRewrite);
271278
}
272279
}
273280

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
@@ -16,6 +16,7 @@
1616

1717
import com.starrocks.catalog.MaterializedView;
1818
import com.starrocks.catalog.MvPlanContext;
19+
import com.starrocks.qe.SessionVariable;
1920
import com.starrocks.sql.optimizer.CachingMvPlanContextBuilder;
2021
import org.junit.Assert;
2122
import org.junit.BeforeClass;
@@ -83,4 +84,29 @@ public void testPlanCache() throws Exception {
8384
}
8485
}
8586
}
87+
88+
@Test
89+
public void testInsertMV() throws Exception {
90+
String mvName = "mv_insert";
91+
createAndRefreshMv("test", mvName, "create materialized view " + mvName +
92+
" distributed by hash(v1) " +
93+
"refresh async as " +
94+
"select * from t0");
95+
String sql = "insert into t0 select * from t0";
96+
97+
// enable
98+
{
99+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(true);
100+
starRocksAssert.query(sql).explainContains(mvName);
101+
}
102+
103+
// disable
104+
{
105+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(false);
106+
starRocksAssert.query(sql).explainWithout(mvName);
107+
}
108+
109+
starRocksAssert.getCtx().getSessionVariable().setEnableMaterializedViewRewriteForInsert(
110+
SessionVariable.DEFAULT_SESSION_VARIABLE.isEnableMaterializedViewRewriteForInsert());
111+
}
86112
}

0 commit comments

Comments
 (0)