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 65ab3ea7b2c Distinguish database model in database drop / support 
currentDatabase + currentUser expression in common query & updateStatement
65ab3ea7b2c is described below

commit 65ab3ea7b2c4da40cb4807d81a47a099d80f40ff
Author: Caideyipi <[email protected]>
AuthorDate: Fri Nov 22 10:23:34 2024 +0800

    Distinguish database model in database drop / support currentDatabase + 
currentUser expression in common query & updateStatement
---
 .../iotdb/confignode/manager/ConfigManager.java    | 33 ++++++++++++++++++++--
 .../exception/metadata/DatabaseModelException.java | 15 ++++++++++
 .../iotdb/db/protocol/client/ConfigNodeClient.java |  2 +-
 .../config/executor/ClusterConfigTaskExecutor.java | 16 ++++++-----
 .../plan/relational/planner/IrTypeAnalyzer.java    | 12 ++++++++
 .../relational/planner/ir/ExpressionRewriter.java  | 12 ++++++++
 .../planner/ir/ExpressionTreeRewriter.java         | 32 +++++++++++++++++++--
 .../plan/relational/sql/ast/CurrentDatabase.java   | 13 ++++++---
 .../plan/relational/sql/ast/CurrentUser.java       | 13 ++++++---
 .../relational/sql/ast/TableExpressionType.java    |  4 ++-
 .../src/main/thrift/confignode.thrift              |  1 +
 11 files changed, 131 insertions(+), 22 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 29884cdd93d..45e19047ef4 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -228,6 +228,7 @@ import 
org.apache.iotdb.confignode.rpc.thrift.TUnsetSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TUnsubscribeReq;
 import org.apache.iotdb.consensus.common.DataSet;
 import org.apache.iotdb.consensus.exception.ConsensusException;
+import org.apache.iotdb.db.exception.metadata.DatabaseModelException;
 import org.apache.iotdb.db.schemaengine.template.Template;
 import org.apache.iotdb.db.schemaengine.template.TemplateAlterOperationType;
 import 
org.apache.iotdb.db.schemaengine.template.alter.TemplateAlterOperationUtil;
@@ -746,10 +747,36 @@ public class ConfigManager implements IManager {
       // remove wild
       final Map<String, TDatabaseSchema> deleteDatabaseSchemaMap =
           
getClusterSchemaManager().getMatchedDatabaseSchemasByName(deletedPaths);
+
+      // Filter by model
+      final int size = deleteDatabaseSchemaMap.size();
+      final boolean isTableModel = tDeleteReq.isSetIsTableModel() && 
tDeleteReq.isIsTableModel();
+      final List<String> mismatchDatabaseNames = new ArrayList<>();
+      deleteDatabaseSchemaMap
+          .entrySet()
+          .removeIf(
+              entry -> {
+                if (entry.getValue().isIsTableModel() != isTableModel) {
+                  mismatchDatabaseNames.add(entry.getKey());
+                  return true;
+                }
+                return false;
+              });
+
       if (deleteDatabaseSchemaMap.isEmpty()) {
-        return RpcUtils.getStatus(
-            TSStatusCode.PATH_NOT_EXIST.getStatusCode(),
-            String.format("Path %s does not exist", 
Arrays.toString(deletedPaths.toArray())));
+        if (size == 0) {
+          return RpcUtils.getStatus(
+              TSStatusCode.PATH_NOT_EXIST.getStatusCode(),
+              String.format("Path %s does not exist", 
Arrays.toString(deletedPaths.toArray())));
+        } else if (size == 1) {
+          final DatabaseModelException exception =
+              new DatabaseModelException(mismatchDatabaseNames.get(0), 
!isTableModel);
+          return RpcUtils.getStatus(exception.getErrorCode(), 
exception.getMessage());
+        } else {
+          final DatabaseModelException exception =
+              new DatabaseModelException(mismatchDatabaseNames, !isTableModel);
+          return RpcUtils.getStatus(exception.getErrorCode(), 
exception.getMessage());
+        }
       }
       final ArrayList<TDatabaseSchema> parsedDeleteDatabases =
           new ArrayList<>(deleteDatabaseSchemaMap.values());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/DatabaseModelException.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/DatabaseModelException.java
index 50dfe1b3568..0ddf1174d37 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/DatabaseModelException.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/DatabaseModelException.java
@@ -23,6 +23,9 @@ import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class DatabaseModelException extends MetadataException {
   public DatabaseModelException(final String path, final boolean isTableModel) 
{
     super(
@@ -35,4 +38,16 @@ public class DatabaseModelException extends 
MetadataException {
             + " model database.",
         TSStatusCode.DATABASE_MODEL.getStatusCode());
   }
+
+  public DatabaseModelException(final List<String> paths, final boolean 
isTableModel) {
+    super(
+        "The databases "
+            + (isTableModel
+                ? 
paths.stream().map(PathUtils::qualifyDatabaseName).collect(Collectors.toList())
+                : 
paths.stream().map(PathUtils::unQualifyDatabaseName).collect(Collectors.toList()))
+            + " are all "
+            + (isTableModel ? "table" : "tree")
+            + " model databases.",
+        TSStatusCode.DATABASE_MODEL.getStatusCode());
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java
index b0379a3d9c4..add89dd3162 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/client/ConfigNodeClient.java
@@ -550,7 +550,7 @@ public class ConfigNodeClient implements 
IConfigNodeRPCService.Iface, ThriftClie
   }
 
   @Override
-  public TSStatus deleteDatabases(TDeleteDatabasesReq req) throws TException {
+  public TSStatus deleteDatabases(final TDeleteDatabasesReq req) throws 
TException {
     return executeRemoteCallWithRetry(
         () -> client.deleteDatabases(req), status -> 
!updateConfigNodeLeader(status));
   }
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 8bde753ee72..3ff44e25afb 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
@@ -462,12 +462,13 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
 
   @Override
   public SettableFuture<ConfigTaskResult> deleteDatabase(
-      DeleteDatabaseStatement deleteDatabaseStatement) {
-    SettableFuture<ConfigTaskResult> future = SettableFuture.create();
-    TDeleteDatabasesReq req = new 
TDeleteDatabasesReq(deleteDatabaseStatement.getPrefixPath());
-    try (ConfigNodeClient client =
+      final DeleteDatabaseStatement deleteDatabaseStatement) {
+    final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+    final TDeleteDatabasesReq req =
+        new 
TDeleteDatabasesReq(deleteDatabaseStatement.getPrefixPath()).setIsTableModel(false);
+    try (final ConfigNodeClient client =
         
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
-      TSStatus tsStatus = client.deleteDatabases(req);
+      final TSStatus tsStatus = client.deleteDatabases(req);
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
         LOGGER.warn(
             "Failed to execute delete database {} in config node, status is 
{}.",
@@ -482,7 +483,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
-    } catch (ClientManagerException | TException e) {
+    } catch (final ClientManagerException | TException e) {
       future.setException(e);
     }
     return future;
@@ -3144,7 +3145,8 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
     SettableFuture<ConfigTaskResult> future = SettableFuture.create();
     TDeleteDatabasesReq req =
         new TDeleteDatabasesReq(
-            
Collections.singletonList(transformDBName(dropDB.getDbName().getValue())));
+                
Collections.singletonList(transformDBName(dropDB.getDbName().getValue())))
+            .setIsTableModel(true);
     try (ConfigNodeClient client =
         
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
       TSStatus tsStatus = client.deleteDatabases(req);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/IrTypeAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/IrTypeAnalyzer.java
index 3c18b33c9da..cdf01015f40 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/IrTypeAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/IrTypeAnalyzer.java
@@ -36,6 +36,8 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BooleanLiteral;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Cast;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CoalesceExpression;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ComparisonExpression;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CurrentDatabase;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CurrentUser;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DoubleLiteral;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.FunctionCall;
@@ -422,6 +424,16 @@ public class IrTypeAnalyzer {
       return setExpressionType(node, BOOLEAN);
     }
 
+    @Override
+    protected Type visitCurrentDatabase(final CurrentDatabase node, final 
Context context) {
+      return setExpressionType(node, StringType.STRING);
+    }
+
+    @Override
+    protected Type visitCurrentUser(final CurrentUser node, final Context 
context) {
+      return setExpressionType(node, StringType.STRING);
+    }
+
     @Override
     protected Type visitExpression(Expression node, Context context) {
       throw new UnsupportedOperationException(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionRewriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionRewriter.java
index 5bf6f8ef230..8d8c56696ed 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionRewriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionRewriter.java
@@ -25,6 +25,8 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BetweenPredicate;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Cast;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CoalesceExpression;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ComparisonExpression;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CurrentDatabase;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CurrentUser;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DereferenceExpression;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.FieldReference;
@@ -203,6 +205,16 @@ public class ExpressionRewriter<C> {
     return rewriteExpression(node, context, treeRewriter);
   }
 
+  public Expression rewriteCurrentDatabase(
+      final CurrentDatabase node, final C context, final 
ExpressionTreeRewriter<C> treeRewriter) {
+    return rewriteExpression(node, context, treeRewriter);
+  }
+
+  public Expression rewriteCurrentUser(
+      final CurrentUser node, final C context, final ExpressionTreeRewriter<C> 
treeRewriter) {
+    return rewriteExpression(node, context, treeRewriter);
+  }
+
   public Expression rewriteGenericDataType(
       GenericDataType node, C context, ExpressionTreeRewriter<C> treeRewriter) 
{
     return rewriteExpression(node, context, treeRewriter);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java
index 4b41a11b932..6b547bc8127 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/ir/ExpressionTreeRewriter.java
@@ -25,6 +25,8 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BetweenPredicate;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Cast;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CoalesceExpression;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ComparisonExpression;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CurrentDatabase;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CurrentUser;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DataType;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DataTypeParameter;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DereferenceExpression;
@@ -527,9 +529,9 @@ public final class ExpressionTreeRewriter<C> {
     }
 
     @Override
-    protected Expression visitLiteral(Literal node, Context<C> context) {
+    protected Expression visitLiteral(final Literal node, final Context<C> 
context) {
       if (!context.isDefaultRewrite()) {
-        Expression result =
+        final Expression result =
             rewriter.rewriteLiteral(node, context.get(), 
ExpressionTreeRewriter.this);
         if (result != null) {
           return result;
@@ -605,6 +607,32 @@ public final class ExpressionTreeRewriter<C> {
       return node;
     }
 
+    @Override
+    public Expression visitCurrentDatabase(final CurrentDatabase node, final 
Context<C> context) {
+      if (!context.isDefaultRewrite()) {
+        final Expression result =
+            rewriter.rewriteCurrentDatabase(node, context.get(), 
ExpressionTreeRewriter.this);
+        if (result != null) {
+          return result;
+        }
+      }
+
+      return node;
+    }
+
+    @Override
+    public Expression visitCurrentUser(final CurrentUser node, final 
Context<C> context) {
+      if (!context.isDefaultRewrite()) {
+        final Expression result =
+            rewriter.rewriteCurrentUser(node, context.get(), 
ExpressionTreeRewriter.this);
+        if (result != null) {
+          return result;
+        }
+      }
+
+      return node;
+    }
+
     @Override
     protected Expression visitGenericDataType(GenericDataType node, Context<C> 
context) {
       if (!context.isDefaultRewrite()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CurrentDatabase.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CurrentDatabase.java
index 9c431eaeb2d..7a8dddf44aa 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CurrentDatabase.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CurrentDatabase.java
@@ -33,7 +33,7 @@ public class CurrentDatabase extends Expression {
     super(null);
   }
 
-  public CurrentDatabase(@Nonnull NodeLocation location) {
+  public CurrentDatabase(@Nonnull final NodeLocation location) {
     super(requireNonNull(location, "location is null"));
   }
 
@@ -43,7 +43,7 @@ public class CurrentDatabase extends Expression {
   }
 
   @Override
-  public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+  public <R, C> R accept(final AstVisitor<R, C> visitor, final C context) {
     return visitor.visitCurrentDatabase(this, context);
   }
 
@@ -53,7 +53,7 @@ public class CurrentDatabase extends Expression {
   }
 
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(final Object obj) {
     if (this == obj) {
       return true;
     }
@@ -64,7 +64,12 @@ public class CurrentDatabase extends Expression {
   }
 
   @Override
-  public boolean shallowEquals(Node other) {
+  public boolean shallowEquals(final Node other) {
     return sameClass(this, other);
   }
+
+  @Override
+  public TableExpressionType getExpressionType() {
+    return TableExpressionType.CURRENT_DATABASE;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CurrentUser.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CurrentUser.java
index 3ab0cc2f916..760d86a0114 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CurrentUser.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/CurrentUser.java
@@ -33,7 +33,7 @@ public class CurrentUser extends Expression {
     super(null);
   }
 
-  public CurrentUser(@Nonnull NodeLocation location) {
+  public CurrentUser(@Nonnull final NodeLocation location) {
     super(requireNonNull(location, "location is null"));
   }
 
@@ -43,7 +43,7 @@ public class CurrentUser extends Expression {
   }
 
   @Override
-  public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
+  public <R, C> R accept(final AstVisitor<R, C> visitor, final C context) {
     return visitor.visitCurrentUser(this, context);
   }
 
@@ -53,7 +53,7 @@ public class CurrentUser extends Expression {
   }
 
   @Override
-  public boolean equals(Object obj) {
+  public boolean equals(final Object obj) {
     if (this == obj) {
       return true;
     }
@@ -64,7 +64,12 @@ public class CurrentUser extends Expression {
   }
 
   @Override
-  public boolean shallowEquals(Node other) {
+  public boolean shallowEquals(final Node other) {
     return sameClass(this, other);
   }
+
+  @Override
+  public TableExpressionType getExpressionType() {
+    return TableExpressionType.CURRENT_USER;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java
index 17a0688786a..1abd6e30c49 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/TableExpressionType.java
@@ -47,7 +47,9 @@ public enum TableExpressionType {
   COALESCE((short) 25),
   SIMPLE_CASE((short) 26),
   SEARCHED_CASE((short) 27),
-  WHEN_CLAUSE((short) 28);
+  WHEN_CLAUSE((short) 28),
+  CURRENT_DATABASE((short) 29),
+  CURRENT_USER((short) 30);
 
   TableExpressionType(short type) {
     this.type = type;
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift 
b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
index 7f5b40d71c8..741dbfe5256 100644
--- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -166,6 +166,7 @@ struct TDeleteDatabaseReq {
 struct TDeleteDatabasesReq {
   1: required list<string> prefixPathList
   2: optional bool isGeneratedByPipe
+  3: optional bool isTableModel
 }
 
 struct TSetSchemaReplicationFactorReq {

Reply via email to