From 84211ac52736f5dc97dee02d6fe01525ea619f76 Mon Sep 17 00:00:00 2001 From: morningman Date: Mon, 28 Jul 2025 16:37:49 -0700 Subject: [PATCH] branch-3.0: [fix](catalog) fix refresh logic with lower case table name(#52989) --- .../doris/datasource/ExternalDatabase.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDatabase.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDatabase.java index c122c8c568f82b..7307347c4ad935 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDatabase.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDatabase.java @@ -137,6 +137,7 @@ public void setTableExtCatalog(ExternalCatalog extCatalog) { public synchronized void setUnInitialized(boolean invalidCache) { this.initialized = false; this.invalidCacheInInit = invalidCache; + this.lowerCaseToTableName = Maps.newConcurrentMap(); if (extCatalog.getUseMetaCache().isPresent()) { if (extCatalog.getUseMetaCache().get() && metaCache != null) { metaCache.invalidateAll(); @@ -321,6 +322,7 @@ private void init() { private List> listTableNames() { List> tableNames; + this.lowerCaseToTableName.clear(); if (name.equals(InfoSchemaDb.DATABASE_NAME)) { tableNames = ExternalInfoSchemaDatabase.listTableNames().stream() .map(tableName -> { @@ -586,37 +588,36 @@ public Set getTableNamesWithLock() { @Override public T getTableNullable(String tableName) { makeSureInitialized(); + String finalName = tableName; if (this.isStoredTableNamesLowerCase()) { - tableName = tableName.toLowerCase(); + finalName = tableName.toLowerCase(); } if (this.isTableNamesCaseInsensitive()) { - String realTableName = lowerCaseToTableName.get(tableName.toLowerCase()); - if (realTableName == null) { + finalName = lowerCaseToTableName.get(tableName.toLowerCase()); + if (finalName == null) { // Here we need to execute listTableNames() once to fill in lowerCaseToTableName // to prevent lowerCaseToTableName from being empty in some cases listTableNames(); - tableName = lowerCaseToTableName.get(tableName.toLowerCase()); - if (tableName == null) { + finalName = lowerCaseToTableName.get(tableName.toLowerCase()); + if (finalName == null) { return null; } - } else { - tableName = realTableName; } } if (extCatalog.getLowerCaseMetaNames().equalsIgnoreCase("true") && (this.isTableNamesCaseInsensitive())) { - tableName = tableName.toLowerCase(); + finalName = tableName.toLowerCase(); } if (extCatalog.getUseMetaCache().get()) { // must use full qualified name to generate id. // otherwise, if 2 databases have the same table name, the id will be the same. - return metaCache.getMetaObj(tableName, - Util.genIdByName(extCatalog.getName(), name, tableName)).orElse(null); + return metaCache.getMetaObj(finalName, + Util.genIdByName(extCatalog.getName(), name, finalName)).orElse(null); } else { - if (!tableNameToId.containsKey(tableName)) { + if (!tableNameToId.containsKey(finalName)) { return null; } - return idToTbl.get(tableNameToId.get(tableName)); + return idToTbl.get(tableNameToId.get(finalName)); } }