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

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


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 2f5be0850eb [improvement](statistics)Return -1 to neredis if report 
olap table row count for new table is not done for all tablets. (#40457) 
(#40973)
2f5be0850eb is described below

commit 2f5be0850ebecb5f7f5cd488c2158a1588d708d9
Author: Jibing-Li <64681310+jibing...@users.noreply.github.com>
AuthorDate: Thu Sep 26 10:30:47 2024 +0800

    [improvement](statistics)Return -1 to neredis if report olap table row 
count for new table is not done for all tablets. (#40457) (#40973)
    
    backport: https://github.com/apache/doris/pull/40457
---
 be/src/olap/tablet_manager.cpp                     |  1 +
 .../apache/doris/analysis/ShowTableStatsStmt.java  | 51 +++++++------
 .../apache/doris/catalog/MaterializedIndex.java    | 11 +++
 .../java/org/apache/doris/catalog/OlapTable.java   | 13 ++--
 .../java/org/apache/doris/catalog/Replica.java     | 10 +++
 .../org/apache/doris/catalog/TabletStatMgr.java    | 29 +++++++-
 .../java/org/apache/doris/qe/ShowExecutor.java     | 13 +---
 .../apache/doris/statistics/AnalysisManager.java   |  6 +-
 .../apache/doris/statistics/OlapAnalysisTask.java  |  2 +-
 .../apache/doris/statistics/TableStatsMeta.java    |  6 +-
 .../doris/transaction/DatabaseTransactionMgr.java  |  3 +
 gensrc/thrift/BackendService.thrift                |  1 +
 .../suites/statistics/analyze_stats.groovy         |  2 +-
 .../suites/statistics/test_analyze_mv.groovy       | 83 ++++++++++++++++++++--
 14 files changed, 173 insertions(+), 58 deletions(-)

diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp
index 981d8de2de5..348ab792b6f 100644
--- a/be/src/olap/tablet_manager.cpp
+++ b/be/src/olap/tablet_manager.cpp
@@ -1059,6 +1059,7 @@ Status 
TabletManager::build_all_report_tablets_info(std::map<TTabletId, TTablet>
         t_tablet_stat.__set_remote_data_size(tablet_info.remote_data_size);
         t_tablet_stat.__set_row_num(tablet_info.row_count);
         t_tablet_stat.__set_version_count(tablet_info.version_count);
+        t_tablet_stat.__set_visible_version(tablet_info.version);
     };
     for_each_tablet(handler, filter_all_tablets);
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java
index 8e9800fc410..12f097729d2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowTableStatsStmt.java
@@ -63,7 +63,9 @@ public class ShowTableStatsStmt extends ShowStmt {
             new ImmutableList.Builder<String>()
             .add("table_name")
             .add("index_name")
-            .add("row_count")
+            .add("analyze_row_count")
+            .add("report_row_count")
+            .add("report_row_count_for_nereids")
             .build();
 
     private final TableName tableName;
@@ -166,37 +168,33 @@ public class ShowTableStatsStmt extends ShowStmt {
         return tableId;
     }
 
-    public ShowResultSet constructResultSet(TableStatsMeta tableStatistic) {
+    public ShowResultSet constructResultSet(TableStatsMeta tableStatistic, 
TableIf table) {
         if (indexName != null) {
-            return constructIndexResultSet(tableStatistic);
+            return constructIndexResultSet(tableStatistic, table);
         }
-        return constructTableResultSet(tableStatistic);
+        return constructTableResultSet(tableStatistic, table);
     }
 
     public ShowResultSet constructEmptyResultSet() {
         return new ShowResultSet(getMetaData(), new ArrayList<>());
     }
 
-    public ShowResultSet constructResultSet(long rowCount) {
-        List<List<String>> result = Lists.newArrayList();
-        List<String> row = Lists.newArrayList();
-        row.add("");
-        row.add("");
-        row.add(String.valueOf(rowCount));
-        row.add("");
-        row.add("");
-        row.add("");
-        row.add("");
-        row.add("");
-        result.add(row);
-        return new ShowResultSet(getMetaData(), result);
-    }
-
-    public ShowResultSet constructTableResultSet(TableStatsMeta 
tableStatistic) {
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 
HH:mm:ss");
+    public ShowResultSet constructTableResultSet(TableStatsMeta 
tableStatistic, TableIf table) {
         if (tableStatistic == null) {
-            return new ShowResultSet(getMetaData(), new ArrayList<>());
+            List<List<String>> result = Lists.newArrayList();
+            List<String> row = Lists.newArrayList();
+            row.add("");
+            row.add("");
+            row.add(String.valueOf(table.getRowCount()));
+            row.add("");
+            row.add("");
+            row.add("");
+            row.add("");
+            row.add("");
+            result.add(row);
+            return new ShowResultSet(getMetaData(), result);
         }
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 
HH:mm:ss");
         List<List<String>> result = Lists.newArrayList();
         List<String> row = Lists.newArrayList();
         row.add(String.valueOf(tableStatistic.updatedRows));
@@ -215,7 +213,7 @@ public class ShowTableStatsStmt extends ShowStmt {
         return new ShowResultSet(getMetaData(), result);
     }
 
-    public ShowResultSet constructIndexResultSet(TableStatsMeta 
tableStatistic) {
+    public ShowResultSet constructIndexResultSet(TableStatsMeta 
tableStatistic, TableIf table) {
         List<List<String>> result = Lists.newArrayList();
         if (!(table instanceof OlapTable)) {
             return new ShowResultSet(getMetaData(), result);
@@ -225,14 +223,13 @@ public class ShowTableStatsStmt extends ShowStmt {
         if (indexId == null) {
             throw new RuntimeException(String.format("Index %s not exist.", 
indexName));
         }
-        long rowCount = 
tableStatistic.getRowCount(olapTable.getIndexIdByName(indexName));
-        if (rowCount == -1) {
-            return new ShowResultSet(getMetaData(), result);
-        }
+        long rowCount = tableStatistic == null ? -1 : 
tableStatistic.getRowCount(olapTable.getIndexIdByName(indexName));
         List<String> row = Lists.newArrayList();
         row.add(table.getName());
         row.add(indexName);
         row.add(String.valueOf(rowCount));
+        row.add(String.valueOf(olapTable.getRowCountForIndex(indexId, false)));
+        row.add(String.valueOf(olapTable.getRowCountForIndex(indexId, true)));
         result.add(row);
         return new ShowResultSet(getMetaData(), result);
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndex.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndex.java
index 094aebc6fc3..585d1875925 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndex.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MaterializedIndex.java
@@ -73,6 +73,8 @@ public class MaterializedIndex extends MetaObject implements 
Writable, GsonPostP
     @SerializedName(value = "rollupFinishedVersion")
     private long rollupFinishedVersion;
 
+    private boolean rowCountReported = false;
+
     public MaterializedIndex() {
         this.state = IndexState.NORMAL;
         this.idToTablets = new HashMap<>();
@@ -206,6 +208,14 @@ public class MaterializedIndex extends MetaObject 
implements Writable, GsonPostP
         return -1;
     }
 
+    public void setRowCountReported(boolean reported) {
+        this.rowCountReported = reported;
+    }
+
+    public boolean getRowCountReported() {
+        return this.rowCountReported;
+    }
+
     @Override
     public void write(DataOutput out) throws IOException {
         super.write(out);
@@ -225,6 +235,7 @@ public class MaterializedIndex extends MetaObject 
implements Writable, GsonPostP
         out.writeLong(rollupFinishedVersion);
     }
 
+    @Deprecated
     public void readFields(DataInput in) throws IOException {
         super.readFields(in);
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
index f4c77b9cbb8..ffff643a861 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
@@ -1274,18 +1274,17 @@ public class OlapTable extends Table {
 
     @Override
     public long fetchRowCount() {
-        long rowCount = 0;
-        for (Map.Entry<Long, Partition> entry : idToPartition.entrySet()) {
-            rowCount += entry.getValue().getBaseIndex().getRowCount();
-        }
-        return rowCount;
+        return getRowCountForIndex(baseIndexId, false);
     }
 
-    public long getRowCountForIndex(long indexId) {
+    public long getRowCountForIndex(long indexId, boolean strict) {
         long rowCount = 0;
         for (Map.Entry<Long, Partition> entry : idToPartition.entrySet()) {
             MaterializedIndex index = entry.getValue().getIndex(indexId);
-            rowCount += index == null ? 0 : index.getRowCount();
+            if (strict && !index.getRowCountReported()) {
+                return -1;
+            }
+            rowCount += (index == null || index.getRowCount() == -1) ? 0 : 
index.getRowCount();
         }
         return rowCount;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
index 70dffaa16ec..2c03f7c805d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
@@ -152,6 +152,8 @@ public class Replica implements Writable {
 
     private long userDropTime = -1;
 
+    private long lastReportVersion = 0;
+
     public Replica() {
     }
 
@@ -731,4 +733,12 @@ public class Replica implements Writable {
         return 
Env.getCurrentSystemInfo().checkBackendScheduleAvailable(backendId)
             && !isUserDrop();
     }
+
+    public void setLastReportVersion(long version) {
+        this.lastReportVersion = version;
+    }
+
+    public long getLastReportVersion() {
+        return lastReportVersion;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java
index 092bf84a661..00b3bcfca87 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java
@@ -113,17 +113,41 @@ public class TabletStatMgr extends MasterDaemon {
                         long version = partition.getVisibleVersion();
                         for (MaterializedIndex index : 
partition.getMaterializedIndices(IndexExtState.VISIBLE)) {
                             long indexRowCount = 0L;
+                            boolean indexReported = true;
                             for (Tablet tablet : index.getTablets()) {
                                 long tabletRowCount = 0L;
+                                boolean tabletReported = false;
                                 for (Replica replica : tablet.getReplicas()) {
+                                    LOG.debug("Table {} replica {} current 
version {}, report version {}",
+                                            olapTable.getName(), 
replica.getId(),
+                                            replica.getVersion(), 
replica.getLastReportVersion());
                                     if (replica.checkVersionCatchUp(version, 
false)
-                                            && replica.getRowCount() > 
tabletRowCount) {
+                                            && replica.getRowCount() >= 
tabletRowCount) {
+                                        // 1. If replica version and reported 
replica version are all equal to
+                                        // PARTITION_INIT_VERSION, set 
tabletReported to true, which indicates this
+                                        // tablet is empty for sure when 
previous report.
+                                        // 2. If last report version is larger 
than PARTITION_INIT_VERSION, set
+                                        // tabletReported to true as well. 
That is, we only guarantee all replicas of
+                                        // the tablet are reported for the 
init version.
+                                        // e.g. When replica version is 2, but 
last reported version is 1,
+                                        // tabletReported would be false.
+                                        if (replica.getVersion() == 
Partition.PARTITION_INIT_VERSION
+                                                && 
replica.getLastReportVersion() == Partition.PARTITION_INIT_VERSION
+                                                || 
replica.getLastReportVersion() > Partition.PARTITION_INIT_VERSION) {
+                                            tabletReported = true;
+                                        }
                                         tabletRowCount = replica.getRowCount();
                                     }
                                 }
                                 indexRowCount += tabletRowCount;
+                                // Only when all tablets of this index are 
reported, we set indexReported to true.
+                                indexReported = indexReported && 
tabletReported;
                             } // end for tablets
+                            index.setRowCountReported(indexReported);
                             index.setRowCount(indexRowCount);
+                            LOG.debug("Table {} index {} all tablets 
reported[{}], row count {}",
+                                    olapTable.getName(), 
olapTable.getIndexNameById(index.getId()),
+                                    indexReported, indexRowCount);
                         } // end for indices
                     } // end for partitions
                     LOG.debug("finished to set row num for table: {} in 
database: {}",
@@ -148,6 +172,9 @@ public class TabletStatMgr extends MasterDaemon {
                         replica.setRemoteDataSize(stat.getRemoteDataSize());
                         replica.setRowCount(stat.getRowNum());
                         replica.setVersionCount(stat.getVersionCount());
+                        // Older version BE doesn't set visible version. Set 
it to max for compatibility.
+                        
replica.setLastReportVersion(stat.isSetVisibleVersion() ? 
stat.getVisibleVersion()
+                                : Long.MAX_VALUE);
                     }
                 }
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
index 6de1f0883bc..69c92d0f166 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
@@ -2489,21 +2489,12 @@ public class ShowExecutor {
             if (tableStats == null) {
                 resultSet = showTableStatsStmt.constructEmptyResultSet();
             } else {
-                resultSet = showTableStatsStmt.constructResultSet(tableStats);
+                resultSet = showTableStatsStmt.constructResultSet(tableStats, 
tableIf);
             }
             return;
         }
         TableStatsMeta tableStats = 
Env.getCurrentEnv().getAnalysisManager().findTableStatsStatus(tableIf.getId());
-        /*
-           HMSExternalTable table will fetch row count from HMS
-           or estimate with file size and schema if it's not analyzed.
-           tableStats == null means it's not analyzed, in this case show the 
estimated row count.
-         */
-        if (tableStats == null) {
-            resultSet = 
showTableStatsStmt.constructResultSet(tableIf.getRowCount());
-        } else {
-            resultSet = showTableStatsStmt.constructResultSet(tableStats);
-        }
+        resultSet = showTableStatsStmt.constructResultSet(tableStats, tableIf);
     }
 
     private void handleShowColumnStats() throws AnalysisException {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
index 2446686d46e..814fc6eb05b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
@@ -699,7 +699,7 @@ public class AnalysisManager implements Writable {
         if (tableStats == null) {
             return;
         }
-        invalidateLocalStats(catalogId, dbId, tblId, cols, tableStats);
+        invalidateLocalStats(catalogId, dbId, tblId, 
dropStatsStmt.isAllColumns() ? null : cols, tableStats);
         // Drop stats ddl is master only operation.
         invalidateRemoteStats(catalogId, dbId, tblId, cols, 
dropStatsStmt.isAllColumns());
         StatisticsRepository.dropStatistics(tblId, cols);
@@ -714,7 +714,7 @@ public class AnalysisManager implements Writable {
         long dbId = table.getDatabase().getId();
         long tableId = table.getId();
         Set<String> cols = 
table.getSchemaAllIndexes(false).stream().map(Column::getName).collect(Collectors.toSet());
-        invalidateLocalStats(catalogId, dbId, tableId, cols, tableStats);
+        invalidateLocalStats(catalogId, dbId, tableId, null, tableStats);
         // Drop stats ddl is master only operation.
         invalidateRemoteStats(catalogId, dbId, tableId, cols, true);
         StatisticsRepository.dropStatistics(table.getId(), cols);
@@ -767,6 +767,8 @@ public class AnalysisManager implements Writable {
         // To remove stale column name that is changed before.
         if (allColumn) {
             tableStats.removeAllColumn();
+            tableStats.clearIndexesRowCount();
+            removeTableStats(tableId);
         }
         tableStats.updatedTime = 0;
         tableStats.userInjected = false;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
index d93b0b74e54..352a21aca83 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java
@@ -101,7 +101,7 @@ public class OlapAnalysisTask extends BaseAnalysisTask {
         List<Long> tabletIds = pair.first;
         long totalRowCount = info.indexId == -1
                 ? tbl.getRowCount()
-                : ((OlapTable) tbl).getRowCountForIndex(info.indexId);
+                : ((OlapTable) tbl).getRowCountForIndex(info.indexId, false);
         double scaleFactor = (double) totalRowCount / (double) pair.second;
         // might happen if row count in fe metadata hasn't been updated yet
         if (Double.isInfinite(scaleFactor) || Double.isNaN(scaleFactor)) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java
index 5cad3dbaec1..a7701f06ef1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/TableStatsMeta.java
@@ -93,7 +93,7 @@ public class TableStatsMeta implements Writable, 
GsonPostProcessable {
     public boolean userInjected;
 
     @SerializedName("irc")
-    public ConcurrentMap<Long, Long> indexesRowCount = new 
ConcurrentHashMap<>();
+    private ConcurrentMap<Long, Long> indexesRowCount = new 
ConcurrentHashMap<>();
 
     @VisibleForTesting
     public TableStatsMeta() {
@@ -225,6 +225,10 @@ public class TableStatsMeta implements Writable, 
GsonPostProcessable {
         return indexesRowCount.getOrDefault(indexId, -1L);
     }
 
+    public void clearIndexesRowCount() {
+        indexesRowCount.clear();
+    }
+
     private void clearStaleIndexRowCount(OlapTable table) {
         Iterator<Long> iterator = indexesRowCount.keySet().iterator();
         List<Long> indexIds = table.getIndexIds();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
index 2852c1de893..869c8281760 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
@@ -1952,6 +1952,9 @@ public class DatabaseTransactionMgr {
                                 }
                             }
                             replica.updateVersionWithFailed(newVersion, 
lastFailedVersion, lastSuccessVersion);
+                            if (newVersion == Partition.PARTITION_INIT_VERSION 
+ 1) {
+                                index.setRowCountReported(false);
+                            }
                         }
                     }
                 } // end for indices
diff --git a/gensrc/thrift/BackendService.thrift 
b/gensrc/thrift/BackendService.thrift
index eb9ad6a64d8..84868bbdf87 100644
--- a/gensrc/thrift/BackendService.thrift
+++ b/gensrc/thrift/BackendService.thrift
@@ -36,6 +36,7 @@ struct TTabletStat {
     3: optional i64 row_num
     4: optional i64 version_count
     5: optional i64 remote_data_size
+    6: optional i64 visible_version
 }
 
 struct TTabletStatResult {
diff --git a/regression-test/suites/statistics/analyze_stats.groovy 
b/regression-test/suites/statistics/analyze_stats.groovy
index f0e31e4d7c2..993e6f531da 100644
--- a/regression-test/suites/statistics/analyze_stats.groovy
+++ b/regression-test/suites/statistics/analyze_stats.groovy
@@ -2701,7 +2701,7 @@ PARTITION `p599` VALUES IN (599)
     assertEquals("true", alter_result[0][7])
     sql """drop stats alter_test"""
     alter_result = sql """show table stats alter_test"""
-    assertEquals("false", alter_result[0][7])
+    assertEquals("", alter_result[0][7])
     sql """alter table alter_test modify column id set stats 
('row_count'='100', 'ndv'='0', 'num_nulls'='0.0', 'data_size'='2.69975443E8', 
'min_value'='1', 'max_value'='2');"""
     alter_result = sql """show column stats alter_test(id)"""
     assertEquals(1, alter_result.size())
diff --git a/regression-test/suites/statistics/test_analyze_mv.groovy 
b/regression-test/suites/statistics/test_analyze_mv.groovy
index 60284ef8bc4..661dc0e5510 100644
--- a/regression-test/suites/statistics/test_analyze_mv.groovy
+++ b/regression-test/suites/statistics/test_analyze_mv.groovy
@@ -126,18 +126,26 @@ suite("test_analyze_mv") {
             "replication_num" = "1" 
         )
     """
-    sql """create materialized view mv1 as select key1 from mvTestDup;"""
-    wait_mv_finish("test_analyze_mv", "mvTestDup")
-    sql """create materialized view mv2 as select key2 from mvTestDup;"""
-    wait_mv_finish("test_analyze_mv", "mvTestDup")
-    sql """create materialized view mv3 as select key1, key2, sum(value1), 
max(value2), min(value3) from mvTestDup group by key1, key2;"""
-    wait_mv_finish("test_analyze_mv", "mvTestDup")
+    def result_row
+    if (!isCloudMode()) {
+        // Test row count report and report for nereids
+        result_row = sql """show index stats mvTestDup mvTestDup"""
+        assertEquals(1, result_row.size())
+        assertEquals("mvTestDup", result_row[0][0])
+        assertEquals("mvTestDup", result_row[0][1])
+        assertEquals("0", result_row[0][3])
+        assertEquals("-1", result_row[0][4])
+    }
+
+    createMV("create materialized view mv1 as select key1 from mvTestDup;")
+    createMV("create materialized view mv2 as select key2 from mvTestDup;")
+    createMV("create materialized view mv3 as select key1, key2, sum(value1), 
max(value2), min(value3) from mvTestDup group by key1, key2;")
     sql """insert into mvTestDup values (1, 2, 3, 4, 5), (1, 2, 3, 4, 5), (10, 
20, 30, 40, 50), (10, 20, 30, 40, 50), (100, 200, 300, 400, 500), (1001, 2001, 
3001, 4001, 5001);"""
 
     sql """analyze table mvTestDup with sync;"""
 
     // Test show index row count
-    def result_row = sql """show index stats mvTestDup mvTestDup"""
+    result_row = sql """show index stats mvTestDup mvTestDup"""
     assertEquals(1, result_row.size())
     assertEquals("mvTestDup", result_row[0][0])
     assertEquals("mvTestDup", result_row[0][1])
@@ -470,6 +478,35 @@ suite("test_analyze_mv") {
         logger.info(e.getMessage());
         return;
     }
+
+    if (!isCloudMode()) {
+        // Test row count report and report for nereids
+        result_row = sql """show index stats mvTestDup mvTestDup"""
+        assertEquals(1, result_row.size())
+        assertEquals("mvTestDup", result_row[0][0])
+        assertEquals("mvTestDup", result_row[0][1])
+        assertEquals("6", result_row[0][3])
+        assertEquals("6", result_row[0][4])
+        result_row = sql """show index stats mvTestDup mv1"""
+        assertEquals(1, result_row.size())
+        assertEquals("mvTestDup", result_row[0][0])
+        assertEquals("mv1", result_row[0][1])
+        assertEquals("6", result_row[0][3])
+        assertEquals("6", result_row[0][4])
+        result_row = sql """show index stats mvTestDup mv2"""
+        assertEquals(1, result_row.size())
+        assertEquals("mvTestDup", result_row[0][0])
+        assertEquals("mv2", result_row[0][1])
+        assertEquals("6", result_row[0][3])
+        assertEquals("6", result_row[0][4])
+        result_row = sql """show index stats mvTestDup mv3"""
+        assertEquals(1, result_row.size())
+        assertEquals("mvTestDup", result_row[0][0])
+        assertEquals("mv3", result_row[0][1])
+        assertEquals("4", result_row[0][3])
+        assertEquals("4", result_row[0][4])
+    }
+
     sql """analyze table mvTestDup with sample rows 4000000"""
     wait_analyze_finish("mvTestDup")
     result_sample = sql """SHOW ANALYZE mvTestDup;"""
@@ -617,6 +654,38 @@ suite("test_analyze_mv") {
     verifyTaskStatus(result_sample, "mva_MIN__`value3`", "mv3")
     verifyTaskStatus(result_sample, "mva_SUM__CAST(`value1` AS bigint)", "mv3")
 
+    if (!isCloudMode()) {
+        // Test row count report and report for nereids
+        sql """truncate table mvTestDup"""
+        result_row = sql """show index stats mvTestDup mv3"""
+        assertEquals(1, result_row.size())
+        assertEquals("mvTestDup", result_row[0][0])
+        assertEquals("mv3", result_row[0][1])
+        assertEquals("0", result_row[0][3])
+        assertEquals("-1", result_row[0][4])
+
+        for (int i = 0; i < 120; i++) {
+            result_row = sql """show index stats mvTestDup mv3"""
+            logger.info("mv3 stats: " + result_row)
+            if (result_row[0][4] == "0") {
+                break;
+            }
+            Thread.sleep(5000)
+        }
+        result_row = sql """show index stats mvTestDup mv3"""
+        assertEquals(1, result_row.size())
+        assertEquals("mvTestDup", result_row[0][0])
+        assertEquals("mv3", result_row[0][1])
+        assertEquals("0", result_row[0][3])
+        assertEquals("0", result_row[0][4])
+        sql """insert into mvTestDup values (1, 2, 3, 4, 5), (1, 2, 3, 4, 5), 
(10, 20, 30, 40, 50), (10, 20, 30, 40, 50), (100, 200, 300, 400, 500), (1001, 
2001, 3001, 4001, 5001);"""
+        result_row = sql """show index stats mvTestDup mv3"""
+        assertEquals(1, result_row.size())
+        assertEquals("mvTestDup", result_row[0][0])
+        assertEquals("mv3", result_row[0][1])
+        assertEquals("-1", result_row[0][4])
+    }
+
     // Test alter column stats
     sql """drop stats mvTestDup"""
     sql """alter table mvTestDup modify column key1 set stats ('ndv'='1', 
'num_nulls'='1', 'min_value'='10', 'max_value'='40', 'row_count'='50');"""


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to