This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 3a5c0fd6d90 [test](mtmv) Auto calc the value of sync_cbo_rewrite
variable to makesure the same test code in different version (#42279)
3a5c0fd6d90 is described below
commit 3a5c0fd6d9005b9ddce42d69a3e0cd8e31e362ef
Author: seawinde <[email protected]>
AuthorDate: Wed Nov 6 14:52:47 2024 +0800
[test](mtmv) Auto calc the value of sync_cbo_rewrite variable to makesure
the same test code in different version (#42279)
Auto calc the value of sync_cbo_rewrite variable to make sure the same
test code in different version.
Because the query rewrite by mv code is a little different from 2.1 to
3.0 and master.
But should keep same regression test code in different version.
So add the methoed `enable_sync_mv_cost_based_rewrite` to get
`enable_sync_mv_cost_based_rewrite` session variable, then decide to
regression test logic by the variable auto.
---
.../org/apache/doris/nereids/NereidsPlanner.java | 4 +-
.../exploration/mv/MaterializationContext.java | 3 +-
.../org/apache/doris/regression/suite/Suite.groovy | 67 +++++++++++++++-------
3 files changed, 50 insertions(+), 24 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
index 86886336d85..69d4d2aa106 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
@@ -595,11 +595,11 @@ public class NereidsPlanner extends Planner {
ExplainLevel explainLevel = getExplainLevel(explainOptions);
String plan = "";
String mvSummary = "";
- if (this.getPhysicalPlan() != null && cascadesContext != null) {
+ if ((this.getPhysicalPlan() != null || this.getOptimizedPlan() !=
null) && cascadesContext != null) {
mvSummary = cascadesContext.getMaterializationContexts().isEmpty()
? "" :
"\n\n========== MATERIALIZATIONS ==========\n"
+
MaterializationContext.toSummaryString(cascadesContext.getMaterializationContexts(),
- this.getPhysicalPlan());
+ this.getPhysicalPlan() == null ?
this.getOptimizedPlan() : this.getPhysicalPlan());
}
switch (explainLevel) {
case PARSED_PLAN:
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializationContext.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializationContext.java
index 609125280de..df535d59d87 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializationContext.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializationContext.java
@@ -35,7 +35,6 @@ import org.apache.doris.nereids.trees.plans.ObjectId;
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.algebra.Relation;
import
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
-import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
import org.apache.doris.nereids.trees.plans.physical.PhysicalRelation;
import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanVisitor;
import org.apache.doris.statistics.ColumnStatistic;
@@ -348,7 +347,7 @@ public abstract class MaterializationContext {
* ToSummaryString, this contains only summary info.
*/
public static String toSummaryString(List<MaterializationContext>
materializationContexts,
- PhysicalPlan physicalPlan) {
+ Plan physicalPlan) {
if (materializationContexts.isEmpty()) {
return "";
}
diff --git
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
index 910b4b63ad3..d20517f15d5 100644
---
a/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
+++
b/regression-test/framework/src/main/groovy/org/apache/doris/regression/suite/Suite.groovy
@@ -1775,6 +1775,17 @@ class Suite implements GroovyInterceptable {
return result.values().toList()
}
+ // enable_sync_mv_cost_based_rewrite is true or not
+ boolean enable_sync_mv_cost_based_rewrite () {
+ def showVariable = "show variables like
'enable_sync_mv_cost_based_rewrite';"
+ List<List<Object>> result = sql(showVariable)
+ logger.info("enable_sync_mv_cost_based_rewrite = " + result)
+ if (result.isEmpty()) {
+ return false;
+ }
+ return Boolean.parseBoolean(result.get(0).get(1));
+ }
+
// Given tables to decide whether the table partition row count statistic
is ready or not
boolean is_partition_statistics_ready(db, tables) {
boolean isReady = true;
@@ -1854,12 +1865,14 @@ class Suite implements GroovyInterceptable {
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
// is_partition_statistics_ready is the bool value which identifying if
partition row count is valid or not
// if true, check if chosen by cbo or doesn't check
- def mv_rewrite_success = { query_sql, mv_name, sync_cbo_rewrite = true,
is_partition_statistics_ready = true ->
+ void mv_rewrite_success(query_sql, mv_name, sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite(),
+ is_partition_statistics_ready = true) {
logger.info("query_sql = " + query_sql + ", mv_name = " + mv_name + ",
sync_cbo_rewrite = " +sync_cbo_rewrite
+ ", is_partition_statistics_ready = " +
is_partition_statistics_ready)
if (!is_partition_statistics_ready) {
// If partition statistics is no ready, degrade to without check
cbo chosen
- return mv_rewrite_success_without_check_chosen(query_sql, mv_name,
sync_cbo_rewrite)
+ mv_rewrite_success_without_check_chosen(query_sql, mv_name,
sync_cbo_rewrite)
+ return
}
if (!sync_cbo_rewrite) {
explain {
@@ -1878,12 +1891,14 @@ class Suite implements GroovyInterceptable {
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
// is_partition_statistics_ready is the bool value which identifying if
partition row count is valid or not
// if true, check if chosen by cbo or doesn't check
- def mv_rewrite_all_success = { query_sql, mv_names, sync_cbo_rewrite =
true, is_partition_statistics_ready = true ->
+ void mv_rewrite_all_success( query_sql, mv_names, sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite(),
+ is_partition_statistics_ready = true) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names +
", sync_cbo_rewrite = " +sync_cbo_rewrite
+ ", is_partition_statistics_ready = " +
is_partition_statistics_ready)
if (!is_partition_statistics_ready) {
// If partition statistics is no ready, degrade to without check
cbo chosen
- return mv_rewrite_all_success_without_check_chosen(query_sql,
mv_names, sync_cbo_rewrite)
+ mv_rewrite_all_success_without_check_chosen(query_sql, mv_names,
sync_cbo_rewrite)
+ return
}
if (!sync_cbo_rewrite) {
explain {
@@ -1914,12 +1929,14 @@ class Suite implements GroovyInterceptable {
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
// is_partition_statistics_ready is the bool value which identifying if
partition row count is valid or not
// if true, check if chosen by cbo or doesn't check
- def mv_rewrite_any_success = { query_sql, mv_names, sync_cbo_rewrite =
true, is_partition_statistics_ready = true ->
+ void mv_rewrite_any_success(query_sql, mv_names, sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite(),
+ is_partition_statistics_ready = true) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names +
", sync_cbo_rewrite = " +sync_cbo_rewrite
+ ", is_partition_statistics_ready = " +
is_partition_statistics_ready)
if (!is_partition_statistics_ready) {
// If partition statistics is no ready, degrade to without check
cbo chosen
- return mv_rewrite_any_success_without_check_chosen(query_sql,
mv_names, sync_cbo_rewrite)
+ mv_rewrite_any_success_without_check_chosen(query_sql, mv_names,
sync_cbo_rewrite)
+ return
}
if (!sync_cbo_rewrite) {
explain {
@@ -1948,7 +1965,8 @@ class Suite implements GroovyInterceptable {
// multi mv part in rewrite process, all rewrte success without check if
chosen by cbo
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
- def mv_rewrite_all_success_without_check_chosen = { query_sql, mv_names,
sync_cbo_rewrite = true ->
+ void mv_rewrite_all_success_without_check_chosen(query_sql, mv_names,
+ sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite()){
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names)
if (!sync_cbo_rewrite) {
explain {
@@ -1956,7 +1974,9 @@ class Suite implements GroovyInterceptable {
check { result ->
boolean success = true;
for (String mv_name : mv_names) {
- success = success && result.contains("(${mv_name})")
+ def splitResult =
result.split("MaterializedViewRewriteFail")
+ def each_result = splitResult.length == 2 ?
splitResult[0].contains(mv_name) : false
+ success = success && (result.contains("(${mv_name})")
|| each_result)
}
Assert.assertEquals(true, success)
}
@@ -1978,7 +1998,8 @@ class Suite implements GroovyInterceptable {
// multi mv part in rewrite process, any of them rewrte success without
check if chosen by cbo or not
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
- def mv_rewrite_any_success_without_check_chosen = { query_sql, mv_names,
sync_cbo_rewrite = true ->
+ void mv_rewrite_any_success_without_check_chosen(query_sql, mv_names,
+ sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names)
if (!sync_cbo_rewrite) {
explain {
@@ -1986,7 +2007,9 @@ class Suite implements GroovyInterceptable {
check { result ->
boolean success = false;
for (String mv_name : mv_names) {
- success = success || result.contains("(${mv_name})")
+ def splitResult =
result.split("MaterializedViewRewriteFail")
+ def each_result = splitResult.length == 2 ?
splitResult[0].contains(mv_name) : false
+ success = success || (result.contains("(${mv_name})")
|| each_result)
}
Assert.assertEquals(true, success)
}
@@ -1995,7 +2018,7 @@ class Suite implements GroovyInterceptable {
}
explain {
sql(" memo plan ${query_sql}")
- check {result ->
+ check { result ->
boolean success = false
for (String mv_name : mv_names) {
success = success || result.contains("${mv_name} chose")
|| result.contains("${mv_name} not chose")
@@ -2007,12 +2030,16 @@ class Suite implements GroovyInterceptable {
// multi mv part in rewrite process, rewrte success without check if
chosen by cbo or not
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
- def mv_rewrite_success_without_check_chosen = { query_sql, mv_name,
sync_cbo_rewrite = true ->
+ void mv_rewrite_success_without_check_chosen(query_sql, mv_name,
+ sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_name = " + mv_name)
if (!sync_cbo_rewrite) {
explain {
sql("${query_sql}")
- contains("(${mv_name})")
+ check { result ->
+ def splitResult =
result.split("MaterializedViewRewriteFail")
+ result.contains("(${mv_name})") || (splitResult.length ==
2 ? splitResult[0].contains(mv_name) : false)
+ }
}
return
}
@@ -2026,12 +2053,12 @@ class Suite implements GroovyInterceptable {
// single mv part in rewrite process, rewrte fail
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
- def mv_rewrite_fail = { query_sql, mv_name, sync_cbo_rewrite = true ->
+ void mv_rewrite_fail(query_sql, mv_name, sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_name = " + mv_name)
if (!sync_cbo_rewrite) {
explain {
sql("${query_sql}")
- nonContains("(${mv_name})")
+ notContains("(${mv_name})")
}
return
}
@@ -2043,7 +2070,7 @@ class Suite implements GroovyInterceptable {
// multi mv part in rewrite process, all rewrte fail
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
- def mv_rewrite_all_fail = {query_sql, mv_names, sync_cbo_rewrite = true ->
+ void mv_rewrite_all_fail(query_sql, mv_names, sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names)
if (!sync_cbo_rewrite) {
explain {
@@ -2074,7 +2101,7 @@ class Suite implements GroovyInterceptable {
// multi mv part in rewrite process, any rewrte fail
// sync_cbo_rewrite is the bool value which control sync mv is use cbo
based mv rewrite
- def mv_rewrite_any_fail = {query_sql, mv_names, sync_cbo_rewrite = true ->
+ void mv_rewrite_any_fail (query_sql, mv_names, sync_cbo_rewrite =
enable_sync_mv_cost_based_rewrite()) {
logger.info("query_sql = " + query_sql + ", mv_names = " + mv_names)
if (!sync_cbo_rewrite) {
explain {
@@ -2113,7 +2140,7 @@ class Suite implements GroovyInterceptable {
"""
def job_name = getJobName(db, mv_name);
waitingMTMVTaskFinished(job_name)
- mv_rewrite_success(query_sql, mv_name)
+ mv_rewrite_success(query_sql, mv_name, true)
}
def async_mv_rewrite_success_without_check_chosen = { db, mv_sql,
query_sql, mv_name ->
@@ -2129,7 +2156,7 @@ class Suite implements GroovyInterceptable {
def job_name = getJobName(db, mv_name);
waitingMTMVTaskFinished(job_name)
- mv_rewrite_success_without_check_chosen(query_sql, mv_name)
+ mv_rewrite_success_without_check_chosen(query_sql, mv_name, true)
}
@@ -2146,7 +2173,7 @@ class Suite implements GroovyInterceptable {
def job_name = getJobName(db, mv_name);
waitingMTMVTaskFinished(job_name)
- mv_rewrite_fail(query_sql, mv_name)
+ mv_rewrite_fail(query_sql, mv_name, true)
}
def token = context.config.metaServiceToken
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]