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 c999024d359815..77ac38dcd10297 100644 --- 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 @@ -5368,7 +5368,7 @@ public void cancelAlterCluster(CancelAlterSystemStmt stmt) throws DdlException { this.alter.getClusterHandler().cancel(stmt); } - // Switch catalog of this sesseion. + // Switch catalog of this session public void changeCatalog(ConnectContext ctx, String catalogName) throws DdlException { CatalogIf catalogIf = catalogMgr.getCatalog(catalogName); if (catalogIf == null) { @@ -5380,11 +5380,11 @@ public void changeCatalog(ConnectContext ctx, String catalogName) throws DdlExce if (StringUtils.isNotEmpty(currentDB)) { // When dropped the current catalog in current context, the current catalog will be null. if (ctx.getCurrentCatalog() != null) { - catalogMgr.addLastDBOfCatalog(ctx.getCurrentCatalog().getName(), currentDB); + ctx.addLastDBOfCatalog(ctx.getCurrentCatalog().getName(), currentDB); } } ctx.changeDefaultCatalog(catalogName); - String lastDb = catalogMgr.getLastDB(catalogName); + String lastDb = ctx.getLastDBOfCatalog(catalogName); if (StringUtils.isNotEmpty(lastDb)) { ctx.setDatabase(lastDb); } 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 153b7460755760..2aec7655fe5f99 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 @@ -96,8 +96,6 @@ 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 idToCatalog and nameToCatalog @@ -140,7 +138,9 @@ private CatalogIf removeCatalog(long catalogId) { if (catalog != null) { catalog.onClose(); nameToCatalog.remove(catalog.getName()); - lastDBOfCatalog.remove(catalog.getName()); + if (ConnectContext.get() != null) { + ConnectContext.get().removeLastDBOfCatalog(catalog.getName()); + } Env.getCurrentEnv().getExtMetaCacheMgr().removeCache(catalog.getId()); if (!Strings.isNullOrEmpty(catalog.getResource())) { Resource catalogResource = Env.getCurrentEnv().getResourceMgr().getResource(catalog.getResource()); @@ -194,14 +194,6 @@ public CatalogIf getCatalogOrAnalysisException(String name) throws AnalysisExcep 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()); } @@ -282,7 +274,9 @@ public void dropCatalog(DropCatalogStmt stmt) throws UserException { replayDropCatalog(log); Env.getCurrentEnv().getEditLog().logCatalogLog(OperationType.OP_DROP_CATALOG, log); - lastDBOfCatalog.remove(stmt.getCatalogName()); + if (ConnectContext.get() != null) { + ConnectContext.get().removeLastDBOfCatalog(stmt.getCatalogName()); + } Env.getCurrentEnv().getQueryStats().clear(catalog.getId()); } finally { writeUnlock(); @@ -306,10 +300,13 @@ public void alterCatalogName(AlterCatalogNameStmt stmt) throws UserException { 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); + ConnectContext ctx = ConnectContext.get(); + if (ctx != null) { + String db = ctx.getLastDBOfCatalog(stmt.getCatalogName()); + if (db != null) { + ctx.removeLastDBOfCatalog(stmt.getCatalogName()); + ctx.addLastDBOfCatalog(log.getNewCatalogName(), db); + } } } finally { writeUnlock(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java index 71a10d2117165d..e6d90fdd66d082 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java @@ -183,6 +183,9 @@ public enum ConnectType { protected String defaultCatalog = InternalCatalog.INTERNAL_CATALOG_NAME; protected boolean isSend; + // record last used database of every catalog + private final Map lastDBOfCatalog = Maps.newConcurrentMap(); + protected AuditEventBuilder auditEventBuilder = new AuditEventBuilder(); protected String remoteIP; @@ -328,6 +331,18 @@ public boolean isSend() { return this.isSend; } + public void addLastDBOfCatalog(String catalog, String db) { + lastDBOfCatalog.put(catalog, db); + } + + public String getLastDBOfCatalog(String catalog) { + return lastDBOfCatalog.get(catalog); + } + + public String removeLastDBOfCatalog(String catalog) { + return lastDBOfCatalog.get(catalog); + } + public void setNotEvalNondeterministicFunction(boolean notEvalNondeterministicFunction) { this.notEvalNondeterministicFunction = notEvalNondeterministicFunction; } diff --git a/regression-test/suites/external_table_p0/hive/test_external_catalog_hive.groovy b/regression-test/suites/external_table_p0/hive/test_external_catalog_hive.groovy index 33c8feb2a5ade8..b920168198acb7 100644 --- a/regression-test/suites/external_table_p0/hive/test_external_catalog_hive.groovy +++ b/regression-test/suites/external_table_p0/hive/test_external_catalog_hive.groovy @@ -145,10 +145,23 @@ suite("test_external_catalog_hive", "p0,external,hive,external_docker,external_d sql """alter catalog ${catalog_name} rename hms;""" sql """switch hms;""" - - def res3 = sql """select count(*) from test.hive_test limit 10;""" + sql """use test;""" + def res3 = sql """select count(*) from hive_test limit 10;""" logger.info("recoding select: " + res3.toString()) + def user = 'account_user_test' + def pwd = 'C123_567p' + try_sql("DROP USER ${user}") + sql """CREATE USER '${user}' IDENTIFIED BY '${pwd}'""" + sql """GRANT SELECT_PRIV on *.*.* to '${user}'""" + connect(user=user, password="${pwd}", url=context.config.jdbcUrl) { + sql """switch hms;""" + test { + sql "show tables" + exception "errCode = 2, detailMessage = No database selected" + } + } + sql """alter catalog hms rename ${catalog_name};""" // test wrong access controller