Skip to content

Commit

Permalink
branch-3.0: [test](mtmv) Auto calc the value of sync_cbo_rewrite vari…
Browse files Browse the repository at this point in the history
…able to makesure the same test code in different version (#43331)

Cherry-picked from #42279

Co-authored-by: seawinde <[email protected]>
  • Loading branch information
github-actions[bot] and seawinde authored Nov 14, 2024
1 parent b85c394 commit 50475fa
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -595,11 +595,11 @@ public String getExplainString(ExplainOptions explainOptions) {
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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
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;
Expand Down Expand Up @@ -348,7 +347,7 @@ public String toString() {
* ToSummaryString, this contains only summary info.
*/
public static String toSummaryString(List<MaterializationContext> materializationContexts,
PhysicalPlan physicalPlan) {
Plan physicalPlan) {
if (materializationContexts.isEmpty()) {
return "";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1757,6 +1757,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;
Expand Down Expand Up @@ -1836,12 +1847,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 {
Expand All @@ -1860,12 +1873,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 {
Expand Down Expand Up @@ -1896,12 +1911,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 {
Expand Down Expand Up @@ -1930,15 +1947,18 @@ 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 {
sql("${query_sql}")
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)
}
Expand All @@ -1960,15 +1980,18 @@ 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 {
sql("${query_sql}")
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)
}
Expand All @@ -1977,7 +2000,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")
Expand All @@ -1989,12 +2012,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
}
Expand All @@ -2008,12 +2035,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
}
Expand All @@ -2025,7 +2052,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 {
Expand Down Expand Up @@ -2056,7 +2083,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 {
Expand Down Expand Up @@ -2095,7 +2122,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 ->
Expand All @@ -2111,7 +2138,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)
}


Expand All @@ -2128,7 +2155,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
Expand Down

0 comments on commit 50475fa

Please sign in to comment.