This is an automated email from the ASF dual-hosted git repository.

zyk 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 a285d428208 Support Delete/Drop Logical View (#9938)
a285d428208 is described below

commit a285d42820852951e58b8fab31c4204dba1781df
Author: Marcos_Zyk <[email protected]>
AuthorDate: Thu May 25 21:32:51 2023 +0800

    Support Delete/Drop Logical View (#9938)
---
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |   6 +-
 .../confignode/client/DataNodeRequestType.java     |   5 +
 .../client/async/AsyncDataNodeClientPool.java      |  21 ++
 .../client/async/handlers/AsyncClientHandler.java  |   3 +
 .../iotdb/confignode/manager/ConfigManager.java    |  11 +
 .../apache/iotdb/confignode/manager/IManager.java  |   3 +
 .../iotdb/confignode/manager/ProcedureManager.java |  47 +++
 .../impl/schema/DeleteLogicalViewProcedure.java    | 353 +++++++++++++++++++++
 .../state/schema/DeleteLogicalViewState.java       |  26 ++
 .../procedure/store/ProcedureFactory.java          |   6 +
 .../confignode/procedure/store/ProcedureType.java  |   5 +-
 .../thrift/ConfigNodeRPCServiceProcessor.java      |   6 +
 .../src/main/thrift/confignode.thrift              |   7 +
 .../thrift/src/main/thrift/datanode.thrift         |  21 ++
 .../apache/iotdb/db/client/ConfigNodeClient.java   |  22 ++
 .../db/metadata/mtree/MTreeBelowSGMemoryImpl.java  |  54 ++++
 .../plan/schemaregion/SchemaRegionPlanType.java    |   3 +
 .../plan/schemaregion/SchemaRegionPlanVisitor.java |  17 +
 .../impl/SchemaRegionPlanDeserializer.java         |  25 ++
 .../impl/SchemaRegionPlanSerializer.java           |  37 +++
 .../impl/SchemaRegionPlanTxtSerializer.java        |  25 ++
 .../impl/write/DeleteLogicalViewPlanImpl.java      |  44 +++
 .../impl/write/PreDeleteLogicalViewPlanImpl.java   |  44 +++
 .../RollbackPreDeleteLogicalViewPlanImpl.java      |  44 +++
 .../impl/write/SchemaRegionWritePlanFactory.java   |  29 ++
 .../write/view/IDeleteLogicalViewPlan.java         |  42 +++
 .../write/view/IPreDeleteLogicalViewPlan.java      |  42 +++
 .../view/IRollbackPreDeleteLogicalViewPlan.java    |  42 +++
 .../db/metadata/schemaregion/ISchemaRegion.java    |   7 +
 .../schemaregion/SchemaRegionMemoryImpl.java       |  85 +++++
 .../schemaregion/SchemaRegionSchemaFileImpl.java   |  15 +
 .../metadata/visitor/SchemaExecutionVisitor.java   |  44 ++-
 .../execution/executor/RegionWriteExecutor.java    |   2 +-
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  |   8 +-
 .../plan/execution/config/ConfigTaskVisitor.java   |   8 +
 .../config/executor/ClusterConfigTaskExecutor.java |  43 +++
 .../config/executor/IConfigTaskExecutor.java       |   4 +
 .../metadata/view/DeleteLogicalViewTask.java       |  46 +++
 .../iotdb/db/mpp/plan/parser/ASTVisitor.java       |  14 +-
 .../db/mpp/plan/planner/LogicalPlanVisitor.java    |   4 +-
 .../mpp/plan/planner/plan/node/PlanNodeType.java   |  16 +-
 .../db/mpp/plan/planner/plan/node/PlanVisitor.java |  25 +-
 .../view/ConstructLogicalViewBlackListNode.java    |  91 ++++++
 .../write/{ => view}/CreateLogicalViewNode.java    |   2 +-
 .../metedata/write/view/DeleteLogicalViewNode.java |  91 ++++++
 .../view/RollbackLogicalViewBlackListNode.java     |  91 ++++++
 .../iotdb/db/mpp/plan/statement/StatementType.java |   1 +
 .../db/mpp/plan/statement/StatementVisitor.java    |   8 +-
 .../{ => view}/CreateLogicalViewStatement.java     |   2 +-
 .../metadata/view/DeleteLogicalViewStatement.java  |  66 ++++
 .../impl/DataNodeInternalRPCServiceImpl.java       |  91 ++++++
 51 files changed, 1732 insertions(+), 22 deletions(-)

diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 
b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index 0642cf4c336..98a866e5fdb 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -64,7 +64,7 @@ ddlStatement
     // Quota
     | setSpaceQuota | showSpaceQuota | setThrottleQuota | showThrottleQuota
     // View
-    | createLogicalView
+    | createLogicalView | dropLogicalView
     ;
 
 dmlStatement
@@ -563,6 +563,10 @@ createLogicalView
     : CREATE VIEW viewTargetPaths AS viewSourcePaths
     ;
 
+dropLogicalView
+    : (DELETE | DROP) VIEW prefixPath (COMMA prefixPath)*
+    ;
+
 viewSuffixPaths
     : nodeNameWithoutWildcard (DOT nodeNameWithoutWildcard)*
     ;
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/client/DataNodeRequestType.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/client/DataNodeRequestType.java
index d36dce571f6..80701acefa8 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/client/DataNodeRequestType.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/client/DataNodeRequestType.java
@@ -84,12 +84,17 @@ public enum DataNodeRequestType {
   INVALIDATE_MATCHED_SCHEMA_CACHE,
   DELETE_DATA_FOR_DELETE_SCHEMA,
   DELETE_TIMESERIES,
+
   CONSTRUCT_SCHEMA_BLACK_LIST_WITH_TEMPLATE,
   ROLLBACK_SCHEMA_BLACK_LIST_WITH_TEMPLATE,
   DEACTIVATE_TEMPLATE,
   COUNT_PATHS_USING_TEMPLATE,
   CHECK_TIMESERIES_EXISTENCE,
 
+  CONSTRUCT_VIEW_SCHEMA_BLACK_LIST,
+  ROLLBACK_VIEW_SCHEMA_BLACK_LIST,
+  DELETE_VIEW,
+
   /** @TODO Need to migrate to 'Node Maintenance' */
   KILL_QUERY_INSTANCE,
 
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/client/async/AsyncDataNodeClientPool.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/client/async/AsyncDataNodeClientPool.java
index 332b7e2317b..018a46ad229 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/client/async/AsyncDataNodeClientPool.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/client/async/AsyncDataNodeClientPool.java
@@ -41,6 +41,7 @@ import 
org.apache.iotdb.mpp.rpc.thrift.TActiveTriggerInstanceReq;
 import org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceReq;
 import org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListReq;
 import 
org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListWithTemplateReq;
+import org.apache.iotdb.mpp.rpc.thrift.TConstructViewSchemaBlackListReq;
 import org.apache.iotdb.mpp.rpc.thrift.TCountPathsUsingTemplateReq;
 import org.apache.iotdb.mpp.rpc.thrift.TCreateDataRegionReq;
 import org.apache.iotdb.mpp.rpc.thrift.TCreateFunctionInstanceReq;
@@ -50,6 +51,7 @@ import 
org.apache.iotdb.mpp.rpc.thrift.TCreateTriggerInstanceReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDeactivateTemplateReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDeleteDataForDeleteSchemaReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDeleteTimeSeriesReq;
+import org.apache.iotdb.mpp.rpc.thrift.TDeleteViewSchemaReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDropFunctionInstanceReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDropPipePluginInstanceReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDropTriggerInstanceReq;
@@ -61,6 +63,7 @@ import org.apache.iotdb.mpp.rpc.thrift.TRegionLeaderChangeReq;
 import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq;
 import org.apache.iotdb.mpp.rpc.thrift.TRollbackSchemaBlackListReq;
 import org.apache.iotdb.mpp.rpc.thrift.TRollbackSchemaBlackListWithTemplateReq;
+import org.apache.iotdb.mpp.rpc.thrift.TRollbackViewSchemaBlackListReq;
 import org.apache.iotdb.mpp.rpc.thrift.TUpdateConfigNodeGroupReq;
 import org.apache.iotdb.mpp.rpc.thrift.TUpdateTemplateReq;
 import org.apache.iotdb.mpp.rpc.thrift.TUpdateTriggerLocationReq;
@@ -344,6 +347,24 @@ public class AsyncDataNodeClientPool {
               (CheckTimeSeriesExistenceRPCHandler)
                   clientHandler.createAsyncRPCHandler(requestId, 
targetDataNode));
           break;
+        case CONSTRUCT_VIEW_SCHEMA_BLACK_LIST:
+          client.constructViewSchemaBlackList(
+              (TConstructViewSchemaBlackListReq) 
clientHandler.getRequest(requestId),
+              (DeleteSchemaRPCHandler)
+                  clientHandler.createAsyncRPCHandler(requestId, 
targetDataNode));
+          break;
+        case ROLLBACK_VIEW_SCHEMA_BLACK_LIST:
+          client.rollbackViewSchemaBlackList(
+              (TRollbackViewSchemaBlackListReq) 
clientHandler.getRequest(requestId),
+              (DeleteSchemaRPCHandler)
+                  clientHandler.createAsyncRPCHandler(requestId, 
targetDataNode));
+          break;
+        case DELETE_VIEW:
+          client.deleteViewSchema(
+              (TDeleteViewSchemaReq) clientHandler.getRequest(requestId),
+              (DeleteSchemaRPCHandler)
+                  clientHandler.createAsyncRPCHandler(requestId, 
targetDataNode));
+          break;
         case KILL_QUERY_INSTANCE:
           client.killQueryInstance(
               (String) clientHandler.getRequest(requestId),
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/AsyncClientHandler.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/AsyncClientHandler.java
index a5904b5f8a8..a37c225a04a 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/AsyncClientHandler.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/client/async/handlers/AsyncClientHandler.java
@@ -162,6 +162,9 @@ public class AsyncClientHandler<Q, R> {
       case CONSTRUCT_SCHEMA_BLACK_LIST_WITH_TEMPLATE:
       case ROLLBACK_SCHEMA_BLACK_LIST_WITH_TEMPLATE:
       case DEACTIVATE_TEMPLATE:
+      case CONSTRUCT_VIEW_SCHEMA_BLACK_LIST:
+      case ROLLBACK_VIEW_SCHEMA_BLACK_LIST:
+      case DELETE_VIEW:
         return new DeleteSchemaRPCHandler(
             requestType,
             requestId,
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index c896a0d51b0..42baef81f85 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -121,6 +121,7 @@ import 
org.apache.iotdb.confignode.rpc.thrift.TDataNodeRestartResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
 import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropModelReq;
@@ -1582,6 +1583,16 @@ public class ConfigManager implements IManager {
     }
   }
 
+  @Override
+  public TSStatus deleteLogicalView(TDeleteLogicalViewReq req) {
+    TSStatus status = confirmLeader();
+    if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      return procedureManager.deleteLogicalView(req);
+    } else {
+      return status;
+    }
+  }
+
   @Override
   public TSStatus createPipe(TCreatePipeReq req) {
     TSStatus status = confirmLeader();
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
index 5eea6b30fdf..9e8560d0aec 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
@@ -64,6 +64,7 @@ import 
org.apache.iotdb.confignode.rpc.thrift.TDataNodeRestartReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRestartResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropModelReq;
@@ -550,6 +551,8 @@ public interface IManager {
    */
   TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req);
 
+  TSStatus deleteLogicalView(TDeleteLogicalViewReq req);
+
   /**
    * Create Pipe
    *
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
index a33072f8b19..d842f8dc3ad 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java
@@ -61,6 +61,7 @@ import 
org.apache.iotdb.confignode.procedure.impl.pipe.task.StartPipeProcedureV2
 import 
org.apache.iotdb.confignode.procedure.impl.pipe.task.StopPipeProcedureV2;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
+import 
org.apache.iotdb.confignode.procedure.impl.schema.DeleteLogicalViewProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure;
 import org.apache.iotdb.confignode.procedure.impl.schema.SetTemplateProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.UnsetTemplateProcedure;
@@ -79,6 +80,7 @@ import 
org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterReq;
 import org.apache.iotdb.confignode.rpc.thrift.TCreateCQReq;
 import org.apache.iotdb.confignode.rpc.thrift.TCreatePipeReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TMigrateRegionReq;
 import org.apache.iotdb.confignode.rpc.thrift.TRegionMigrateResultReportReq;
@@ -221,6 +223,51 @@ public class ProcedureManager {
     }
   }
 
+  public TSStatus deleteLogicalView(TDeleteLogicalViewReq req) {
+    String queryId = req.getQueryId();
+    PathPatternTree patternTree =
+        PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree()));
+    long procedureId = -1;
+    synchronized (this) {
+      boolean hasOverlappedTask = false;
+      ProcedureType type;
+      DeleteLogicalViewProcedure deleteLogicalViewProcedure;
+      for (Procedure<?> procedure : executor.getProcedures().values()) {
+        type = ProcedureFactory.getProcedureType(procedure);
+        if (type == null || 
!type.equals(ProcedureType.DELETE_TIMESERIES_PROCEDURE)) {
+          continue;
+        }
+        deleteLogicalViewProcedure = ((DeleteLogicalViewProcedure) procedure);
+        if (queryId.equals(deleteLogicalViewProcedure.getQueryId())) {
+          procedureId = deleteLogicalViewProcedure.getProcId();
+          break;
+        }
+        if 
(patternTree.isOverlapWith(deleteLogicalViewProcedure.getPatternTree())) {
+          hasOverlappedTask = true;
+          break;
+        }
+      }
+
+      if (procedureId == -1) {
+        if (hasOverlappedTask) {
+          return RpcUtils.getStatus(
+              TSStatusCode.OVERLAP_WITH_EXISTING_TASK,
+              "Some other task is deleting some target views.");
+        }
+        procedureId =
+            this.executor.submitProcedure(new 
DeleteLogicalViewProcedure(queryId, patternTree));
+      }
+    }
+    List<TSStatus> procedureStatus = new ArrayList<>();
+    boolean isSucceed =
+        waitingProcedureFinished(Collections.singletonList(procedureId), 
procedureStatus);
+    if (isSucceed) {
+      return StatusUtils.OK;
+    } else {
+      return procedureStatus.get(0);
+    }
+  }
+
   public TSStatus setSchemaTemplate(String queryId, String templateName, 
String templateSetPath) {
     long procedureId = -1;
     synchronized (this) {
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
new file mode 100644
index 00000000000..e333a3af225
--- /dev/null
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeleteLogicalViewProcedure.java
@@ -0,0 +1,353 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.procedure.impl.schema;
+
+import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
+import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
+import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.exception.MetadataException;
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.confignode.client.DataNodeRequestType;
+import org.apache.iotdb.confignode.client.async.AsyncDataNodeClientPool;
+import org.apache.iotdb.confignode.client.async.handlers.AsyncClientHandler;
+import org.apache.iotdb.confignode.procedure.env.ConfigNodeProcedureEnv;
+import org.apache.iotdb.confignode.procedure.exception.ProcedureException;
+import 
org.apache.iotdb.confignode.procedure.exception.ProcedureSuspendedException;
+import org.apache.iotdb.confignode.procedure.exception.ProcedureYieldException;
+import 
org.apache.iotdb.confignode.procedure.impl.statemachine.StateMachineProcedure;
+import 
org.apache.iotdb.confignode.procedure.state.schema.DeleteLogicalViewState;
+import org.apache.iotdb.confignode.procedure.store.ProcedureType;
+import org.apache.iotdb.db.exception.metadata.PathNotExistException;
+import org.apache.iotdb.mpp.rpc.thrift.TConstructViewSchemaBlackListReq;
+import org.apache.iotdb.mpp.rpc.thrift.TDeleteViewSchemaReq;
+import org.apache.iotdb.mpp.rpc.thrift.TInvalidateMatchedSchemaCacheReq;
+import org.apache.iotdb.mpp.rpc.thrift.TRollbackViewSchemaBlackListReq;
+import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+
+public class DeleteLogicalViewProcedure
+    extends StateMachineProcedure<ConfigNodeProcedureEnv, 
DeleteLogicalViewState> {
+
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(DeleteLogicalViewProcedure.class);
+
+  private String queryId;
+
+  private PathPatternTree patternTree;
+  private transient ByteBuffer patternTreeBytes;
+
+  private transient String requestMessage;
+
+  public DeleteLogicalViewProcedure() {
+    super();
+  }
+
+  public DeleteLogicalViewProcedure(String queryId, PathPatternTree 
patternTree) {
+    super();
+    this.queryId = queryId;
+    setPatternTree(patternTree);
+  }
+
+  @Override
+  protected Flow executeFromState(ConfigNodeProcedureEnv env, 
DeleteLogicalViewState state)
+      throws ProcedureSuspendedException, ProcedureYieldException, 
InterruptedException {
+    long startTime = System.currentTimeMillis();
+    try {
+      switch (state) {
+        case CONSTRUCT_BLACK_LIST:
+          LOGGER.info("Construct view schema black list of view {}", 
requestMessage);
+          if (constructBlackList(env) > 0) {
+            setNextState(DeleteLogicalViewState.CLEAN_DATANODE_SCHEMA_CACHE);
+            break;
+          } else {
+            setFailure(
+                new ProcedureException(
+                    new PathNotExistException(
+                        patternTree.getAllPathPatterns().stream()
+                            .map(PartialPath::getFullPath)
+                            .collect(Collectors.toList()),
+                        false)));
+            return Flow.NO_MORE_STATE;
+          }
+        case CLEAN_DATANODE_SCHEMA_CACHE:
+          LOGGER.info("Invalidate cache of view {}", requestMessage);
+          invalidateCache(env);
+          break;
+        case DELETE_VIEW_SCHEMA:
+          LOGGER.info("Delete view schema of {}", requestMessage);
+          deleteViewSchema(env);
+          return Flow.NO_MORE_STATE;
+        default:
+          setFailure(new ProcedureException("Unrecognized state " + 
state.toString()));
+          return Flow.NO_MORE_STATE;
+      }
+      return Flow.HAS_MORE_STATE;
+    } finally {
+      LOGGER.info(
+          String.format(
+              "DeleteLogicalView-[%s] costs %sms",
+              state.toString(), (System.currentTimeMillis() - startTime)));
+    }
+  }
+
+  // return the total num of timeseries in schema black list
+  private long constructBlackList(ConfigNodeProcedureEnv env) {
+    Map<TConsensusGroupId, TRegionReplicaSet> targetSchemaRegionGroup =
+        env.getConfigManager().getRelatedSchemaRegionGroup(patternTree);
+    if (targetSchemaRegionGroup.isEmpty()) {
+      return 0;
+    }
+    List<TSStatus> successResult = new ArrayList<>();
+    DeleteLogicalViewRegionTaskExecutor<TConstructViewSchemaBlackListReq> 
constructBlackListTask =
+        new 
DeleteLogicalViewRegionTaskExecutor<TConstructViewSchemaBlackListReq>(
+            "construct view schema black list",
+            env,
+            targetSchemaRegionGroup,
+            DataNodeRequestType.CONSTRUCT_VIEW_SCHEMA_BLACK_LIST,
+            ((dataNodeLocation, consensusGroupIdList) ->
+                new TConstructViewSchemaBlackListReq(consensusGroupIdList, 
patternTreeBytes))) {
+          @Override
+          protected List<TConsensusGroupId> processResponseOfOneDataNode(
+              TDataNodeLocation dataNodeLocation,
+              List<TConsensusGroupId> consensusGroupIdList,
+              TSStatus response) {
+            List<TConsensusGroupId> failedRegionList = new ArrayList<>();
+            if (response.getCode() == 
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+              successResult.add(response);
+            } else if (response.getCode() == 
TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
+              List<TSStatus> subStatusList = response.getSubStatus();
+              for (int i = 0; i < subStatusList.size(); i++) {
+                if (subStatusList.get(i).getCode() == 
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+                  successResult.add(subStatusList.get(i));
+                } else {
+                  failedRegionList.add(consensusGroupIdList.get(i));
+                }
+              }
+            } else {
+              failedRegionList.addAll(consensusGroupIdList);
+            }
+            return failedRegionList;
+          }
+        };
+    constructBlackListTask.execute();
+
+    if (isFailed()) {
+      return 0;
+    }
+
+    long preDeletedNum = 0;
+    for (TSStatus resp : successResult) {
+      preDeletedNum += Long.parseLong(resp.getMessage());
+    }
+    return preDeletedNum;
+  }
+
+  private void invalidateCache(ConfigNodeProcedureEnv env) {
+    Map<Integer, TDataNodeLocation> dataNodeLocationMap =
+        
env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations();
+    AsyncClientHandler<TInvalidateMatchedSchemaCacheReq, TSStatus> 
clientHandler =
+        new AsyncClientHandler<>(
+            DataNodeRequestType.INVALIDATE_MATCHED_SCHEMA_CACHE,
+            new TInvalidateMatchedSchemaCacheReq(patternTreeBytes),
+            dataNodeLocationMap);
+    
AsyncDataNodeClientPool.getInstance().sendAsyncRequestToDataNodeWithRetry(clientHandler);
+    Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
+    for (TSStatus status : statusMap.values()) {
+      // all dataNodes must clear the related schema cache
+      if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+        LOGGER.error("Failed to invalidate schema cache of view {}", 
requestMessage);
+        setFailure(
+            new ProcedureException(new MetadataException("Invalidate view 
schema cache failed")));
+        return;
+      }
+    }
+
+    setNextState(DeleteLogicalViewState.DELETE_VIEW_SCHEMA);
+  }
+
+  private void deleteViewSchema(ConfigNodeProcedureEnv env) {
+    DeleteLogicalViewRegionTaskExecutor<TDeleteViewSchemaReq> 
deleteTimeSeriesTask =
+        new DeleteLogicalViewRegionTaskExecutor<>(
+            "delete view schema",
+            env,
+            env.getConfigManager().getRelatedSchemaRegionGroup(patternTree),
+            DataNodeRequestType.DELETE_VIEW,
+            ((dataNodeLocation, consensusGroupIdList) ->
+                new TDeleteViewSchemaReq(consensusGroupIdList, 
patternTreeBytes)));
+    deleteTimeSeriesTask.execute();
+  }
+
+  @Override
+  protected void rollbackState(
+      ConfigNodeProcedureEnv env, DeleteLogicalViewState 
deleteLogicalViewState)
+      throws IOException, InterruptedException, ProcedureException {
+    DeleteLogicalViewRegionTaskExecutor<TRollbackViewSchemaBlackListReq> 
rollbackStateTask =
+        new DeleteLogicalViewRegionTaskExecutor<>(
+            "roll back view schema black list",
+            env,
+            env.getConfigManager().getRelatedSchemaRegionGroup(patternTree),
+            DataNodeRequestType.ROLLBACK_VIEW_SCHEMA_BLACK_LIST,
+            (dataNodeLocation, consensusGroupIdList) ->
+                new TRollbackViewSchemaBlackListReq(consensusGroupIdList, 
patternTreeBytes));
+    rollbackStateTask.execute();
+  }
+
+  @Override
+  protected boolean isRollbackSupported(DeleteLogicalViewState 
deleteLogicalViewState) {
+    return true;
+  }
+
+  @Override
+  protected DeleteLogicalViewState getState(int stateId) {
+    return DeleteLogicalViewState.values()[stateId];
+  }
+
+  @Override
+  protected int getStateId(DeleteLogicalViewState deleteLogicalViewState) {
+    return deleteLogicalViewState.ordinal();
+  }
+
+  @Override
+  protected DeleteLogicalViewState getInitialState() {
+    return DeleteLogicalViewState.CONSTRUCT_BLACK_LIST;
+  }
+
+  public String getQueryId() {
+    return queryId;
+  }
+
+  public PathPatternTree getPatternTree() {
+    return patternTree;
+  }
+
+  public void setPatternTree(PathPatternTree patternTree) {
+    this.patternTree = patternTree;
+    requestMessage = patternTree.getAllPathPatterns().toString();
+    patternTreeBytes = preparePatternTreeBytesData(patternTree);
+  }
+
+  private ByteBuffer preparePatternTreeBytesData(PathPatternTree patternTree) {
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    DataOutputStream dataOutputStream = new 
DataOutputStream(byteArrayOutputStream);
+    try {
+      patternTree.serialize(dataOutputStream);
+    } catch (IOException ignored) {
+
+    }
+    return ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
+  }
+
+  @Override
+  public void serialize(DataOutputStream stream) throws IOException {
+    
stream.writeShort(ProcedureType.DELETE_LOGICAL_VIEW_PROCEDURE.getTypeCode());
+    super.serialize(stream);
+    ReadWriteIOUtils.write(queryId, stream);
+    patternTree.serialize(stream);
+  }
+
+  @Override
+  public void deserialize(ByteBuffer byteBuffer) {
+    super.deserialize(byteBuffer);
+    queryId = ReadWriteIOUtils.readString(byteBuffer);
+    setPatternTree(PathPatternTree.deserialize(byteBuffer));
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    DeleteLogicalViewProcedure that = (DeleteLogicalViewProcedure) o;
+    return this.getProcId() == that.getProcId()
+        && this.getState() == that.getState()
+        && patternTree.equals(that.patternTree);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getProcId(), getState(), patternTree);
+  }
+
+  private class DeleteLogicalViewRegionTaskExecutor<Q>
+      extends DataNodeRegionTaskExecutor<Q, TSStatus> {
+
+    private final String taskName;
+
+    DeleteLogicalViewRegionTaskExecutor(
+        String taskName,
+        ConfigNodeProcedureEnv env,
+        Map<TConsensusGroupId, TRegionReplicaSet> targetSchemaRegionGroup,
+        DataNodeRequestType dataNodeRequestType,
+        BiFunction<TDataNodeLocation, List<TConsensusGroupId>, Q> 
dataNodeRequestGenerator) {
+      super(env, targetSchemaRegionGroup, false, dataNodeRequestType, 
dataNodeRequestGenerator);
+      this.taskName = taskName;
+    }
+
+    @Override
+    protected List<TConsensusGroupId> processResponseOfOneDataNode(
+        TDataNodeLocation dataNodeLocation,
+        List<TConsensusGroupId> consensusGroupIdList,
+        TSStatus response) {
+      List<TConsensusGroupId> failedRegionList = new ArrayList<>();
+      if (response.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+        return failedRegionList;
+      }
+
+      if (response.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
+        List<TSStatus> subStatus = response.getSubStatus();
+        for (int i = 0; i < subStatus.size(); i++) {
+          if (subStatus.get(i).getCode() != 
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+            failedRegionList.add(consensusGroupIdList.get(i));
+          }
+        }
+      } else {
+        failedRegionList.addAll(consensusGroupIdList);
+      }
+      return failedRegionList;
+    }
+
+    @Override
+    protected void onAllReplicasetFailure(
+        TConsensusGroupId consensusGroupId, Set<TDataNodeLocation> 
dataNodeLocationSet) {
+      setFailure(
+          new ProcedureException(
+              new MetadataException(
+                  String.format(
+                      "Delete view %s failed when [%s] because all replicaset 
of schemaRegion %s failed. %s",
+                      requestMessage, taskName, consensusGroupId.id, 
dataNodeLocationSet))));
+      interruptTask();
+    }
+  }
+}
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/schema/DeleteLogicalViewState.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/schema/DeleteLogicalViewState.java
new file mode 100644
index 00000000000..fa608fb423c
--- /dev/null
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/state/schema/DeleteLogicalViewState.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.procedure.state.schema;
+
+public enum DeleteLogicalViewState {
+  CONSTRUCT_BLACK_LIST,
+  CLEAN_DATANODE_SCHEMA_CACHE,
+  DELETE_VIEW_SCHEMA
+}
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
index ab180dc8026..e352f606312 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureFactory.java
@@ -37,6 +37,7 @@ import 
org.apache.iotdb.confignode.procedure.impl.pipe.task.StartPipeProcedureV2
 import 
org.apache.iotdb.confignode.procedure.impl.pipe.task.StopPipeProcedureV2;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.DeactivateTemplateProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.DeleteDatabaseProcedure;
+import 
org.apache.iotdb.confignode.procedure.impl.schema.DeleteLogicalViewProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.DeleteTimeSeriesProcedure;
 import org.apache.iotdb.confignode.procedure.impl.schema.SetTemplateProcedure;
 import 
org.apache.iotdb.confignode.procedure.impl.schema.UnsetTemplateProcedure;
@@ -92,6 +93,9 @@ public class ProcedureFactory implements IProcedureFactory {
       case DELETE_TIMESERIES_PROCEDURE:
         procedure = new DeleteTimeSeriesProcedure();
         break;
+      case DELETE_LOGICAL_VIEW_PROCEDURE:
+        procedure = new DeleteLogicalViewProcedure();
+        break;
       case CREATE_TRIGGER_PROCEDURE:
         procedure = new CreateTriggerProcedure();
         break;
@@ -222,6 +226,8 @@ public class ProcedureFactory implements IProcedureFactory {
       return ProcedureType.PIPE_META_SYNC_PROCEDURE;
     } else if (procedure instanceof PipeHandleMetaChangeProcedure) {
       return ProcedureType.PIPE_HANDLE_META_CHANGE_PROCEDURE;
+    } else if (procedure instanceof DeleteLogicalViewProcedure) {
+      return ProcedureType.DELETE_LOGICAL_VIEW_PROCEDURE;
     }
     return null;
   }
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java
index 12839b5b412..7e6ffa008ea 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/store/ProcedureType.java
@@ -75,7 +75,10 @@ public enum ProcedureType {
   /** Pipe Runtime */
   PIPE_HANDLE_LEADER_CHANGE_PROCEDURE((short) 1100),
   PIPE_META_SYNC_PROCEDURE((short) 1101),
-  PIPE_HANDLE_META_CHANGE_PROCEDURE((short) 1102);
+  PIPE_HANDLE_META_CHANGE_PROCEDURE((short) 1102),
+
+  /** logical view */
+  DELETE_LOGICAL_VIEW_PROCEDURE((short) 1200);
 
   private final short typeCode;
 
diff --git 
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
 
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index c2b44e07de1..6e73fee6675 100644
--- 
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++ 
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -97,6 +97,7 @@ import 
org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchemaResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabaseReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabasesReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
@@ -857,6 +858,11 @@ public class ConfigNodeRPCServiceProcessor implements 
IConfigNodeRPCService.Ifac
     return configManager.deleteTimeSeries(req);
   }
 
+  @Override
+  public TSStatus deleteLogicalView(TDeleteLogicalViewReq req) {
+    return configManager.deleteLogicalView(req);
+  }
+
   @Override
   @Deprecated
   public TSStatus createPipeSink(TPipeSinkInfo req) {
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift 
b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
index c70bafcb47d..e9d41faea32 100644
--- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -659,6 +659,11 @@ struct TDeleteTimeSeriesReq{
   2: required binary pathPatternTree
 }
 
+struct TDeleteLogicalViewReq{
+  1: required string queryId
+  2: required binary pathPatternTree
+}
+
 // ====================================================
 // CQ
 // ====================================================
@@ -1260,6 +1265,8 @@ service IConfigNodeRPCService {
    */
   common.TSStatus deleteTimeSeries(TDeleteTimeSeriesReq req)
 
+  common.TSStatus deleteLogicalView(TDeleteLogicalViewReq req)
+
   // ======================================================
   // Sync
   // ======================================================
diff --git a/iotdb-protocol/thrift/src/main/thrift/datanode.thrift 
b/iotdb-protocol/thrift/src/main/thrift/datanode.thrift
index d519a2e80e4..727d2e8f2a1 100644
--- a/iotdb-protocol/thrift/src/main/thrift/datanode.thrift
+++ b/iotdb-protocol/thrift/src/main/thrift/datanode.thrift
@@ -387,6 +387,21 @@ struct TPushPipeMetaReq {
   1: required list<binary> pipeMetas
 }
 
+struct TConstructViewSchemaBlackListReq{
+    1: required list<common.TConsensusGroupId> schemaRegionIdList
+    2: required binary pathPatternTree
+}
+
+struct TRollbackViewSchemaBlackListReq{
+  1: required list<common.TConsensusGroupId> schemaRegionIdList
+  2: required binary pathPatternTree
+}
+
+struct TDeleteViewSchemaReq{
+   1: required list<common.TConsensusGroupId> schemaRegionIdList
+   2: required binary pathPatternTree
+}
+
 // ====================================================
 // CQ
 // ====================================================
@@ -764,6 +779,12 @@ service IDataNodeRPCService {
 
   TCheckTimeSeriesExistenceResp 
checkTimeSeriesExistence(TCheckTimeSeriesExistenceReq req)
 
+  common.TSStatus 
constructViewSchemaBlackList(TConstructViewSchemaBlackListReq req)
+
+  common.TSStatus rollbackViewSchemaBlackList(TRollbackViewSchemaBlackListReq 
req)
+
+  common.TSStatus deleteViewSchema(TDeleteViewSchemaReq req)
+
  /**
   * Send pipeMetas to DataNodes, for synchronization
   */
diff --git 
a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java 
b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
index 4376f6a4eec..f9d69c2caa4 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
@@ -66,6 +66,7 @@ import 
org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchemaResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabaseReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabasesReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
@@ -1695,6 +1696,27 @@ public class ConfigNodeClient implements 
IConfigNodeRPCService.Iface, ThriftClie
     throw new TException(MSG_RECONNECTION_FAIL);
   }
 
+  @Override
+  public TSStatus deleteLogicalView(TDeleteLogicalViewReq req) throws 
TException {
+    for (int i = 0; i < RETRY_NUM; i++) {
+      try {
+        TSStatus status = client.deleteLogicalView(req);
+        if (!updateConfigNodeLeader(status)) {
+          return status;
+        }
+      } catch (TException e) {
+        logger.warn(
+            "Failed to connect to ConfigNode {} from DataNode {} when 
executing {}",
+            configNode,
+            config.getAddressAndPort(),
+            Thread.currentThread().getStackTrace()[1].getMethodName());
+        configLeader = null;
+      }
+      waitAndReconnect();
+    }
+    throw new TException(MSG_RECONNECTION_FAIL);
+  }
+
   @Override
   public TSStatus createPipeSink(TPipeSinkInfo req) throws TException {
     for (int i = 0; i < RETRY_NUM; i++) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
index bd6cacb9747..6eeadd9d61c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
@@ -1082,5 +1082,59 @@ public class MTreeBelowSGMemoryImpl {
       return measurementMNode;
     }
   }
+
+  public List<PartialPath> constructLogicalViewBlackList(PartialPath 
pathPattern)
+      throws MetadataException {
+    List<PartialPath> result = new ArrayList<>();
+    try (MeasurementUpdater<IMemMNode> updater =
+        new MeasurementUpdater<IMemMNode>(rootNode, pathPattern, store, false) 
{
+
+          protected void updateMeasurement(IMeasurementMNode<IMemMNode> node) {
+            if (node.isLogicalView()) {
+              node.setPreDeleted(true);
+              result.add(getPartialPathFromRootToNode(node.getAsMNode()));
+            }
+          }
+        }) {
+      updater.update();
+    }
+    return result;
+  }
+
+  public List<PartialPath> rollbackLogicalViewBlackList(PartialPath 
pathPattern)
+      throws MetadataException {
+    List<PartialPath> result = new ArrayList<>();
+    try (MeasurementUpdater<IMemMNode> updater =
+        new MeasurementUpdater<IMemMNode>(rootNode, pathPattern, store, false) 
{
+
+          protected void updateMeasurement(IMeasurementMNode<IMemMNode> node) {
+            if (node.isLogicalView()) {
+              node.setPreDeleted(false);
+              result.add(getPartialPathFromRootToNode(node.getAsMNode()));
+            }
+          }
+        }) {
+      updater.update();
+    }
+    return result;
+  }
+
+  public List<PartialPath> getPreDeletedLogicalView(PartialPath pathPattern)
+      throws MetadataException {
+    List<PartialPath> result = new LinkedList<>();
+    try (MeasurementCollector<Void, IMemMNode> collector =
+        new MeasurementCollector<Void, IMemMNode>(rootNode, pathPattern, 
store, false) {
+
+          protected Void collectMeasurement(IMeasurementMNode<IMemMNode> node) 
{
+            if (node.isLogicalView() && node.isPreDeleted()) {
+              result.add(getPartialPathFromRootToNode(node.getAsMNode()));
+            }
+            return null;
+          }
+        }) {
+      collector.traverse();
+    }
+    return result;
+  }
   // endregion
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanType.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanType.java
index 0d36c801614..33e4dbd2136 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanType.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanType.java
@@ -46,6 +46,9 @@ public enum SchemaRegionPlanType {
   DEACTIVATE_TEMPLATE((byte) 2),
   // logical view
   CREATE_LOGICAL_VIEW((byte) 66),
+  PRE_DELETE_LOGICAL_VIEW((byte) 67),
+  ROLLBACK_PRE_DELETE_LOGICAL_VIEW((byte) 68),
+  DELETE_LOGICAL_VIEW((byte) 69),
 
   // query plan doesn't need any ser/deSer, thus use one type to represent all
   READ_SCHEMA(Byte.MAX_VALUE);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanVisitor.java
index e6d145139a4..4936e3160aa 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/SchemaRegionPlanVisitor.java
@@ -32,6 +32,9 @@ import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
 
 public abstract class SchemaRegionPlanVisitor<R, C> {
 
@@ -94,4 +97,18 @@ public abstract class SchemaRegionPlanVisitor<R, C> {
   public R visitCreateLogicalView(ICreateLogicalViewPlan 
createLogicalViewPlan, C context) {
     return visitSchemaRegionPlan(createLogicalViewPlan, context);
   }
+
+  public R visitPreDeleteLogicalView(
+      IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, C context) {
+    return visitSchemaRegionPlan(preDeleteLogicalViewPlan, context);
+  }
+
+  public R visitRollbackPreDeleteLogicalView(
+      IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan, C 
context) {
+    return visitSchemaRegionPlan(rollbackPreDeleteLogicalViewPlan, context);
+  }
+
+  public R visitDeleteLogicalView(IDeleteLogicalViewPlan 
deleteLogicalViewPlan, C context) {
+    return visitSchemaRegionPlan(deleteLogicalViewPlan, context);
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanDeserializer.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanDeserializer.java
index a251b662f22..e4ff058041e 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanDeserializer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanDeserializer.java
@@ -41,6 +41,9 @@ import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -361,5 +364,27 @@ public class SchemaRegionPlanDeserializer implements 
IDeserializer<ISchemaRegion
       
createLogicalViewPlan.setViewPathToSourceExpressionMap(viewPathToSourceMap);
       return createLogicalViewPlan;
     }
+
+    @Override
+    public ISchemaRegionPlan visitPreDeleteLogicalView(
+        IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, ByteBuffer buffer) 
{
+      preDeleteLogicalViewPlan.setPath((PartialPath) 
PathDeserializeUtil.deserialize(buffer));
+      return preDeleteLogicalViewPlan;
+    }
+
+    @Override
+    public ISchemaRegionPlan visitRollbackPreDeleteLogicalView(
+        IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan, 
ByteBuffer buffer) {
+      rollbackPreDeleteLogicalViewPlan.setPath(
+          (PartialPath) PathDeserializeUtil.deserialize(buffer));
+      return rollbackPreDeleteLogicalViewPlan;
+    }
+
+    @Override
+    public ISchemaRegionPlan visitDeleteLogicalView(
+        IDeleteLogicalViewPlan deleteLogicalViewPlan, ByteBuffer buffer) {
+      deleteLogicalViewPlan.setPath((PartialPath) 
PathDeserializeUtil.deserialize(buffer));
+      return deleteLogicalViewPlan;
+    }
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanSerializer.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanSerializer.java
index ee56a8b7d03..d4dd9041b40 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanSerializer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanSerializer.java
@@ -37,6 +37,9 @@ import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -424,5 +427,39 @@ public class SchemaRegionPlanSerializer implements 
ISerializer<ISchemaRegionPlan
         return new SchemaRegionPlanSerializationResult(e);
       }
     }
+
+    @Override
+    public SchemaRegionPlanSerializationResult visitPreDeleteLogicalView(
+        IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, DataOutputStream 
dataOutputStream) {
+      try {
+        preDeleteLogicalViewPlan.getPath().serialize(dataOutputStream);
+        return SchemaRegionPlanSerializationResult.SUCCESS;
+      } catch (IOException e) {
+        return new SchemaRegionPlanSerializationResult(e);
+      }
+    }
+
+    @Override
+    public SchemaRegionPlanSerializationResult 
visitRollbackPreDeleteLogicalView(
+        IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan,
+        DataOutputStream dataOutputStream) {
+      try {
+        rollbackPreDeleteLogicalViewPlan.getPath().serialize(dataOutputStream);
+        return SchemaRegionPlanSerializationResult.SUCCESS;
+      } catch (IOException e) {
+        return new SchemaRegionPlanSerializationResult(e);
+      }
+    }
+
+    @Override
+    public SchemaRegionPlanSerializationResult visitDeleteLogicalView(
+        IDeleteLogicalViewPlan deleteLogicalViewPlan, DataOutputStream 
dataOutputStream) {
+      try {
+        deleteLogicalViewPlan.getPath().serialize(dataOutputStream);
+        return SchemaRegionPlanSerializationResult.SUCCESS;
+      } catch (IOException e) {
+        return new SchemaRegionPlanSerializationResult(e);
+      }
+    }
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanTxtSerializer.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanTxtSerializer.java
index 400b8efd57c..a4445f967de 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanTxtSerializer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/SchemaRegionPlanTxtSerializer.java
@@ -37,6 +37,9 @@ import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -261,5 +264,27 @@ public class SchemaRegionPlanTxtSerializer implements 
ISerializer<ISchemaRegionP
       }
       return null;
     }
+
+    @Override
+    public Void visitPreDeleteLogicalView(
+        IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, StringBuilder 
stringBuilder) {
+      stringBuilder.append(preDeleteLogicalViewPlan.getPath().getFullPath());
+      return null;
+    }
+
+    @Override
+    public Void visitRollbackPreDeleteLogicalView(
+        IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan,
+        StringBuilder stringBuilder) {
+      
stringBuilder.append(rollbackPreDeleteLogicalViewPlan.getPath().getFullPath());
+      return null;
+    }
+
+    @Override
+    public Void visitDeleteLogicalView(
+        IDeleteLogicalViewPlan deleteLogicalViewPlan, StringBuilder 
stringBuilder) {
+      stringBuilder.append(deleteLogicalViewPlan.getPath().getFullPath());
+      return null;
+    }
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/DeleteLogicalViewPlanImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/DeleteLogicalViewPlanImpl.java
new file mode 100644
index 00000000000..b20c2c7da37
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/DeleteLogicalViewPlanImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.metadata.plan.schemaregion.impl.write;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+
+public class DeleteLogicalViewPlanImpl implements IDeleteLogicalViewPlan {
+
+  private PartialPath path;
+
+  DeleteLogicalViewPlanImpl() {}
+
+  DeleteLogicalViewPlanImpl(PartialPath path) {
+    this.path = path;
+  }
+
+  @Override
+  public PartialPath getPath() {
+    return path;
+  }
+
+  @Override
+  public void setPath(PartialPath path) {
+    this.path = path;
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/PreDeleteLogicalViewPlanImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/PreDeleteLogicalViewPlanImpl.java
new file mode 100644
index 00000000000..77c4eb88ee3
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/PreDeleteLogicalViewPlanImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.metadata.plan.schemaregion.impl.write;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+
+public class PreDeleteLogicalViewPlanImpl implements IPreDeleteLogicalViewPlan 
{
+
+  private PartialPath path;
+
+  PreDeleteLogicalViewPlanImpl() {}
+
+  PreDeleteLogicalViewPlanImpl(PartialPath path) {
+    this.path = path;
+  }
+
+  @Override
+  public PartialPath getPath() {
+    return path;
+  }
+
+  @Override
+  public void setPath(PartialPath path) {
+    this.path = path;
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/RollbackPreDeleteLogicalViewPlanImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/RollbackPreDeleteLogicalViewPlanImpl.java
new file mode 100644
index 00000000000..a61a7f3b9df
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/RollbackPreDeleteLogicalViewPlanImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.metadata.plan.schemaregion.impl.write;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
+
+public class RollbackPreDeleteLogicalViewPlanImpl implements 
IRollbackPreDeleteLogicalViewPlan {
+
+  private PartialPath path;
+
+  RollbackPreDeleteLogicalViewPlanImpl() {}
+
+  RollbackPreDeleteLogicalViewPlanImpl(PartialPath path) {
+    this.path = path;
+  }
+
+  @Override
+  public PartialPath getPath() {
+    return path;
+  }
+
+  @Override
+  public void setPath(PartialPath path) {
+    this.path = path;
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/SchemaRegionWritePlanFactory.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/SchemaRegionWritePlanFactory.java
index e8491905240..1ee9a2bc834 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/SchemaRegionWritePlanFactory.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/impl/write/SchemaRegionWritePlanFactory.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.metadata.plan.schemaregion.impl.write;
 
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
 import org.apache.iotdb.db.metadata.plan.schemaregion.ISchemaRegionPlan;
 import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanType;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IActivateTemplateInClusterPlan;
@@ -27,6 +28,7 @@ import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IAutoCreateDeviceMNo
 import org.apache.iotdb.db.metadata.plan.schemaregion.write.IChangeAliasPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IChangeTagOffsetPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateAlignedTimeSeriesPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateLogicalViewPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateTimeSeriesPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IDeactivateTemplatePlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IDeleteTimeSeriesPlan;
@@ -34,6 +36,9 @@ import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -73,6 +78,12 @@ public class SchemaRegionWritePlanFactory {
         return new DeactivateTemplatePlanImpl();
       case CREATE_LOGICAL_VIEW:
         return new CreateLogicalViewPlanImpl();
+      case PRE_DELETE_LOGICAL_VIEW:
+        return new PreDeleteLogicalViewPlanImpl();
+      case ROLLBACK_PRE_DELETE_LOGICAL_VIEW:
+        return new RollbackPreDeleteLogicalViewPlanImpl();
+      case DELETE_LOGICAL_VIEW:
+        return new DeleteLogicalViewPlanImpl();
       default:
         throw new UnsupportedOperationException(
             String.format(
@@ -158,4 +169,22 @@ public class SchemaRegionWritePlanFactory {
       Map<PartialPath, List<Integer>> templateSetInfo) {
     return new DeactivateTemplatePlanImpl(templateSetInfo);
   }
+
+  public static ICreateLogicalViewPlan getCreateLogicalViewPlan(
+      PartialPath targetPath, ViewExpression sourceExpression) {
+    return new CreateLogicalViewPlanImpl(targetPath, sourceExpression);
+  }
+
+  public static IPreDeleteLogicalViewPlan 
getPreDeleteLogicalViewPlan(PartialPath path) {
+    return new PreDeleteLogicalViewPlanImpl(path);
+  }
+
+  public static IRollbackPreDeleteLogicalViewPlan 
getRollbackPreDeleteLogicalViewPlan(
+      PartialPath path) {
+    return new RollbackPreDeleteLogicalViewPlanImpl(path);
+  }
+
+  public static IDeleteLogicalViewPlan getDeleteLogicalViewPlan(PartialPath 
path) {
+    return new DeleteLogicalViewPlanImpl(path);
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IDeleteLogicalViewPlan.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IDeleteLogicalViewPlan.java
new file mode 100644
index 00000000000..83f598592e2
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IDeleteLogicalViewPlan.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.metadata.plan.schemaregion.write.view;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.plan.schemaregion.ISchemaRegionPlan;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanType;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanVisitor;
+
+public interface IDeleteLogicalViewPlan extends ISchemaRegionPlan {
+
+  @Override
+  default SchemaRegionPlanType getPlanType() {
+    return SchemaRegionPlanType.DELETE_LOGICAL_VIEW;
+  }
+
+  @Override
+  default <R, C> R accept(SchemaRegionPlanVisitor<R, C> visitor, C context) {
+    return visitor.visitDeleteLogicalView(this, context);
+  }
+
+  PartialPath getPath();
+
+  void setPath(PartialPath path);
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IPreDeleteLogicalViewPlan.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IPreDeleteLogicalViewPlan.java
new file mode 100644
index 00000000000..ae9f4a09034
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IPreDeleteLogicalViewPlan.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.metadata.plan.schemaregion.write.view;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.plan.schemaregion.ISchemaRegionPlan;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanType;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanVisitor;
+
+public interface IPreDeleteLogicalViewPlan extends ISchemaRegionPlan {
+
+  @Override
+  default SchemaRegionPlanType getPlanType() {
+    return SchemaRegionPlanType.PRE_DELETE_LOGICAL_VIEW;
+  }
+
+  @Override
+  default <R, C> R accept(SchemaRegionPlanVisitor<R, C> visitor, C context) {
+    return visitor.visitPreDeleteLogicalView(this, context);
+  }
+
+  PartialPath getPath();
+
+  void setPath(PartialPath path);
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IRollbackPreDeleteLogicalViewPlan.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IRollbackPreDeleteLogicalViewPlan.java
new file mode 100644
index 00000000000..794d2b6faf5
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/write/view/IRollbackPreDeleteLogicalViewPlan.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.metadata.plan.schemaregion.write.view;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.metadata.plan.schemaregion.ISchemaRegionPlan;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanType;
+import org.apache.iotdb.db.metadata.plan.schemaregion.SchemaRegionPlanVisitor;
+
+public interface IRollbackPreDeleteLogicalViewPlan extends ISchemaRegionPlan {
+
+  @Override
+  default SchemaRegionPlanType getPlanType() {
+    return SchemaRegionPlanType.ROLLBACK_PRE_DELETE_LOGICAL_VIEW;
+  }
+
+  @Override
+  default <R, C> R accept(SchemaRegionPlanVisitor<R, C> visitor, C context) {
+    return visitor.visitRollbackPreDeleteLogicalView(this, context);
+  }
+
+  PartialPath getPath();
+
+  void setPath(PartialPath path);
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
index 902aedbd93d..fb204799738 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/ISchemaRegion.java
@@ -176,6 +176,13 @@ public interface ISchemaRegion {
 
   // region Interfaces for Logical View
   void createLogicalView(ICreateLogicalViewPlan createLogicalViewPlan) throws 
MetadataException;
+
+  long constructLogicalViewBlackList(PathPatternTree patternTree) throws 
MetadataException;
+
+  void rollbackLogicalViewBlackList(PathPatternTree patternTree) throws 
MetadataException;
+
+  void deleteLogicalView(PathPatternTree patternTree) throws MetadataException;
+
   // endregion
 
   // region Interfaces for metadata info Query
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
index 8b24cfc508c..347745ecf37 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
@@ -70,6 +70,9 @@ import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeactivateTempla
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IPreDeleteTimeSeriesPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeactivateTemplatePlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.IRollbackPreDeleteTimeSeriesPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IPreDeleteLogicalViewPlan;
+import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.view.IRollbackPreDeleteLogicalViewPlan;
 import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
 import org.apache.iotdb.db.metadata.query.info.INodeSchemaInfo;
 import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
@@ -828,6 +831,54 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
     // TODO: CRTODO: shall we update id table?
   }
 
+  @Override
+  public long constructLogicalViewBlackList(PathPatternTree patternTree) 
throws MetadataException {
+    long preDeletedNum = 0;
+    for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
+      // Given pathPatterns may match one logical view multi times, which may 
results in the
+      // preDeletedNum larger than the actual num of logical view. It doesn't 
matter since the main
+      // purpose is to check whether there's logical view to be deleted.
+      List<PartialPath> paths = 
mtree.constructLogicalViewBlackList(pathPattern);
+      preDeletedNum += paths.size();
+      for (PartialPath path : paths) {
+        try {
+          
writeToMLog(SchemaRegionWritePlanFactory.getPreDeleteLogicalViewPlan(path));
+        } catch (IOException e) {
+          throw new MetadataException(e);
+        }
+      }
+    }
+    return preDeletedNum;
+  }
+
+  @Override
+  public void rollbackLogicalViewBlackList(PathPatternTree patternTree) throws 
MetadataException {
+    for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
+      List<PartialPath> paths = 
mtree.rollbackLogicalViewBlackList(pathPattern);
+      for (PartialPath path : paths) {
+        try {
+          
writeToMLog(SchemaRegionWritePlanFactory.getRollbackPreDeleteLogicalViewPlan(path));
+        } catch (IOException e) {
+          throw new MetadataException(e);
+        }
+      }
+    }
+  }
+
+  @Override
+  public void deleteLogicalView(PathPatternTree patternTree) throws 
MetadataException {
+    for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
+      for (PartialPath path : mtree.getPreDeletedLogicalView(pathPattern)) {
+        try {
+          deleteSingleTimeseriesInBlackList(path);
+          
writeToMLog(SchemaRegionWritePlanFactory.getDeleteLogicalViewPlan(path));
+        } catch (IOException e) {
+          throw new MetadataException(e);
+        }
+      }
+    }
+  }
+
   private void deleteSingleTimeseriesInBlackList(PartialPath path)
       throws MetadataException, IOException {
     IMeasurementMNode<IMemMNode> measurementMNode = 
mtree.deleteTimeseries(path);
@@ -1394,5 +1445,39 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
         return new RecoverOperationResult(e);
       }
     }
+
+    @Override
+    public RecoverOperationResult visitPreDeleteLogicalView(
+        IPreDeleteLogicalViewPlan preDeleteLogicalViewPlan, 
SchemaRegionMemoryImpl context) {
+      try {
+        recoverPreDeleteTimeseries(preDeleteLogicalViewPlan.getPath());
+        return RecoverOperationResult.SUCCESS;
+      } catch (MetadataException e) {
+        return new RecoverOperationResult(e);
+      }
+    }
+
+    @Override
+    public RecoverOperationResult visitRollbackPreDeleteLogicalView(
+        IRollbackPreDeleteLogicalViewPlan rollbackPreDeleteLogicalViewPlan,
+        SchemaRegionMemoryImpl context) {
+      try {
+        
recoverRollbackPreDeleteTimeseries(rollbackPreDeleteLogicalViewPlan.getPath());
+        return RecoverOperationResult.SUCCESS;
+      } catch (MetadataException e) {
+        return new RecoverOperationResult(e);
+      }
+    }
+
+    @Override
+    public RecoverOperationResult visitDeleteLogicalView(
+        IDeleteLogicalViewPlan deleteLogicalViewPlan, SchemaRegionMemoryImpl 
context) {
+      try {
+        deleteOneTimeseriesUpdateStatistics(deleteLogicalViewPlan.getPath());
+        return RecoverOperationResult.SUCCESS;
+      } catch (MetadataException | IOException e) {
+        return new RecoverOperationResult(e);
+      }
+    }
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
index d426f1f6855..27b892831df 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionSchemaFileImpl.java
@@ -904,6 +904,21 @@ public class SchemaRegionSchemaFileImpl implements 
ISchemaRegion {
     throw new UnsupportedOperationException("createLogicalView is 
unsupported.");
   }
 
+  @Override
+  public long constructLogicalViewBlackList(PathPatternTree patternTree) 
throws MetadataException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void rollbackLogicalViewBlackList(PathPatternTree patternTree) throws 
MetadataException {
+    throw new UnsupportedOperationException();
+  }
+
+  @Override
+  public void deleteLogicalView(PathPatternTree patternTree) throws 
MetadataException {
+    throw new UnsupportedOperationException();
+  }
+
   private void deleteSingleTimeseriesInBlackList(PartialPath path)
       throws MetadataException, IOException {
     IMeasurementMNode<ICachedMNode> measurementMNode = 
mtree.deleteTimeseries(path);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/visitor/SchemaExecutionVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/SchemaExecutionVisitor.java
index 6529c34a502..8b9db82b733 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/visitor/SchemaExecutionVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/SchemaExecutionVisitor.java
@@ -27,7 +27,6 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
 import org.apache.iotdb.db.exception.metadata.MeasurementAlreadyExistException;
 import 
org.apache.iotdb.db.exception.metadata.template.TemplateIsInUseException;
-import 
org.apache.iotdb.db.metadata.plan.schemaregion.impl.write.CreateLogicalViewPlanImpl;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.impl.write.SchemaRegionWritePlanFactory;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateAlignedTimeSeriesPlan;
 import 
org.apache.iotdb.db.metadata.plan.schemaregion.write.ICreateTimeSeriesPlan;
@@ -41,7 +40,6 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.AlterTimeSe
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.DeactivateTemplateNode;
@@ -53,6 +51,10 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.Measurement
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.PreDeactivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackPreDeactivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackSchemaBlackListNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.ConstructLogicalViewBlackListNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.DeleteLogicalViewNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.RollbackLogicalViewBlackListNode;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -450,7 +452,8 @@ public class SchemaExecutionVisitor extends 
PlanVisitor<TSStatus, ISchemaRegion>
     for (Map.Entry<PartialPath, ViewExpression> entry : 
viewPathToSourceMap.entrySet()) {
       try {
         schemaRegion.createLogicalView(
-            new CreateLogicalViewPlanImpl(entry.getKey(), entry.getValue()));
+            SchemaRegionWritePlanFactory.getCreateLogicalViewPlan(
+                entry.getKey(), entry.getValue()));
       } catch (MetadataException e) {
         logger.error("{}: MetaData error: ", IoTDBConstant.GLOBAL_DB_NAME, e);
         failingStatus.add(RpcUtils.getStatus(e.getErrorCode(), 
e.getMessage()));
@@ -462,6 +465,41 @@ public class SchemaExecutionVisitor extends 
PlanVisitor<TSStatus, ISchemaRegion>
     return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS, "Execute 
successfully");
   }
 
+  @Override
+  public TSStatus visitConstructLogicalViewBlackList(
+      ConstructLogicalViewBlackListNode node, ISchemaRegion schemaRegion) {
+    try {
+      long preDeletedNum = 
schemaRegion.constructLogicalViewBlackList(node.getPatternTree());
+      return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS, 
String.valueOf(preDeletedNum));
+    } catch (MetadataException e) {
+      logger.error(e.getMessage(), e);
+      return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+    }
+  }
+
+  @Override
+  public TSStatus visitRollbackLogicalViewBlackList(
+      RollbackLogicalViewBlackListNode node, ISchemaRegion schemaRegion) {
+    try {
+      schemaRegion.rollbackLogicalViewBlackList(node.getPatternTree());
+      return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+    } catch (MetadataException e) {
+      logger.error(e.getMessage(), e);
+      return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+    }
+  }
+
+  @Override
+  public TSStatus visitDeleteLogicalView(DeleteLogicalViewNode node, 
ISchemaRegion schemaRegion) {
+    try {
+      schemaRegion.deleteLogicalView(node.getPatternTree());
+      return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
+    } catch (MetadataException e) {
+      logger.error(e.getMessage(), e);
+      return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+    }
+  }
+
   @Override
   public TSStatus visitPlan(PlanNode node, ISchemaRegion context) {
     return null;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
index f50acceea2a..327b23862c5 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/execution/executor/RegionWriteExecutor.java
@@ -45,13 +45,13 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ActivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalBatchActivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCreateMultiTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCreateTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.MeasurementGroup;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.DeleteDataNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertMultiTabletsNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertNode;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index 909b3e24685..a4983f060d3 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -117,7 +117,6 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CountLevelTimeSeriesState
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CountNodesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSeriesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement;
-import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateLogicalViewStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement;
@@ -136,6 +135,7 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchem
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathsUsingTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.CreateLogicalViewStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ShowQueriesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ShowVersionStatement;
@@ -2976,7 +2976,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
 
     PathPatternTree patternTree = new PathPatternTree();
     for (PartialPath devicePath : 
batchActivateTemplateStatement.getDevicePathList()) {
-      
patternTree.appendPathPattern(devicePath.concatNode(ONE_LEVEL_PATH_WILDCARD));
+      // the devicePath is a path without wildcard
+      
patternTree.appendFullPath(devicePath.concatNode(ONE_LEVEL_PATH_WILDCARD));
     }
     SchemaPartition partition = 
partitionFetcher.getOrCreateSchemaPartition(patternTree);
 
@@ -2996,7 +2997,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     PathPatternTree patternTree = new PathPatternTree();
     for (PartialPath activatePath :
         internalBatchActivateTemplateStatement.getDeviceMap().keySet()) {
-      
patternTree.appendPathPattern(activatePath.concatNode(ONE_LEVEL_PATH_WILDCARD));
+      // the devicePath is a path without wildcard
+      
patternTree.appendFullPath(activatePath.concatNode(ONE_LEVEL_PATH_WILDCARD));
     }
     SchemaPartition partition = 
partitionFetcher.getOrCreateSchemaPartition(patternTree);
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
index b6fe7fcb05d..e42d3ae5466 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
@@ -63,6 +63,7 @@ import 
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowNodes
 import 
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowPathSetTemplateTask;
 import 
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.ShowSchemaTemplateTask;
 import 
org.apache.iotdb.db.mpp.plan.execution.config.metadata.template.UnsetSchemaTemplateTask;
+import 
org.apache.iotdb.db.mpp.plan.execution.config.metadata.view.DeleteLogicalViewTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.AuthorizerTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.ClearCacheTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.FlushTask;
@@ -128,6 +129,7 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchem
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ClearCacheStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.FlushStatement;
@@ -431,6 +433,12 @@ public class ConfigTaskVisitor
     return new DeleteTimeSeriesTask(context.getQueryId(), 
deleteTimeSeriesStatement);
   }
 
+  @Override
+  public IConfigTask visitDeleteLogicalView(
+      DeleteLogicalViewStatement deleteLogicalViewStatement, TaskContext 
context) {
+    return new DeleteLogicalViewTask(context.getQueryId(), 
deleteLogicalViewStatement);
+  }
+
   @Override
   public IConfigTask visitGetRegionId(
       GetRegionIdStatement getRegionIdStatement, TaskContext context) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index e1881628bba..6858e22e238 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -56,6 +56,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchemaResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDeactivateSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteDatabasesReq;
+import org.apache.iotdb.confignode.rpc.thrift.TDeleteLogicalViewReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDeleteTimeSeriesReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropCQReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
@@ -167,6 +168,7 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchem
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.KillQueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.pipe.CreatePipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.pipe.DropPipeStatement;
@@ -1715,6 +1717,47 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
     return future;
   }
 
+  @Override
+  public SettableFuture<ConfigTaskResult> deleteLogicalView(
+      String queryId, DeleteLogicalViewStatement deleteLogicalViewStatement) {
+    SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+    TDeleteLogicalViewReq req =
+        new TDeleteLogicalViewReq(
+            queryId,
+            
serializePatternListToByteBuffer(deleteLogicalViewStatement.getPathPatternList()));
+    try (ConfigNodeClient client =
+        
CLUSTER_DELETION_CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID))
 {
+      TSStatus tsStatus;
+      do {
+        try {
+          tsStatus = client.deleteLogicalView(req);
+        } catch (TTransportException e) {
+          if (e.getType() == TTransportException.TIMED_OUT
+              || e.getCause() instanceof SocketTimeoutException) {
+            // time out mainly caused by slow execution, wait until
+            tsStatus = 
RpcUtils.getStatus(TSStatusCode.OVERLAP_WITH_EXISTING_TASK);
+          } else {
+            throw e;
+          }
+        }
+        // keep waiting until task ends
+      } while (TSStatusCode.OVERLAP_WITH_EXISTING_TASK.getStatusCode() == 
tsStatus.getCode());
+
+      if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
+        LOGGER.warn(
+            "Failed to execute delete view {}, status is {}.",
+            deleteLogicalViewStatement.getPathPatternList(),
+            tsStatus);
+        future.setException(new IoTDBException(tsStatus.getMessage(), 
tsStatus.getCode()));
+      } else {
+        future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+      }
+    } catch (ClientManagerException | TException e) {
+      future.setException(e);
+    }
+    return future;
+  }
+
   @Override
   public SettableFuture<ConfigTaskResult> getRegionId(GetRegionIdStatement 
getRegionIdStatement) {
     SettableFuture<ConfigTaskResult> future = SettableFuture.create();
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
index 3bb992ca6dd..aadfc3f7a7c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -53,6 +53,7 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchem
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.KillQueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.pipe.CreatePipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.pipe.DropPipeStatement;
@@ -171,6 +172,9 @@ public interface IConfigTaskExecutor {
   SettableFuture<ConfigTaskResult> deleteTimeSeries(
       String queryId, DeleteTimeSeriesStatement deleteTimeSeriesStatement);
 
+  SettableFuture<ConfigTaskResult> deleteLogicalView(
+      String queryId, DeleteLogicalViewStatement deleteLogicalViewStatement);
+
   SettableFuture<ConfigTaskResult> getRegionId(GetRegionIdStatement 
getRegionIdStatement);
 
   SettableFuture<ConfigTaskResult> getSeriesSlotList(
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/view/DeleteLogicalViewTask.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/view/DeleteLogicalViewTask.java
new file mode 100644
index 00000000000..40ce84918b7
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/view/DeleteLogicalViewTask.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.execution.config.metadata.view;
+
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import 
org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class DeleteLogicalViewTask implements IConfigTask {
+
+  private final String queryId;
+
+  private final DeleteLogicalViewStatement deleteLogicalViewStatement;
+
+  public DeleteLogicalViewTask(
+      String queryId, DeleteLogicalViewStatement deleteLogicalViewStatement) {
+    this.queryId = queryId;
+    this.deleteLogicalViewStatement = deleteLogicalViewStatement;
+  }
+
+  @Override
+  public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor 
configTaskExecutor)
+      throws InterruptedException {
+    return configTaskExecutor.deleteLogicalView(queryId, 
deleteLogicalViewStatement);
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
index 956b3158447..8f965050939 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
@@ -117,7 +117,6 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSlotListStatemen
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement;
-import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateLogicalViewStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreatePipePluginStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTriggerStatement;
@@ -164,6 +163,8 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTempl
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathsUsingTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.CreateLogicalViewStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ClearCacheStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
@@ -1004,6 +1005,17 @@ public class ASTVisitor extends 
IoTDBSqlParserBaseVisitor<Statement> {
     return createLogicalViewStatement;
   }
 
+  @Override
+  public Statement visitDropLogicalView(IoTDBSqlParser.DropLogicalViewContext 
ctx) {
+    DeleteLogicalViewStatement deleteLogicalViewStatement = new 
DeleteLogicalViewStatement();
+    List<PartialPath> partialPaths = new ArrayList<>();
+    for (IoTDBSqlParser.PrefixPathContext prefixPathContext : 
ctx.prefixPath()) {
+      partialPaths.add(parsePrefixPath(prefixPathContext));
+    }
+    deleteLogicalViewStatement.setPathPatternList(partialPaths);
+    return deleteLogicalViewStatement;
+  }
+
   // parse suffix paths in logical view
   private PartialPath 
parseViewSuffixPath(IoTDBSqlParser.ViewSuffixPathsContext ctx) {
     List<IoTDBSqlParser.NodeNameWithoutWildcardContext> nodeNamesWithoutStar =
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
index ed82734b768..01eaf88aecc 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanVisitor.java
@@ -34,13 +34,13 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ActivateTem
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.AlterTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalBatchActivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCreateMultiTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCreateTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.MeasurementGroup;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.DeleteDataNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertMultiTabletsNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.InsertRowNode;
@@ -70,7 +70,6 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CountLevelTimeSeriesState
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CountNodesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSeriesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement;
-import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateLogicalViewStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildNodesStatement;
@@ -80,6 +79,7 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ActivateTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.BatchActivateTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathsUsingTemplateStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.CreateLogicalViewStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ShowQueriesStatement;
 import org.apache.iotdb.tsfile.utils.Pair;
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
index 762238ac915..9d0bc8a148d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
@@ -39,7 +39,6 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.AlterTimeSe
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.DeactivateTemplateNode;
@@ -51,6 +50,10 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InvalidateS
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.PreDeactivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackPreDeactivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackSchemaBlackListNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.ConstructLogicalViewBlackListNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.DeleteLogicalViewNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.RollbackLogicalViewBlackListNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.AggregationNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceMergeNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceViewIntoNode;
@@ -169,7 +172,10 @@ public enum PlanNodeType {
   IDENTITY_SINK((short) 70),
   SHUFFLE_SINK((short) 71),
   BATCH_ACTIVATE_TEMPLATE((short) 72),
-  CREATE_LOGICAL_VIEW((short) 73);
+  CREATE_LOGICAL_VIEW((short) 73),
+  CONSTRUCT_LOGICAL_VIEW_BLACK_LIST((short) 74),
+  ROLLBACK_LOGICAL_VIEW_BLACK_LIST((short) 75),
+  DELETE_LOGICAL_VIEW((short) 76);
 
   public static final int BYTES = Short.BYTES;
 
@@ -364,6 +370,12 @@ public enum PlanNodeType {
         return BatchActivateTemplateNode.deserialize(buffer);
       case 73:
         return CreateLogicalViewNode.deserialize(buffer);
+      case 74:
+        return ConstructLogicalViewBlackListNode.deserialize(buffer);
+      case 75:
+        return RollbackLogicalViewBlackListNode.deserialize(buffer);
+      case 76:
+        return DeleteLogicalViewNode.deserialize(buffer);
       default:
         throw new IllegalArgumentException("Invalid node type: " + nodeType);
     }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
index 771a8050145..d2955839a8c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanVisitor.java
@@ -38,7 +38,6 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.AlterTimeSe
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.BatchActivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.ConstructSchemaBlackListNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateAlignedTimeSeriesNode;
-import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateLogicalViewNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateMultiTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.CreateTimeSeriesNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.DeactivateTemplateNode;
@@ -49,6 +48,10 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.InternalCre
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.PreDeactivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackPreDeactivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackSchemaBlackListNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.ConstructLogicalViewBlackListNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.CreateLogicalViewNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.DeleteLogicalViewNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.RollbackLogicalViewBlackListNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.AggregationNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceMergeNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.process.DeviceViewIntoNode;
@@ -375,6 +378,22 @@ public abstract class PlanVisitor<R, C> {
     return visitPlan(node, context);
   }
 
+  public R visitCreateLogicalView(CreateLogicalViewNode node, C context) {
+    return visitPlan(node, context);
+  }
+
+  public R 
visitConstructLogicalViewBlackList(ConstructLogicalViewBlackListNode node, C 
context) {
+    return visitPlan(node, context);
+  }
+
+  public R visitRollbackLogicalViewBlackList(RollbackLogicalViewBlackListNode 
node, C context) {
+    return visitPlan(node, context);
+  }
+
+  public R visitDeleteLogicalView(DeleteLogicalViewNode node, C context) {
+    return visitPlan(node, context);
+  }
+
   
/////////////////////////////////////////////////////////////////////////////////////////////////
   // Data Write Node
   
/////////////////////////////////////////////////////////////////////////////////////////////////
@@ -402,8 +421,4 @@ public abstract class PlanVisitor<R, C> {
   public R visitDeleteData(DeleteDataNode node, C context) {
     return visitPlan(node, context);
   }
-
-  public R visitCreateLogicalView(CreateLogicalViewNode node, C context) {
-    return visitPlan(node, context);
-  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/ConstructLogicalViewBlackListNode.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/ConstructLogicalViewBlackListNode.java
new file mode 100644
index 00000000000..932a8e464e2
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/ConstructLogicalViewBlackListNode.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view;
+
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class ConstructLogicalViewBlackListNode extends PlanNode {
+
+  private final PathPatternTree patternTree;
+
+  public ConstructLogicalViewBlackListNode(PlanNodeId id, PathPatternTree 
patternTree) {
+    super(id);
+    this.patternTree = patternTree;
+  }
+
+  public PathPatternTree getPatternTree() {
+    return patternTree;
+  }
+
+  @Override
+  public List<PlanNode> getChildren() {
+    return null;
+  }
+
+  @Override
+  public void addChild(PlanNode child) {}
+
+  @Override
+  public PlanNode clone() {
+    return new ConstructLogicalViewBlackListNode(getPlanNodeId(), patternTree);
+  }
+
+  @Override
+  public int allowedChildCount() {
+    return 0;
+  }
+
+  @Override
+  public List<String> getOutputColumnNames() {
+    return null;
+  }
+
+  @Override
+  public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+    return visitor.visitConstructLogicalViewBlackList(this, context);
+  }
+
+  @Override
+  protected void serializeAttributes(ByteBuffer byteBuffer) {
+    PlanNodeType.CONSTRUCT_LOGICAL_VIEW_BLACK_LIST.serialize(byteBuffer);
+    patternTree.serialize(byteBuffer);
+  }
+
+  @Override
+  protected void serializeAttributes(DataOutputStream stream) throws 
IOException {
+    PlanNodeType.CONSTRUCT_LOGICAL_VIEW_BLACK_LIST.serialize(stream);
+    patternTree.serialize(stream);
+  }
+
+  public static ConstructLogicalViewBlackListNode deserialize(ByteBuffer 
buffer) {
+    PathPatternTree patternTree = PathPatternTree.deserialize(buffer);
+    PlanNodeId planNodeId = PlanNodeId.deserialize(buffer);
+    return new ConstructLogicalViewBlackListNode(planNodeId, patternTree);
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/CreateLogicalViewNode.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/CreateLogicalViewNode.java
similarity index 99%
rename from 
server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/CreateLogicalViewNode.java
rename to 
server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/CreateLogicalViewNode.java
index e4eff9e08ee..1995b0f2c35 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/CreateLogicalViewNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/CreateLogicalViewNode.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write;
+package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view;
 
 import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.commons.path.PartialPath;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/DeleteLogicalViewNode.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/DeleteLogicalViewNode.java
new file mode 100644
index 00000000000..db2245ce395
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/DeleteLogicalViewNode.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view;
+
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class DeleteLogicalViewNode extends PlanNode {
+
+  private final PathPatternTree patternTree;
+
+  public DeleteLogicalViewNode(PlanNodeId id, PathPatternTree patternTree) {
+    super(id);
+    this.patternTree = patternTree;
+  }
+
+  public PathPatternTree getPatternTree() {
+    return patternTree;
+  }
+
+  @Override
+  public List<PlanNode> getChildren() {
+    return null;
+  }
+
+  @Override
+  public void addChild(PlanNode child) {}
+
+  @Override
+  public PlanNode clone() {
+    return new DeleteLogicalViewNode(getPlanNodeId(), patternTree);
+  }
+
+  @Override
+  public int allowedChildCount() {
+    return 0;
+  }
+
+  @Override
+  public List<String> getOutputColumnNames() {
+    return null;
+  }
+
+  @Override
+  public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+    return visitor.visitDeleteLogicalView(this, context);
+  }
+
+  @Override
+  protected void serializeAttributes(ByteBuffer byteBuffer) {
+    PlanNodeType.DELETE_LOGICAL_VIEW.serialize(byteBuffer);
+    patternTree.serialize(byteBuffer);
+  }
+
+  @Override
+  protected void serializeAttributes(DataOutputStream stream) throws 
IOException {
+    PlanNodeType.DELETE_LOGICAL_VIEW.serialize(stream);
+    patternTree.serialize(stream);
+  }
+
+  public static DeleteLogicalViewNode deserialize(ByteBuffer buffer) {
+    PathPatternTree patternTree = PathPatternTree.deserialize(buffer);
+    PlanNodeId planNodeId = PlanNodeId.deserialize(buffer);
+    return new DeleteLogicalViewNode(planNodeId, patternTree);
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/RollbackLogicalViewBlackListNode.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/RollbackLogicalViewBlackListNode.java
new file mode 100644
index 00000000000..5630ac3d449
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/write/view/RollbackLogicalViewBlackListNode.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view;
+
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+public class RollbackLogicalViewBlackListNode extends PlanNode {
+
+  private final PathPatternTree patternTree;
+
+  public RollbackLogicalViewBlackListNode(PlanNodeId id, PathPatternTree 
patternTree) {
+    super(id);
+    this.patternTree = patternTree;
+  }
+
+  public PathPatternTree getPatternTree() {
+    return patternTree;
+  }
+
+  @Override
+  public List<PlanNode> getChildren() {
+    return null;
+  }
+
+  @Override
+  public void addChild(PlanNode child) {}
+
+  @Override
+  public PlanNode clone() {
+    return new RollbackLogicalViewBlackListNode(getPlanNodeId(), patternTree);
+  }
+
+  @Override
+  public int allowedChildCount() {
+    return 0;
+  }
+
+  @Override
+  public List<String> getOutputColumnNames() {
+    return null;
+  }
+
+  @Override
+  public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+    return visitor.visitRollbackLogicalViewBlackList(this, context);
+  }
+
+  @Override
+  protected void serializeAttributes(ByteBuffer byteBuffer) {
+    PlanNodeType.ROLLBACK_LOGICAL_VIEW_BLACK_LIST.serialize(byteBuffer);
+    patternTree.serialize(byteBuffer);
+  }
+
+  @Override
+  protected void serializeAttributes(DataOutputStream stream) throws 
IOException {
+    PlanNodeType.ROLLBACK_LOGICAL_VIEW_BLACK_LIST.serialize(stream);
+    patternTree.serialize(stream);
+  }
+
+  public static RollbackLogicalViewBlackListNode deserialize(ByteBuffer 
buffer) {
+    PathPatternTree patternTree = PathPatternTree.deserialize(buffer);
+    PlanNodeId planNodeId = PlanNodeId.deserialize(buffer);
+    return new RollbackLogicalViewBlackListNode(planNodeId, patternTree);
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java
index e3ebe07d419..04403e9295d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java
@@ -169,4 +169,5 @@ public enum StatementType {
   SHOW_THROTTLE_QUOTA,
 
   CREATE_LOGICAL_VIEW,
+  DELETE_LOGICAL_VIEW,
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
index 5f716f95b51..03c18855434 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
@@ -42,7 +42,6 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSlotListStatemen
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement;
-import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateLogicalViewStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreatePipePluginStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement;
@@ -91,6 +90,8 @@ import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTempl
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathsUsingTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
 import 
org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.CreateLogicalViewStatement;
+import 
org.apache.iotdb.db.mpp.plan.statement.metadata.view.DeleteLogicalViewStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ClearCacheStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
@@ -247,6 +248,11 @@ public abstract class StatementVisitor<R, C> {
     return visitStatement(createLogicalViewStatement, context);
   }
 
+  public R visitDeleteLogicalView(
+      DeleteLogicalViewStatement deleteLogicalViewStatement, C context) {
+    return visitStatement(deleteLogicalViewStatement, context);
+  }
+
   // ML Model
   public R visitCreateModel(CreateModelStatement createModelStatement, C 
context) {
     return visitStatement(createModelStatement, context);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CreateLogicalViewStatement.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/CreateLogicalViewStatement.java
similarity index 99%
rename from 
server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CreateLogicalViewStatement.java
rename to 
server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/CreateLogicalViewStatement.java
index 66c60210305..e208be48b3a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/CreateLogicalViewStatement.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/CreateLogicalViewStatement.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.mpp.plan.statement.metadata;
+package org.apache.iotdb.db.mpp.plan.statement.metadata.view;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/DeleteLogicalViewStatement.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/DeleteLogicalViewStatement.java
new file mode 100644
index 00000000000..2b3860d5ee1
--- /dev/null
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/view/DeleteLogicalViewStatement.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.statement.metadata.view;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementType;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+
+import java.util.List;
+
+public class DeleteLogicalViewStatement extends Statement implements 
IConfigStatement {
+  List<PartialPath> pathPatternList;
+
+  public DeleteLogicalViewStatement() {
+    super();
+    statementType = StatementType.DELETE_LOGICAL_VIEW;
+  }
+
+  public DeleteLogicalViewStatement(List<PartialPath> pathPatternList) {
+    this();
+    this.pathPatternList = pathPatternList;
+  }
+
+  @Override
+  public List<PartialPath> getPaths() {
+    return pathPatternList;
+  }
+
+  public List<PartialPath> getPathPatternList() {
+    return pathPatternList;
+  }
+
+  public void setPathPatternList(List<PartialPath> pathPatternList) {
+    this.pathPatternList = pathPatternList;
+  }
+
+  @Override
+  public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+    return visitor.visitDeleteLogicalView(this, context);
+  }
+
+  @Override
+  public QueryType getQueryType() {
+    return QueryType.WRITE;
+  }
+}
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
index af62026464e..0863b58d1f5 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeInternalRPCServiceImpl.java
@@ -103,6 +103,9 @@ import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.DeleteTimeS
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.PreDeactivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackPreDeactivateTemplateNode;
 import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.RollbackSchemaBlackListNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.ConstructLogicalViewBlackListNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.DeleteLogicalViewNode;
+import 
org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.write.view.RollbackLogicalViewBlackListNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.write.DeleteDataNode;
 import org.apache.iotdb.db.mpp.plan.scheduler.load.LoadTsFileScheduler;
 import org.apache.iotdb.db.mpp.plan.statement.component.WhereCondition;
@@ -132,6 +135,7 @@ import 
org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceReq;
 import org.apache.iotdb.mpp.rpc.thrift.TCheckTimeSeriesExistenceResp;
 import org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListReq;
 import 
org.apache.iotdb.mpp.rpc.thrift.TConstructSchemaBlackListWithTemplateReq;
+import org.apache.iotdb.mpp.rpc.thrift.TConstructViewSchemaBlackListReq;
 import org.apache.iotdb.mpp.rpc.thrift.TCountPathsUsingTemplateReq;
 import org.apache.iotdb.mpp.rpc.thrift.TCountPathsUsingTemplateResp;
 import org.apache.iotdb.mpp.rpc.thrift.TCreateDataRegionReq;
@@ -144,6 +148,7 @@ import 
org.apache.iotdb.mpp.rpc.thrift.TDeactivateTemplateReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDeleteDataForDeleteSchemaReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDeleteModelMetricsReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDeleteTimeSeriesReq;
+import org.apache.iotdb.mpp.rpc.thrift.TDeleteViewSchemaReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDisableDataNodeReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDropFunctionInstanceReq;
 import org.apache.iotdb.mpp.rpc.thrift.TDropPipePluginInstanceReq;
@@ -170,6 +175,7 @@ import 
org.apache.iotdb.mpp.rpc.thrift.TRegionLeaderChangeReq;
 import org.apache.iotdb.mpp.rpc.thrift.TRegionRouteReq;
 import org.apache.iotdb.mpp.rpc.thrift.TRollbackSchemaBlackListReq;
 import org.apache.iotdb.mpp.rpc.thrift.TRollbackSchemaBlackListWithTemplateReq;
+import org.apache.iotdb.mpp.rpc.thrift.TRollbackViewSchemaBlackListReq;
 import org.apache.iotdb.mpp.rpc.thrift.TSchemaFetchRequest;
 import org.apache.iotdb.mpp.rpc.thrift.TSchemaFetchResponse;
 import org.apache.iotdb.mpp.rpc.thrift.TSendBatchPlanNodeReq;
@@ -802,6 +808,91 @@ public class DataNodeInternalRPCServiceImpl implements 
IDataNodeRPCService.Iface
     return resp;
   }
 
+  @Override
+  public TSStatus 
constructViewSchemaBlackList(TConstructViewSchemaBlackListReq req)
+      throws TException {
+    PathPatternTree patternTree =
+        PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree()));
+    AtomicInteger preDeletedNum = new AtomicInteger(0);
+    TSStatus executionResult =
+        executeInternalSchemaTask(
+            req.getSchemaRegionIdList(),
+            consensusGroupId -> {
+              String storageGroup =
+                  schemaEngine
+                      .getSchemaRegion(new 
SchemaRegionId(consensusGroupId.getId()))
+                      .getDatabaseFullPath();
+              PathPatternTree filteredPatternTree =
+                  filterPathPatternTree(patternTree, storageGroup);
+              if (filteredPatternTree.isEmpty()) {
+                return RpcUtils.SUCCESS_STATUS;
+              }
+              RegionWriteExecutor executor = new RegionWriteExecutor();
+              TSStatus status =
+                  executor
+                      .execute(
+                          new SchemaRegionId(consensusGroupId.getId()),
+                          new ConstructLogicalViewBlackListNode(
+                              new PlanNodeId(""), filteredPatternTree))
+                      .getStatus();
+              if (status.code == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+                preDeletedNum.getAndAdd(Integer.parseInt(status.getMessage()));
+              }
+              return status;
+            });
+    executionResult.setMessage(String.valueOf(preDeletedNum.get()));
+    return executionResult;
+  }
+
+  @Override
+  public TSStatus rollbackViewSchemaBlackList(TRollbackViewSchemaBlackListReq 
req)
+      throws TException {
+    PathPatternTree patternTree =
+        PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree()));
+    return executeInternalSchemaTask(
+        req.getSchemaRegionIdList(),
+        consensusGroupId -> {
+          String storageGroup =
+              schemaEngine
+                  .getSchemaRegion(new 
SchemaRegionId(consensusGroupId.getId()))
+                  .getDatabaseFullPath();
+          PathPatternTree filteredPatternTree = 
filterPathPatternTree(patternTree, storageGroup);
+          if (filteredPatternTree.isEmpty()) {
+            return RpcUtils.SUCCESS_STATUS;
+          }
+          RegionWriteExecutor executor = new RegionWriteExecutor();
+          return executor
+              .execute(
+                  new SchemaRegionId(consensusGroupId.getId()),
+                  new RollbackLogicalViewBlackListNode(new PlanNodeId(""), 
filteredPatternTree))
+              .getStatus();
+        });
+  }
+
+  @Override
+  public TSStatus deleteViewSchema(TDeleteViewSchemaReq req) throws TException 
{
+    PathPatternTree patternTree =
+        PathPatternTree.deserialize(ByteBuffer.wrap(req.getPathPatternTree()));
+    return executeInternalSchemaTask(
+        req.getSchemaRegionIdList(),
+        consensusGroupId -> {
+          String storageGroup =
+              schemaEngine
+                  .getSchemaRegion(new 
SchemaRegionId(consensusGroupId.getId()))
+                  .getDatabaseFullPath();
+          PathPatternTree filteredPatternTree = 
filterPathPatternTree(patternTree, storageGroup);
+          if (filteredPatternTree.isEmpty()) {
+            return RpcUtils.SUCCESS_STATUS;
+          }
+          RegionWriteExecutor executor = new RegionWriteExecutor();
+          return executor
+              .execute(
+                  new SchemaRegionId(consensusGroupId.getId()),
+                  new DeleteLogicalViewNode(new PlanNodeId(""), 
filteredPatternTree))
+              .getStatus();
+        });
+  }
+
   @Override
   public TSStatus pushPipeMeta(TPushPipeMetaReq req) {
     final List<PipeMeta> pipeMetas = new ArrayList<>();

Reply via email to