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 2acdf00a49..6b0a218f30 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 @@ -495,12 +495,18 @@ public class OlapTable extends Table implements MTMVRelatedTableIf { return null; } + /** + * This function is for statistics collection only. To get all the index ids that contains the given columnName. + * For base index, return -1 as its id, this is for compatibility with older version of column stats. + * @param columnName + * @return index id list that contains the given columnName. + */ public List getMvColumnIndexIds(String columnName) { List ids = Lists.newArrayList(); for (MaterializedIndexMeta meta : getVisibleIndexIdToMeta().values()) { Column target = meta.getColumnByDefineName(columnName); if (target != null) { - ids.add(meta.getIndexId()); + ids.add(meta.getIndexId() == baseIndexId ? -1 : meta.getIndexId()); } } return ids; 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 a6748145e3..8bafeaae28 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 @@ -2597,9 +2597,8 @@ public class ShowExecutor { for (String colName : columnNames) { // Olap base index use -1 as index id. List indexIds = Lists.newArrayList(); - if (StatisticsUtil.isMvColumn(tableIf, colName)) { - OlapTable olapTable = (OlapTable) tableIf; - indexIds = olapTable.getMvColumnIndexIds(colName); + if (tableIf instanceof OlapTable) { + indexIds = ((OlapTable) tableIf).getMvColumnIndexIds(colName); } else { indexIds.add(-1L); } @@ -3026,7 +3025,7 @@ public class ShowExecutor { List row = new ArrayList<>(); row.add(String.valueOf(analysisInfo.taskId)); row.add(analysisInfo.colName); - if (StatisticsUtil.isMvColumn(table, analysisInfo.colName)) { + if (table instanceof OlapTable && analysisInfo.indexId != -1) { row.add(((OlapTable) table).getIndexNameById(analysisInfo.indexId)); } else { row.add("N/A"); 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 eac50b4075..eafcff3e7f 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 @@ -423,9 +423,8 @@ public class AnalysisManager implements Writable { String colName = entry.getKey(); List indexIds = Lists.newArrayList(); // Get index id this column belongs to for OlapTable. Set it to -1 for baseIndex id. - if (StatisticsUtil.isMvColumn(table, colName)) { - OlapTable olapTable = (OlapTable) table; - indexIds = olapTable.getMvColumnIndexIds(colName); + if (table instanceof OlapTable) { + indexIds = ((OlapTable) table).getMvColumnIndexIds(colName); } else { indexIds.add(-1L); } @@ -702,9 +701,8 @@ public class AnalysisManager implements Writable { for (String column : columns) { List indexIds = Lists.newArrayList(); - if (StatisticsUtil.isMvColumn(table, column)) { - OlapTable olapTable = (OlapTable) table; - indexIds = olapTable.getMvColumnIndexIds(column); + if (table instanceof OlapTable) { + indexIds = ((OlapTable) table).getMvColumnIndexIds(column); } else { indexIds.add(-1L); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java index a85a1e5f1d..466db9088e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java @@ -379,6 +379,13 @@ public class StatisticsAutoCollectorTest { public BaseAnalysisTask createAnalysisTask(AnalysisInfo info) { return new OlapAnalysisTask(info); } + + @Mock + public List getMvColumnIndexIds(String columnName) { + ArrayList objects = new ArrayList<>(); + objects.add(-1L); + return objects; + } }; new MockUp() { @@ -444,6 +451,13 @@ public class StatisticsAutoCollectorTest { public BaseAnalysisTask createAnalysisTask(AnalysisInfo info) { return new OlapAnalysisTask(info); } + + @Mock + public List getMvColumnIndexIds(String columnName) { + ArrayList objects = new ArrayList<>(); + objects.add(-1L); + return objects; + } }; new MockUp() { diff --git a/regression-test/suites/statistics/test_analyze_mv.groovy b/regression-test/suites/statistics/test_analyze_mv.groovy index 5c60c902bf..7295b3e3a0 100644 --- a/regression-test/suites/statistics/test_analyze_mv.groovy +++ b/regression-test/suites/statistics/test_analyze_mv.groovy @@ -240,11 +240,73 @@ suite("test_analyze_mv") { wait_mv_finish("test_analyze_mv", "mvTestAgg") sql """create materialized view mv6 as select key1, sum(value1) from mvTestAgg group by key1;""" wait_mv_finish("test_analyze_mv", "mvTestAgg") + sql """alter table mvTestAgg ADD ROLLUP rollup1(key1, value1)""" + wait_mv_finish("test_analyze_mv", "mvTestAgg") sql """insert into mvTestAgg values (1, 2, 3, 4, 5), (1, 2, 3, 4, 5), (1, 11, 22, 33, 44), (10, 20, 30, 40, 50), (10, 20, 30, 40, 50), (100, 200, 300, 400, 500), (1001, 2001, 3001, 4001, 5001);""" sql """analyze table mvTestAgg with sync;""" result_sample = sql """show column stats mvTestAgg""" - assertEquals(13, result_sample.size()) + assertEquals(15, result_sample.size()) + + result_sample = sql """show column stats mvTestAgg(key1)""" + assertEquals(2, result_sample.size()) + if (result_sample[0][1] == "N/A") { + assertEquals("key1", result_sample[0][0]) + assertEquals("N/A", result_sample[0][1]) + assertEquals("5.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("1", result_sample[0][7]) + assertEquals("1001", result_sample[0][8]) + assertEquals("key1", result_sample[1][0]) + assertEquals("rollup1", result_sample[1][1]) + assertEquals("4.0", result_sample[1][2]) + assertEquals("4.0", result_sample[1][3]) + assertEquals("1", result_sample[1][7]) + assertEquals("1001", result_sample[1][8]) + } else { + assertEquals("key1", result_sample[1][0]) + assertEquals("N/A", result_sample[1][1]) + assertEquals("5.0", result_sample[1][2]) + assertEquals("4.0", result_sample[1][3]) + assertEquals("1", result_sample[1][7]) + assertEquals("1001", result_sample[1][8]) + assertEquals("key1", result_sample[0][0]) + assertEquals("rollup1", result_sample[0][1]) + assertEquals("4.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("1", result_sample[0][7]) + assertEquals("1001", result_sample[0][8]) + } + + result_sample = sql """show column stats mvTestAgg(value1)""" + assertEquals(2, result_sample.size()) + if (result_sample[0][1] == "N/A") { + assertEquals("value1", result_sample[0][0]) + assertEquals("N/A", result_sample[0][1]) + assertEquals("5.0", result_sample[0][2]) + assertEquals("5.0", result_sample[0][3]) + assertEquals("6", result_sample[0][7]) + assertEquals("3001", result_sample[0][8]) + assertEquals("value1", result_sample[1][0]) + assertEquals("rollup1", result_sample[1][1]) + assertEquals("4.0", result_sample[1][2]) + assertEquals("4.0", result_sample[1][3]) + assertEquals("28", result_sample[1][7]) + assertEquals("3001", result_sample[1][8]) + } else { + assertEquals("value1", result_sample[1][0]) + assertEquals("N/A", result_sample[1][1]) + assertEquals("5.0", result_sample[1][2]) + assertEquals("5.0", result_sample[1][3]) + assertEquals("6", result_sample[1][7]) + assertEquals("3001", result_sample[1][8]) + assertEquals("value1", result_sample[0][0]) + assertEquals("rollup1", result_sample[0][1]) + assertEquals("4.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("28", result_sample[0][7]) + assertEquals("3001", result_sample[0][8]) + } result_sample = sql """show column stats mvTestAgg(key2)""" assertEquals(1, result_sample.size())