Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[test](mtmv) Auto calc the value of sync_cbo_rewrite variable to makesure the same test code in different version #42279

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -577,11 +577,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 @@ -1684,6 +1684,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 @@ -1763,12 +1774,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 @@ -1787,12 +1800,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 @@ -1823,12 +1838,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 @@ -1857,15 +1874,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 @@ -1887,15 +1907,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 @@ -1904,7 +1927,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 @@ -1916,12 +1939,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 @@ -1935,12 +1962,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 @@ -1952,7 +1979,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 @@ -1983,7 +2010,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 @@ -2022,7 +2049,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 @@ -2038,7 +2065,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 @@ -2055,7 +2082,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
Loading