diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java index e8a5c519660ad2..6ba538b81a37d6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java @@ -401,6 +401,9 @@ public ColumnStatistic getColumnStatistics(String colName, ConnectContext ctx) { if (ctx != null && ctx.getState().isPlanWithUnKnownColumnStats()) { return ColumnStatistic.UNKNOWN; } + if (StatisticConstants.isSystemTable(olapTable)) { + return ColumnStatistic.UNKNOWN; + } return doGetColumnStatistics( catalogId, schemaId, tableId, selectIndexId, colName, ctx ); @@ -411,6 +414,9 @@ public PartitionColumnStatistic getPartitionColumnStatistics( if (ctx != null && ctx.getState().isPlanWithUnKnownColumnStats()) { return PartitionColumnStatistic.UNKNOWN; } + if (StatisticConstants.isSystemTable(olapTable)) { + return PartitionColumnStatistic.UNKNOWN; + } return doGetPartitionColumnStatistics( catalogId, schemaId, tableId, selectIndexId, partName, colName ); diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsCacheTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsCacheTest.java index cb1dffbe106faf..712be0ef0b6139 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsCacheTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsCacheTest.java @@ -17,6 +17,11 @@ package org.apache.doris.statistics; +import org.apache.doris.catalog.DatabaseIf; +import org.apache.doris.catalog.OlapTable; +import org.apache.doris.common.FeConstants; +import org.apache.doris.datasource.CatalogIf; +import org.apache.doris.nereids.trees.plans.algebra.OlapScan; import org.apache.doris.qe.ConnectContext; import org.apache.doris.utframe.UtFrameUtils; @@ -24,6 +29,8 @@ import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.MockedConstruction; +import org.mockito.Mockito; public class StatisticsCacheTest { @@ -87,4 +94,43 @@ public void testGetPartitionColumnStatistics_withPlanWithUnknownColumnStats() { ConnectContext.get().getState().setPlanWithUnKnownColumnStats(prevFlag); } } + + @Test + public void testOlapTableStatisticsSkipSystemTable() { + try (MockedConstruction columnLoader = Mockito.mockConstruction( + ColumnStatisticsCacheLoader.class); + MockedConstruction partitionLoader = Mockito.mockConstruction( + PartitionColumnStatisticCacheLoader.class)) { + StatisticsCache cache = new StatisticsCache(); + StatisticsCache.OlapTableStatistics olapTableStats = + cache.getOlapTableStats(mockSystemOlapScan(FeConstants.INTERNAL_DB_NAME)); + + Assertions.assertEquals(ColumnStatistic.UNKNOWN, + olapTableStats.getColumnStatistics("col", ConnectContext.get())); + Assertions.assertEquals(PartitionColumnStatistic.UNKNOWN, + olapTableStats.getPartitionColumnStatistics("p1", "col", ConnectContext.get())); + + Mockito.verifyNoInteractions(columnLoader.constructed().get(0)); + Mockito.verifyNoInteractions(partitionLoader.constructed().get(0)); + } + } + + private OlapScan mockSystemOlapScan(String dbName) { + CatalogIf catalog = Mockito.mock(CatalogIf.class); + Mockito.when(catalog.getId()).thenReturn(1L); + DatabaseIf database = Mockito.mock(DatabaseIf.class); + Mockito.when(database.getId()).thenReturn(2L); + Mockito.when(database.getCatalog()).thenReturn(catalog); + + OlapTable table = Mockito.mock(OlapTable.class); + Mockito.when(table.getQualifiedDbName()).thenReturn(dbName); + Mockito.when(table.getDatabase()).thenReturn(database); + Mockito.when(table.getId()).thenReturn(3L); + Mockito.when(table.getBaseIndexId()).thenReturn(4L); + + OlapScan scan = Mockito.mock(OlapScan.class); + Mockito.when(scan.getTable()).thenReturn(table); + Mockito.when(scan.getSelectedIndexId()).thenReturn(4L); + return scan; + } }