This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.1 by this push:
new e7525459f8f branch-4.1: [fix](statistics) Skip statistics cache for
system dbs #63089 (#63198)
e7525459f8f is described below
commit e7525459f8f70515dbc48bb11940ad9d73f61976
Author: yujun <[email protected]>
AuthorDate: Fri May 15 15:46:29 2026 +0800
branch-4.1: [fix](statistics) Skip statistics cache for system dbs #63089
(#63198)
cherry-pick: #63089
---
.../doris/statistics/StatisticConstants.java | 14 +++++
.../apache/doris/statistics/StatisticsCache.java | 28 ++++++----
.../org/apache/doris/statistics/CacheTest.java | 4 +-
.../doris/statistics/StatisticsCacheTest.java | 64 ++++++++++++++++++++++
4 files changed, 97 insertions(+), 13 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticConstants.java
b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticConstants.java
index 166ebbbec96..5fd0a0361e7 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticConstants.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticConstants.java
@@ -19,6 +19,8 @@ package org.apache.doris.statistics;
import org.apache.doris.analysis.ColumnDef;
import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.Env;
import org.apache.doris.catalog.InfoSchemaDb;
import org.apache.doris.catalog.InternalSchema;
import org.apache.doris.catalog.MysqlDb;
@@ -29,6 +31,7 @@ import org.apache.doris.datasource.InternalCatalog;
import java.util.ArrayList;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -133,6 +136,17 @@ public class StatisticConstants {
return false;
}
+ public static boolean isSystemDb(long catalogId, long dbId) {
+ if (catalogId != InternalCatalog.INTERNAL_CATALOG_ID) {
+ return false;
+ }
+ if (dbId == InfoSchemaDb.DATABASE_ID || dbId == MysqlDb.DATABASE_ID) {
+ return true;
+ }
+ Optional<Database> internalDb =
Env.getCurrentEnv().getInternalCatalog().getDb(FeConstants.INTERNAL_DB_NAME);
+ return internalDb.isPresent() && internalDb.get().getId() == dbId;
+ }
+
public static boolean shouldIgnoreCol(TableIf tableIf, Column c) {
if (isSystemTable(tableIf)) {
return true;
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 6ba538b81a3..08532976def 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
@@ -93,7 +93,7 @@ public class StatisticsCache {
public ColumnStatistic getColumnStatistics(
long catalogId, long dbId, long tblId, long idxId, String colName,
ConnectContext ctx) {
- if (ctx != null && ctx.getState().isPlanWithUnKnownColumnStats()) {
+ if (shouldReturnUnknownStats(catalogId, dbId, ctx)) {
return ColumnStatistic.UNKNOWN;
}
// Need to change base index id to -1 for OlapTable.
@@ -130,7 +130,7 @@ public class StatisticsCache {
public PartitionColumnStatistic getPartitionColumnStatistics(long
catalogId, long dbId, long tblId, long idxId,
String partName, String
colName, ConnectContext ctx) {
- if (ctx != null && ctx.getState().isPlanWithUnKnownColumnStats()) {
+ if (shouldReturnUnknownStats(catalogId, dbId, ctx)) {
return PartitionColumnStatistic.UNKNOWN;
}
// Need to change base index id to -1 for OlapTable.
@@ -157,6 +157,18 @@ public class StatisticsCache {
return PartitionColumnStatistic.UNKNOWN;
}
+ private boolean shouldReturnUnknownStats(long catalogId, long dbId,
ConnectContext ctx) {
+ return isPlanWithUnknownColumnStats(ctx) ||
StatisticConstants.isSystemDb(catalogId, dbId);
+ }
+
+ private boolean shouldReturnUnknownStats(long catalogId, long dbId,
TableIf table, ConnectContext ctx) {
+ return shouldReturnUnknownStats(catalogId, dbId, ctx) ||
StatisticConstants.isSystemTable(table);
+ }
+
+ private boolean isPlanWithUnknownColumnStats(ConnectContext ctx) {
+ return ctx != null && ctx.getState().isPlanWithUnKnownColumnStats();
+ }
+
// Base index id should be set to -1 for OlapTable. Because statistics
tables use -1 for base index.
// TODO: Need to use the real index id in statistics table in later
version.
private long changeBaseIndexId(long catalogId, long dbId, long tblId, long
idxId) {
@@ -178,7 +190,7 @@ public class StatisticsCache {
private Optional<Histogram> getHistogram(long ctlId, long dbId, long
tblId, long idxId, String colName) {
ConnectContext ctx = ConnectContext.get();
- if (ctx != null && ctx.getState().isPlanWithUnKnownColumnStats()) {
+ if (shouldReturnUnknownStats(ctlId, dbId, ctx)) {
return Optional.empty();
}
StatisticsCacheKey k = new StatisticsCacheKey(ctlId, dbId, tblId,
idxId, colName);
@@ -398,10 +410,7 @@ public class StatisticsCache {
// this method can avoid compute table and select index id
public ColumnStatistic getColumnStatistics(String colName,
ConnectContext ctx) {
- if (ctx != null && ctx.getState().isPlanWithUnKnownColumnStats()) {
- return ColumnStatistic.UNKNOWN;
- }
- if (StatisticConstants.isSystemTable(olapTable)) {
+ if (shouldReturnUnknownStats(catalogId, schemaId, olapTable, ctx))
{
return ColumnStatistic.UNKNOWN;
}
return doGetColumnStatistics(
@@ -411,10 +420,7 @@ public class StatisticsCache {
public PartitionColumnStatistic getPartitionColumnStatistics(
String partName, String colName, ConnectContext ctx) {
- if (ctx != null && ctx.getState().isPlanWithUnKnownColumnStats()) {
- return PartitionColumnStatistic.UNKNOWN;
- }
- if (StatisticConstants.isSystemTable(olapTable)) {
+ if (shouldReturnUnknownStats(catalogId, schemaId, olapTable, ctx))
{
return PartitionColumnStatistic.UNKNOWN;
}
return doGetPartitionColumnStatistics(
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/statistics/CacheTest.java
b/fe/fe-core/src/test/java/org/apache/doris/statistics/CacheTest.java
index e81a23f0e7c..47c047994b0 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/statistics/CacheTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/CacheTest.java
@@ -205,9 +205,9 @@ public class CacheTest extends TestWithFeService {
};
StatisticsCache statisticsCache = new StatisticsCache();
- statisticsCache.refreshHistogramSync(0, 0, 0, -1, "col");
+ statisticsCache.refreshHistogramSync(1, 1, 0, -1, "col");
Thread.sleep(10000);
- Histogram histogram = statisticsCache.getHistogram(0, 0, 0, "col");
+ Histogram histogram = statisticsCache.getHistogram(1, 1, 0, "col");
Assertions.assertNotNull(histogram);
}
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 712be0ef0b6..d172ac53c09 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,10 +17,14 @@
package org.apache.doris.statistics;
+import org.apache.doris.catalog.Database;
import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.InfoSchemaDb;
import org.apache.doris.catalog.OlapTable;
import org.apache.doris.common.FeConstants;
import org.apache.doris.datasource.CatalogIf;
+import org.apache.doris.datasource.InternalCatalog;
import org.apache.doris.nereids.trees.plans.algebra.OlapScan;
import org.apache.doris.qe.ConnectContext;
import org.apache.doris.utframe.UtFrameUtils;
@@ -30,6 +34,7 @@ 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.MockedStatic;
import org.mockito.Mockito;
public class StatisticsCacheTest {
@@ -115,6 +120,65 @@ public class StatisticsCacheTest {
}
}
+ @Test
+ public void testGetStatisticsSkipSystemDb() {
+ try (MockedConstruction<ColumnStatisticsCacheLoader> columnLoader =
Mockito.mockConstruction(
+ ColumnStatisticsCacheLoader.class);
+ MockedConstruction<HistogramCacheLoader> histogramLoader =
Mockito.mockConstruction(
+ HistogramCacheLoader.class);
+ MockedConstruction<PartitionColumnStatisticCacheLoader>
partitionLoader = Mockito.mockConstruction(
+ PartitionColumnStatisticCacheLoader.class)) {
+ StatisticsCache cache = new StatisticsCache();
+
+ Assertions.assertEquals(ColumnStatistic.UNKNOWN,
cache.getColumnStatistics(
+ InternalCatalog.INTERNAL_CATALOG_ID,
InfoSchemaDb.DATABASE_ID, 1L, 2L,
+ "col", ConnectContext.get()));
+ Assertions.assertEquals(PartitionColumnStatistic.UNKNOWN,
cache.getPartitionColumnStatistics(
+ InternalCatalog.INTERNAL_CATALOG_ID,
InfoSchemaDb.DATABASE_ID, 1L, 2L,
+ "p1", "col", ConnectContext.get()));
+ Assertions.assertNull(cache.getHistogram(
+ InternalCatalog.INTERNAL_CATALOG_ID,
InfoSchemaDb.DATABASE_ID, 1L, "col"));
+
+ Mockito.verifyNoInteractions(columnLoader.constructed().get(0));
+ Mockito.verifyNoInteractions(histogramLoader.constructed().get(0));
+ Mockito.verifyNoInteractions(partitionLoader.constructed().get(0));
+ }
+ }
+
+ @Test
+ public void testGetStatisticsSkipInternalSchemaDb() {
+ long internalSchemaDbId = 12345L;
+ Env env = Mockito.mock(Env.class);
+ InternalCatalog internalCatalog = Mockito.mock(InternalCatalog.class);
+ Mockito.when(env.getInternalCatalog()).thenReturn(internalCatalog);
+ Mockito.when(internalCatalog.getDb(FeConstants.INTERNAL_DB_NAME))
+ .thenReturn(java.util.Optional.of(new
Database(internalSchemaDbId, FeConstants.INTERNAL_DB_NAME)));
+
+ try (MockedStatic<Env> mockedEnv = Mockito.mockStatic(Env.class);
+ MockedConstruction<ColumnStatisticsCacheLoader> columnLoader =
Mockito.mockConstruction(
+ ColumnStatisticsCacheLoader.class);
+ MockedConstruction<HistogramCacheLoader> histogramLoader =
Mockito.mockConstruction(
+ HistogramCacheLoader.class);
+ MockedConstruction<PartitionColumnStatisticCacheLoader>
partitionLoader = Mockito.mockConstruction(
+ PartitionColumnStatisticCacheLoader.class)) {
+ mockedEnv.when(Env::getCurrentEnv).thenReturn(env);
+ StatisticsCache cache = new StatisticsCache();
+
+ Assertions.assertEquals(ColumnStatistic.UNKNOWN,
cache.getColumnStatistics(
+ InternalCatalog.INTERNAL_CATALOG_ID, internalSchemaDbId,
1L, 2L,
+ "col", ConnectContext.get()));
+ Assertions.assertEquals(PartitionColumnStatistic.UNKNOWN,
cache.getPartitionColumnStatistics(
+ InternalCatalog.INTERNAL_CATALOG_ID, internalSchemaDbId,
1L, 2L,
+ "p1", "col", ConnectContext.get()));
+ Assertions.assertNull(cache.getHistogram(
+ InternalCatalog.INTERNAL_CATALOG_ID, internalSchemaDbId,
1L, "col"));
+
+ Mockito.verifyNoInteractions(columnLoader.constructed().get(0));
+ Mockito.verifyNoInteractions(histogramLoader.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);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]