This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new abbcc5232f5 branch-3.1: [fix](mv) Fix sync mv could not be chosen by 
cbo stable because stats upload from be not in time #58720 (#58915)
abbcc5232f5 is described below

commit abbcc5232f569af242cb54107503e451341ccba5
Author: seawinde <[email protected]>
AuthorDate: Mon Dec 15 11:24:35 2025 +0800

    branch-3.1: [fix](mv) Fix sync mv could not be chosen by cbo stable because 
stats upload from be not in time #58720 (#58915)
    
    picked from #58720
---
 .../java/org/apache/doris/nereids/stats/StatsCalculator.java | 12 ++++++++++++
 .../mv_p0/ssb/multiple_no_where/multiple_no_where.groovy     |  2 ++
 .../suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy        |  4 ++++
 .../ssb/multiple_ssb_between/multiple_ssb_between.groovy     |  5 ++++-
 regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy          |  1 +
 regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy          |  1 +
 regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy          |  1 +
 regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy          |  1 +
 regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy    |  1 +
 9 files changed, 27 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
index 57f22c19d18..394c9a4a1b0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java
@@ -502,6 +502,12 @@ public class StatsCalculator extends 
DefaultPlanVisitor<Statistics, Void> {
         return Optional.empty();
     }
 
+    private boolean isRegisteredRowCount(OlapScan olapScan) {
+        AnalysisManager analysisManager = 
Env.getCurrentEnv().getAnalysisManager();
+        TableStatsMeta tableMeta = 
analysisManager.findTableStatsStatus(olapScan.getTable().getId());
+        return tableMeta != null && tableMeta.userInjected;
+    }
+
     private Statistics computeOlapScan(OlapScan olapScan) {
         OlapTable olapTable = olapScan.getTable();
         double tableRowCount = getOlapTableRowCount(olapScan);
@@ -520,6 +526,12 @@ public class StatsCalculator extends 
DefaultPlanVisitor<Statistics, Void> {
                 if (selectedPartitionsRowCount == -1) {
                     selectedPartitionsRowCount = tableRowCount;
                 }
+                if (isRegisteredRowCount(olapScan)) {
+                    // If a row count is injected for the materialized view, 
use it to fix the issue where
+                    // the materialized view cannot be selected by cbo stable 
due to selectedPartitionsRowCount being 0,
+                    // which is caused by delayed statistics reporting.
+                    selectedPartitionsRowCount = tableRowCount;
+                }
                 // if estimated mv rowCount is more than actual row count, 
fall back to base table stats
                 if (selectedPartitionsRowCount >= 
optStats.get().getRowCount()) {
                     Statistics derivedStats = optStats.get();
diff --git 
a/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy 
b/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy
index a02cd486155..ce418fa6ca3 100644
--- 
a/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy
+++ 
b/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy
@@ -107,6 +107,8 @@ suite ("multiple_no_where") {
     qt_select_star "select * from lineorder_flat order by 1,2, P_MFGR;"
 
     sql """analyze table lineorder_flat with sync;"""
+    sql """alter table lineorder_flat modify column C_CITY set stats 
('row_count'='7');"""
+    sql """alter table lineorder_flat modify column mv_LO_ORDERKEY set stats 
('row_count'='1');"""
     sql """set enable_stats=false;"""
 
     mv_rewrite_success("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
diff --git a/regression-test/suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy 
b/regression-test/suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy
index 441f9fd7a32..9ca2fe5e856 100644
--- a/regression-test/suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy
+++ b/regression-test/suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy
@@ -154,6 +154,10 @@ suite ("multiple_ssb") {
 
     sql """analyze table lineorder_flat with sync;"""
     sql """alter table lineorder_flat modify column LO_ORDERDATE set stats 
('row_count'='8');"""
+    sql """alter table lineorder_flat modify column a1 set stats 
('row_count'='1');"""
+    sql """alter table lineorder_flat modify column a4 set stats 
('row_count'='1');"""
+    sql """alter table lineorder_flat modify column a6 set stats 
('row_count'='1');"""
+    sql """alter table lineorder_flat modify column x2 set stats 
('row_count'='1');"""
     sql """set enable_stats=false;"""
 
     mv_rewrite_success("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
diff --git 
a/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy
 
b/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy
index 4dfdd748a57..ebeaf7c1674 100644
--- 
a/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy
+++ 
b/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy
@@ -153,7 +153,10 @@ suite ("multiple_ssb_between") {
     sql """set enable_stats=true;"""
 
     sql """alter table lineorder_flat modify column LO_ORDERDATE set stats 
('row_count'='8');"""
-    
+    sql """alter table lineorder_flat modify column mv_LO_ORDERKEY set stats 
('row_count'='1');"""
+    sql """alter table lineorder_flat modify column mv_P_BRAND set stats 
('row_count'='1');"""
+    sql """alter table lineorder_flat modify column mv_C_NATION set stats 
('row_count'='1');"""
+
     mv_rewrite_success("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
                 FROM lineorder_flat
                 WHERE
diff --git a/regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy 
b/regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy
index 5ff94e88522..2bcc8fde8e6 100644
--- a/regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy
@@ -102,6 +102,7 @@ suite ("mv_ssb_q_1_1") {
 
     sql "analyze table lineorder_flat with sync;"
     sql """alter table lineorder_flat modify column C_CITY set stats 
('row_count'='6');"""
+    sql """alter table lineorder_flat modify column mv_LO_ORDERKEY set stats 
('row_count'='1');"""
     mv_rewrite_success("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
                 FROM lineorder_flat
                 WHERE
diff --git a/regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy 
b/regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy
index 0ac5f0245ef..80daf66626e 100644
--- a/regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy
@@ -94,6 +94,7 @@ suite ("mv_ssb_q_2_1") {
     qt_select_star "select * from lineorder_flat order by 1,2,P_MFGR;"
 
   sql """alter table lineorder_flat modify column LO_ORDERDATE set stats 
('row_count'='2');"""
+  sql """alter table lineorder_flat modify column mv_P_BRAND set stats 
('row_count'='1');"""
 
     mv_rewrite_success("""SELECT
                 SUM(LO_REVENUE), (LO_ORDERDATE DIV 10000) AS YEAR,
diff --git a/regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy 
b/regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy
index 6b333d97050..bffee2042d7 100644
--- a/regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy
@@ -99,6 +99,7 @@ suite ("mv_ssb_q_3_1") {
     sql """analyze table lineorder_flat with sync;"""
 
     sql """alter table lineorder_flat modify column LO_ORDERDATE set stats 
('row_count'='2');"""
+    sql """alter table lineorder_flat modify column mv_C_NATION set stats 
('row_count'='1');"""
 
     mv_rewrite_success("""SELECT
                 C_NATION,
diff --git a/regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy 
b/regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy
index 361f60997e3..f7c1222a638 100644
--- a/regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy
@@ -93,6 +93,7 @@ suite ("mv_ssb_q_4_1") {
     sql """analyze table lineorder_flat with sync;"""
 
     sql """alter table lineorder_flat modify column LO_ORDERDATE set stats 
('row_count'='2');"""
+    sql """alter table lineorder_flat modify column mv_C_NATION set stats 
('row_count'='1');"""
 
     mv_rewrite_success("""SELECT (LO_ORDERDATE DIV 10000) AS YEAR,
                 C_NATION,
diff --git a/regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy 
b/regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy
index a12853573f1..dd8468c5e6e 100644
--- a/regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy
@@ -96,6 +96,7 @@ suite ("q_4_1_r1") {
 
     sql """analyze table lineorder_flat with sync;"""
     sql """alter table lineorder_flat modify column LO_ORDERDATE set stats 
('row_count'='8');"""
+    sql """alter table lineorder_flat modify column mv_C_NATION set stats 
('row_count'='1');"""
     sql """set enable_stats=false;"""
 
     mv_rewrite_success("""SELECT (LO_ORDERDATE DIV 10000) AS YEAR,


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to