This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 5caf8fcd211 Enable unsetting of the current database when the database
is dropped
5caf8fcd211 is described below
commit 5caf8fcd211034f3e99f6f19f3bf72a2b948d900
Author: Caideyipi <[email protected]>
AuthorDate: Tue May 20 20:00:20 2025 +0800
Enable unsetting of the current database when the database is dropped
---
.../java/org/apache/iotdb/cli/AbstractCli.java | 4 +--
.../java/org/apache/iotdb/jdbc/IoTDBStatement.java | 9 ++++---
.../java/org/apache/iotdb/rpc/TSStatusCode.java | 2 +-
.../exception/DatabaseNotExistsException.java | 2 +-
.../metadata/DatabaseNotSetException.java | 13 ----------
.../protocol/thrift/impl/ClientRPCServiceImpl.java | 29 ++++++++++++++++++----
.../execution/config/TableConfigTaskVisitor.java | 2 +-
.../config/executor/ClusterConfigTaskExecutor.java | 22 +++++++++++++---
.../config/executor/IConfigTaskExecutor.java | 2 +-
.../config/metadata/relational/DropDBTask.java | 7 ++++--
.../plan/relational/sql/ast/DropDB.java | 6 -----
11 files changed, 58 insertions(+), 40 deletions(-)
diff --git
a/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
index b83f205ee33..50be4ea5d5a 100644
--- a/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
+++ b/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
@@ -573,8 +573,6 @@ public abstract class AbstractCli {
statement.setFetchSize(fetchSize);
boolean hasResultSet = statement.execute(cmd.trim());
long costTime = System.currentTimeMillis() - startTime;
- updateSqlDialectAndUsingDatabase(
- connection.getParams().getSqlDialect(),
connection.getParams().getDb().orElse(null));
if (hasResultSet) {
// print the result
try (ResultSet resultSet = statement.getResultSet()) {
@@ -632,6 +630,8 @@ public abstract class AbstractCli {
ctx.getPrinter().println("Msg: " + e);
executeStatus = CODE_ERROR;
} finally {
+ updateSqlDialectAndUsingDatabase(
+ connection.getParams().getSqlDialect(),
connection.getParams().getDb().orElse(null));
resetArgs();
}
return executeStatus;
diff --git
a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
index 820f8e19337..6831264f5c7 100644
--- a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
+++ b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
@@ -363,6 +363,10 @@ public class IoTDBStatement implements Statement {
TSExecuteStatementResp execResp =
callWithRetryAndReconnect(
() -> client.executeStatementV2(execReq),
TSExecuteStatementResp::getStatus);
+
+ if (execResp.isSetOperationType() &&
execResp.getOperationType().equals("dropDB")) {
+ connection.changeDefaultDatabase(null);
+ }
try {
RpcUtils.verifySuccess(execResp.getStatus());
} catch (StatementExecutionException e) {
@@ -454,10 +458,7 @@ public class IoTDBStatement implements Statement {
}
if (execResp.isSetSubStatus() && execResp.getSubStatus() != null) {
for (TSStatus status : execResp.getSubStatus()) {
- if (status.getCode() == TSStatusCode.USE_DB.getStatusCode()
- && status.isSetMessage()
- && status.getMessage() != null
- && !status.getMessage().isEmpty()) {
+ if (status.getCode() == TSStatusCode.USE_OR_DROP_DB.getStatusCode()) {
connection.changeDefaultDatabase(status.getMessage());
break;
}
diff --git
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
index 25afac67974..3c61ea03326 100644
---
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
+++
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
@@ -53,7 +53,7 @@ public enum TSStatusCode {
// Client,
REDIRECTION_RECOMMEND(400),
- USE_DB(401),
+ USE_OR_DROP_DB(401),
// Schema Engine
DATABASE_NOT_EXIST(500),
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/exception/DatabaseNotExistsException.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/exception/DatabaseNotExistsException.java
index 30ae6fcdbb8..258650d9801 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/exception/DatabaseNotExistsException.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/exception/DatabaseNotExistsException.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.confignode.exception;
public class DatabaseNotExistsException extends ConfigNodeException {
- public DatabaseNotExistsException(String database) {
+ public DatabaseNotExistsException(final String database) {
super(String.format("Database: %s doesn't exist.", database));
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/DatabaseNotSetException.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/DatabaseNotSetException.java
index db1df0e005d..afd63cce5c7 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/DatabaseNotSetException.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/DatabaseNotSetException.java
@@ -33,17 +33,4 @@ public class DatabaseNotSetException extends
MetadataException {
String.format("%s for current seriesPath: [%s]", DATABASE_NOT_SET,
path),
TSStatusCode.DATABASE_NOT_EXIST.getStatusCode());
}
-
- public DatabaseNotSetException(String path, boolean isUserException) {
- super(
- String.format("%s for current seriesPath: [%s]", DATABASE_NOT_SET,
path),
- TSStatusCode.DATABASE_NOT_EXIST.getStatusCode(),
- isUserException);
- }
-
- public DatabaseNotSetException(String path, String reason) {
- super(
- String.format(
- "%s for current seriesPath: [%s], because %s", DATABASE_NOT_SET,
path, reason));
- }
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
index 377f10f6ceb..cd23cb4e3d0 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
@@ -213,6 +213,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
@@ -314,6 +315,7 @@ public class ClientRPCServiceImpl implements
IClientRPCServiceWithHandler {
StatementType statementType = null;
Throwable t = null;
boolean useDatabase = false;
+ final boolean isDatabaseSetBefore =
Objects.nonNull(clientSession.getDatabaseName());
boolean setSqlDialect = false;
try {
// create and cache dataset
@@ -407,7 +409,12 @@ public class ClientRPCServiceImpl implements
IClientRPCServiceWithHandler {
if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
&& result.status.code !=
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
finished = true;
- return RpcUtils.getTSExecuteStatementResp(result.status);
+ final TSExecuteStatementResp resp =
RpcUtils.getTSExecuteStatementResp(result.status);
+ if (isDatabaseSetBefore &&
Objects.isNull(clientSession.getDatabaseName())) {
+ // Previously unused
+ resp.setOperationType("dropDB");
+ }
+ return resp;
}
IQueryExecution queryExecution = COORDINATOR.getQueryExecution(queryId);
@@ -430,6 +437,10 @@ public class ClientRPCServiceImpl implements
IClientRPCServiceWithHandler {
if (useDatabase) {
resp.setDatabase(clientSession.getDatabaseName());
}
+ if (isDatabaseSetBefore &&
Objects.isNull(clientSession.getDatabaseName())) {
+ // Previously unused
+ resp.setOperationType("dropDB");
+ }
if (setSqlDialect) {
resp.setTableModel(
@@ -447,8 +458,14 @@ public class ClientRPCServiceImpl implements
IClientRPCServiceWithHandler {
} catch (Exception e) {
finished = true;
t = e;
- return RpcUtils.getTSExecuteStatementResp(
- onQueryException(e, "\"" + statement + "\". " +
OperationType.EXECUTE_STATEMENT));
+ final TSExecuteStatementResp resp =
+ RpcUtils.getTSExecuteStatementResp(
+ onQueryException(e, "\"" + statement + "\". " +
OperationType.EXECUTE_STATEMENT));
+ if (isDatabaseSetBefore &&
Objects.isNull(clientSession.getDatabaseName())) {
+ // Previously unused
+ resp.setOperationType("dropDB");
+ }
+ return resp;
} catch (Error error) {
finished = true;
t = error;
@@ -1705,6 +1722,7 @@ public class ClientRPCServiceImpl implements
IClientRPCServiceWithHandler {
}
boolean useDatabase = false;
+ final boolean isDatabaseSetBefore =
Objects.nonNull(clientSession.getDatabaseName());
try {
for (int i = 0; i < req.getStatements().size(); i++) {
String statement = req.getStatements().get(i);
@@ -1819,8 +1837,9 @@ public class ClientRPCServiceImpl implements
IClientRPCServiceWithHandler {
if (isAllSuccessful) {
TSStatus res =
RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS, "Execute batch
statements successfully");
- if (useDatabase) {
- TSStatus useDB = RpcUtils.getStatus(TSStatusCode.USE_DB,
clientSession.getDatabaseName());
+ if (useDatabase || isDatabaseSetBefore &&
Objects.isNull(clientSession.getDatabaseName())) {
+ final TSStatus useDB =
+ RpcUtils.getStatus(TSStatusCode.USE_OR_DROP_DB,
clientSession.getDatabaseName());
res.setSubStatus(Collections.singletonList(useDB));
}
return res;
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
index fa613567294..43116bbbe77 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
@@ -356,7 +356,7 @@ public class TableConfigTaskVisitor extends
AstVisitor<IConfigTask, MPPQueryCont
context.setQueryType(QueryType.WRITE);
accessControl.checkCanDropDatabase(
context.getSession().getUserName(), node.getDbName().getValue());
- return new DropDBTask(node);
+ return new DropDBTask(node, clientSession);
}
@Override
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 0af4797894f..39c2bda7298 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -3577,6 +3577,7 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
new IoTDBException(
String.format("Unknown database %s", database),
TSStatusCode.DATABASE_NOT_EXIST.getStatusCode()));
+ unsetDatabaseIfNotExist(useDB.getDatabaseId().getValue(),
clientSession);
}
} catch (final IOException | ClientManagerException | TException e) {
future.setException(e);
@@ -3585,7 +3586,8 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
}
@Override
- public SettableFuture<ConfigTaskResult> dropDatabase(final DropDB dropDB) {
+ public SettableFuture<ConfigTaskResult> dropDatabase(
+ final DropDB dropDB, final IClientSession session) {
final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
final TDeleteDatabasesReq req =
new
TDeleteDatabasesReq(Collections.singletonList(dropDB.getDbName().getValue()))
@@ -3595,6 +3597,7 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
final TSStatus tsStatus = client.deleteDatabases(req);
if (TSStatusCode.SUCCESS_STATUS.getStatusCode() == tsStatus.getCode()) {
future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ unsetDatabaseIfNotExist(dropDB.getDbName().getValue(), session);
} else if (TSStatusCode.PATH_NOT_EXIST.getStatusCode() ==
tsStatus.getCode()) {
if (dropDB.isExists()) {
future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
@@ -3607,6 +3610,7 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
String.format("Database %s doesn't exist",
dropDB.getDbName().getValue()),
TSStatusCode.DATABASE_NOT_EXIST.getStatusCode()));
}
+ unsetDatabaseIfNotExist(dropDB.getDbName().getValue(), session);
} else {
LOGGER.warn(
"Failed to execute delete database {} in config node, status is
{}.",
@@ -3620,6 +3624,12 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
return future;
}
+ public static void unsetDatabaseIfNotExist(final String database, final
IClientSession session) {
+ if (database.equals(session.getDatabaseName())) {
+ session.setDatabaseName(null);
+ }
+ }
+
@Override
public SettableFuture<ConfigTaskResult> createDatabase(
final TDatabaseSchema databaseSchema, final boolean ifExists) {
@@ -3673,6 +3683,8 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
String.format("Database %s doesn't exist",
databaseSchema.getName()),
TSStatusCode.DATABASE_NOT_EXIST.getStatusCode()));
}
+ unsetDatabaseIfNotExist(
+ databaseSchema.getName(),
SessionManager.getInstance().getCurrSession());
} else {
future.setException(new IoTDBException(tsStatus.message,
tsStatus.code));
}
@@ -4293,9 +4305,11 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
}
private String getTableErrorMessage(final TSStatus status, final String
database) {
- return status.code == TSStatusCode.DATABASE_NOT_EXIST.getStatusCode()
- ? String.format("Unknown database %s",
PathUtils.unQualifyDatabaseName(database))
- : status.getMessage();
+ if (status.code == TSStatusCode.DATABASE_NOT_EXIST.getStatusCode()) {
+ unsetDatabaseIfNotExist(database,
SessionManager.getInstance().getCurrSession());
+ return String.format("Unknown database %s",
PathUtils.unQualifyDatabaseName(database));
+ }
+ return status.getMessage();
}
public void handlePipeConfigClientExit(final String clientId) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
index 0b3b5b91440..8120dca2b92 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -305,7 +305,7 @@ public interface IConfigTaskExecutor {
SettableFuture<ConfigTaskResult> useDatabase(final Use useDB, final
IClientSession clientSession);
- SettableFuture<ConfigTaskResult> dropDatabase(final DropDB dropDB);
+ SettableFuture<ConfigTaskResult> dropDatabase(final DropDB dropDB, final
IClientSession session);
SettableFuture<ConfigTaskResult> createDatabase(
final TDatabaseSchema databaseSchema, final boolean ifNotExists);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DropDBTask.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DropDBTask.java
index 1d6c5044ce8..2248f3dc120 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DropDBTask.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DropDBTask.java
@@ -19,6 +19,7 @@
package
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational;
+import org.apache.iotdb.db.protocol.session.IClientSession;
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
import
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
@@ -29,14 +30,16 @@ import com.google.common.util.concurrent.ListenableFuture;
public class DropDBTask implements IConfigTask {
private final DropDB node;
+ private final IClientSession session;
- public DropDBTask(final DropDB node) {
+ public DropDBTask(final DropDB node, final IClientSession session) {
this.node = node;
+ this.session = session;
}
@Override
public ListenableFuture<ConfigTaskResult> execute(final IConfigTaskExecutor
configTaskExecutor)
throws InterruptedException {
- return configTaskExecutor.dropDatabase(node);
+ return configTaskExecutor.dropDatabase(node, session);
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/DropDB.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/DropDB.java
index 4014210a7a6..d64f7a458af 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/DropDB.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/DropDB.java
@@ -32,12 +32,6 @@ public class DropDB extends Statement {
private final Identifier dbName;
private final boolean exists;
- public DropDB(Identifier catalogName, boolean exists) {
- super(null);
- this.dbName = requireNonNull(catalogName, "catalogName is null");
- this.exists = exists;
- }
-
public DropDB(NodeLocation location, Identifier catalogName, boolean exists)
{
super(requireNonNull(location, "location is null"));
this.dbName = requireNonNull(catalogName, "catalogName is null");