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]

Reply via email to