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");

Reply via email to