[fix](multicatalog) make lastdbofcatalog a session variable (#38114)
bp #37828
This commit is contained in:
@ -5204,7 +5204,7 @@ public class Env {
|
||||
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) {
|
||||
@ -5216,11 +5216,11 @@ public class Env {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -96,8 +96,6 @@ public class CatalogMgr implements Writable, GsonPostProcessable {
|
||||
private final Map<Long, CatalogIf<? extends DatabaseIf<? extends TableIf>>> idToCatalog = Maps.newConcurrentMap();
|
||||
// this map will be regenerated from idToCatalog, so not need to persist.
|
||||
private final Map<String, CatalogIf> nameToCatalog = Maps.newConcurrentMap();
|
||||
// record last used database of every catalog
|
||||
private final Map<String, String> lastDBOfCatalog = Maps.newConcurrentMap();
|
||||
|
||||
// Use a separate instance to facilitate access.
|
||||
// internalDataSource still exists in idToCatalog and nameToCatalog
|
||||
@ -140,7 +138,9 @@ public class CatalogMgr implements Writable, GsonPostProcessable {
|
||||
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 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<Long> getCatalogIds() {
|
||||
return Lists.newArrayList(idToCatalog.keySet());
|
||||
}
|
||||
@ -282,7 +274,9 @@ public class CatalogMgr implements Writable, GsonPostProcessable {
|
||||
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 class CatalogMgr implements Writable, GsonPostProcessable {
|
||||
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();
|
||||
|
||||
@ -174,6 +174,9 @@ public class ConnectContext {
|
||||
protected String defaultCatalog = InternalCatalog.INTERNAL_CATALOG_NAME;
|
||||
protected boolean isSend;
|
||||
|
||||
// record last used database of every catalog
|
||||
private final Map<String, String> lastDBOfCatalog = Maps.newConcurrentMap();
|
||||
|
||||
protected AuditEventBuilder auditEventBuilder = new AuditEventBuilder();
|
||||
|
||||
protected String remoteIP;
|
||||
@ -321,6 +324,18 @@ public class ConnectContext {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user