diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 7321ddbb51..eb4f6d93ab 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -4410,7 +4410,16 @@ public class Env { throw new DdlException(ErrorCode.ERR_UNKNOWN_CATALOG.formatErrorMsg(catalogName), ErrorCode.ERR_UNKNOWN_CATALOG); } + + String currentDB = ctx.getDatabase(); + if (StringUtils.isNotEmpty(currentDB)) { + catalogMgr.addLastDBOfCatalog(ctx.getCurrentCatalog().getName(), currentDB); + } ctx.changeDefaultCatalog(catalogName); + String lastDb = catalogMgr.getLastDB(catalogName); + if (StringUtils.isNotEmpty(lastDb)) { + ctx.setDatabase(lastDb); + } if (catalogIf instanceof EsExternalCatalog) { ctx.setDatabase(SystemInfoService.DEFAULT_CLUSTER + ClusterNamespace.CLUSTER_DELIMITER + EsExternalCatalog.DEFAULT_DB); diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java index 8f959030a3..7071433049 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java @@ -76,6 +76,8 @@ public class CatalogMgr implements Writable, GsonPostProcessable { private final Map idToCatalog = Maps.newConcurrentMap(); // this map will be regenerated from idToCatalog, so not need to persist. private final Map nameToCatalog = Maps.newConcurrentMap(); + // record last used database of every catalog + private final Map lastDBOfCatalog = Maps.newConcurrentMap(); // Use a separate instance to facilitate access. // internalDataSource still exists in idToDataSource and nameToDataSource @@ -105,6 +107,7 @@ public class CatalogMgr implements Writable, GsonPostProcessable { if (catalog != null) { catalog.onClose(); nameToCatalog.remove(catalog.getName()); + lastDBOfCatalog.remove(catalog.getName()); Env.getCurrentEnv().getExtMetaCacheMgr().removeCache(catalog.getName()); } return catalog; @@ -146,6 +149,14 @@ public class CatalogMgr implements Writable, GsonPostProcessable { ErrorCode.ERR_UNKNOWN_CATALOG)); } + public void addLastDBOfCatalog(String catalog, String db) { + lastDBOfCatalog.put(catalog, db); + } + + public String getLastDB(String catalog) { + return lastDBOfCatalog.get(catalog); + } + public List getCatalogIds() { return Lists.newArrayList(idToCatalog.keySet()); } @@ -241,6 +252,8 @@ public class CatalogMgr implements Writable, GsonPostProcessable { CatalogLog log = CatalogFactory.constructorCatalogLog(catalog.getId(), stmt); replayDropCatalog(log); Env.getCurrentEnv().getEditLog().logCatalogLog(OperationType.OP_DROP_CATALOG, log); + + lastDBOfCatalog.remove(stmt.getCatalogName()); } finally { writeUnlock(); } @@ -262,6 +275,12 @@ public class CatalogMgr implements Writable, GsonPostProcessable { CatalogLog log = CatalogFactory.constructorCatalogLog(catalog.getId(), stmt); replayAlterCatalogName(log); Env.getCurrentEnv().getEditLog().logCatalogLog(OperationType.OP_ALTER_CATALOG_NAME, log); + + String db = lastDBOfCatalog.get(stmt.getCatalogName()); + if (db != null) { + lastDBOfCatalog.remove(stmt.getCatalogName()); + lastDBOfCatalog.put(log.getNewCatalogName(), db); + } } finally { writeUnlock(); } diff --git a/regression-test/suites/external_table_emr_p2/hive/test_external_catalog_hive.groovy b/regression-test/suites/external_table_emr_p2/hive/test_external_catalog_hive.groovy index 7917a1c902..ba25807c51 100644 --- a/regression-test/suites/external_table_emr_p2/hive/test_external_catalog_hive.groovy +++ b/regression-test/suites/external_table_emr_p2/hive/test_external_catalog_hive.groovy @@ -89,6 +89,25 @@ suite("test_external_catalog_hive", "p2") { sql """ use tpch_1000_orc; """ q03() + + // test remember last used database after switch / rename catalog + sql """switch ${catalog_name};""" + + sql """use test;""" + + def res2 = sql """select count(*) from hive_test limit 10;""" + logger.info("recoding select: " + res2.toString()) + + sql """switch internal;""" + + sql """alter catalog ${catalog_name} rename hms;""" + + sql """switch hms;""" + + def res3 = sql """select count(*) from hive_test limit 10;""" + logger.info("recoding select: " + res3.toString()) + + sql """alter catalog hms rename ${catalog_name};""" } finally { // sql """admin set frontend config ("enable_multi_catalog" = "false")""" } diff --git a/regression-test/suites/external_table_emr_p2/hive/test_external_hive.groovy b/regression-test/suites/external_table_emr_p2/hive/test_external_hive.groovy index f80940ecb2..9ac49a0aa4 100644 --- a/regression-test/suites/external_table_emr_p2/hive/test_external_hive.groovy +++ b/regression-test/suites/external_table_emr_p2/hive/test_external_hive.groovy @@ -56,4 +56,3 @@ suite("test_external_hive", "p2") { -