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 {