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

starocean999 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new d0f09fb36f6 [Enhancement] (nereids)implement DropStoragePolicyCommand 
in nereids (#44825)
d0f09fb36f6 is described below

commit d0f09fb36f638ed312fdf23011d3ed9b3a35737d
Author: Sridhar R Manikarnike <sridhar.n...@gmail.com>
AuthorDate: Tue Dec 24 13:06:59 2024 +0530

    [Enhancement] (nereids)implement DropStoragePolicyCommand in nereids 
(#44825)
    
    Issue Number: close #42626
---
 .../antlr4/org/apache/doris/nereids/DorisParser.g4 |  2 +-
 .../doris/nereids/parser/LogicalPlanBuilder.java   |  9 +++
 .../apache/doris/nereids/trees/plans/PlanType.java |  1 +
 .../plans/commands/DropStoragePolicyCommand.java   | 68 ++++++++++++++++++++++
 .../trees/plans/visitor/CommandVisitor.java        |  5 ++
 .../java/org/apache/doris/policy/PolicyMgr.java    | 16 +++--
 .../test_drop_storage_policy_command.groovy        | 63 ++++++++++++++++++++
 7 files changed, 157 insertions(+), 7 deletions(-)

diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index 7ca3e9f7b80..f5730bddd54 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -220,6 +220,7 @@ supportedDropStatement
     | DROP ROLE (IF EXISTS)? name=identifier                                   
 #dropRole
     | DROP SQL_BLOCK_RULE (IF EXISTS)? identifierSeq                           
 #dropSqlBlockRule
     | DROP USER (IF EXISTS)? userIdentify                                      
 #dropUser
+    | DROP STORAGE POLICY (IF EXISTS)? name=identifier                         
 #dropStoragePolicy
     | DROP WORKLOAD GROUP (IF EXISTS)? name=identifierOrText                   
 #dropWorkloadGroup
     | DROP CATALOG (IF EXISTS)? name=identifier                                
 #dropCatalog
     | DROP FILE name=STRING_LITERAL
@@ -703,7 +704,6 @@ unsupportedDropStatement
     | DROP ROW POLICY (IF EXISTS)? policyName=identifier
         ON tableName=multipartIdentifier
         (FOR (userIdentify | ROLE roleName=identifier))?                       
 #dropRowPolicy
-    | DROP STORAGE POLICY (IF EXISTS)? name=identifier                         
 #dropStoragePolicy
     | DROP STAGE (IF EXISTS)? name=identifier                                  
 #dropStage
     ;
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 623d6537ccd..08a5078214d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -130,6 +130,7 @@ import 
org.apache.doris.nereids.DorisParser.DropProcedureContext;
 import org.apache.doris.nereids.DorisParser.DropRepositoryContext;
 import org.apache.doris.nereids.DorisParser.DropRoleContext;
 import org.apache.doris.nereids.DorisParser.DropSqlBlockRuleContext;
+import org.apache.doris.nereids.DorisParser.DropStoragePolicyContext;
 import org.apache.doris.nereids.DorisParser.DropUserContext;
 import org.apache.doris.nereids.DorisParser.DropWorkloadGroupContext;
 import org.apache.doris.nereids.DorisParser.DropWorkloadPolicyContext;
@@ -547,6 +548,7 @@ import 
org.apache.doris.nereids.trees.plans.commands.DropProcedureCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropRepositoryCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropRoleCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropSqlBlockRuleCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropStoragePolicyCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropUserCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropWorkloadGroupCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropWorkloadPolicyCommand;
@@ -5015,6 +5017,13 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
                                             
stripQuotes(ctx.STRING_LITERAL().getText()));
     }
 
+    @Override
+    public LogicalPlan visitDropStoragePolicy(DropStoragePolicyContext ctx) {
+        String policyName = ctx.name.getText();
+        boolean ifExists = ctx.EXISTS() != null;
+        return new DropStoragePolicyCommand(policyName, ifExists);
+    }
+
     @Override
     public LogicalPlan visitDropEncryptkey(DropEncryptkeyContext ctx) {
         List<String> nameParts = visitMultipartIdentifier(ctx.name);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
index 37216fa652b..76afbbdabf0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java
@@ -201,6 +201,7 @@ public enum PlanType {
     EXECUTE_COMMAND,
     DROP_SQL_BLOCK_RULE_COMMAND,
     DROP_USER_COMMAND,
+    DROP_STORAGE_POLICY_COMMAND,
     DROP_WORKLOAD_GROUP_NAME,
     DROP_WORKLOAD_POLICY_COMMAND,
     ADMIN_SET_TABLE_STATUS_COMMAND,
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropStoragePolicyCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropStoragePolicyCommand.java
new file mode 100644
index 00000000000..d5175eb2a61
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropStoragePolicyCommand.java
@@ -0,0 +1,68 @@
+// 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.doris.nereids.trees.plans.commands;
+
+import org.apache.doris.catalog.Env;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.policy.DropPolicyLog;
+import org.apache.doris.policy.PolicyTypeEnum;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * drop storage policy command
+ */
+public class DropStoragePolicyCommand extends DropCommand {
+    public static final Logger LOG = 
LogManager.getLogger(DropStoragePolicyCommand.class);
+    private final boolean ifExists;
+    private final String policyName;
+
+    /**
+     * constructor
+     */
+    public DropStoragePolicyCommand(String policyName, boolean ifExists) {
+        super(PlanType.DROP_STORAGE_POLICY_COMMAND);
+        this.policyName = policyName;
+        this.ifExists = ifExists;
+    }
+
+    @Override
+    public void doRun(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        if (!Env.getCurrentEnv().getAccessManager()
+                .checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) {
+            
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
+                        PrivPredicate.ADMIN.getPrivs().toString());
+        }
+        // Drop the storage policy
+        DropPolicyLog dropPolicyLog = new 
DropPolicyLog(PolicyTypeEnum.STORAGE, policyName);
+        Env.getCurrentEnv().getPolicyMgr().dropPolicy(dropPolicyLog, ifExists);
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitDropStoragePolicyCommand(this, context);
+    }
+}
+
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
index d6ede656542..380e21614ba 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java
@@ -67,6 +67,7 @@ import 
org.apache.doris.nereids.trees.plans.commands.DropProcedureCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropRepositoryCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropRoleCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropSqlBlockRuleCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropStoragePolicyCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropUserCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropWorkloadGroupCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropWorkloadPolicyCommand;
@@ -412,6 +413,10 @@ public interface CommandVisitor<R, C> {
         return visitCommand(setDefaultStorageVaultCommand, context);
     }
 
+    default R visitDropStoragePolicyCommand(DropStoragePolicyCommand 
dropStoragePolicyCommand, C context) {
+        return visitCommand(dropStoragePolicyCommand, context);
+    }
+
     default R visitRefreshCatalogCommand(RefreshCatalogCommand 
refreshCatalogCommand, C context) {
         return visitCommand(refreshCatalogCommand, context);
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java 
b/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java
index 6e8bd4f08cb..8e639b36a25 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/policy/PolicyMgr.java
@@ -171,11 +171,7 @@ public class PolicyMgr implements Writable {
         }
     }
 
-    /**
-     * Drop policy through stmt.
-     **/
-    public void dropPolicy(DropPolicyStmt stmt) throws DdlException, 
AnalysisException {
-        DropPolicyLog dropPolicyLog = DropPolicyLog.fromDropStmt(stmt);
+    public void dropPolicy(DropPolicyLog dropPolicyLog, boolean ifExists) 
throws DdlException, AnalysisException {
         if (dropPolicyLog.getType() == PolicyTypeEnum.STORAGE) {
             List<Database> databases = 
Env.getCurrentEnv().getInternalCatalog().getDbs();
             for (Database db : databases) {
@@ -198,7 +194,7 @@ public class PolicyMgr implements Writable {
         writeLock();
         try {
             if (!existPolicy(dropPolicyLog)) {
-                if (stmt.isIfExists()) {
+                if (ifExists) {
                     return;
                 }
                 throw new DdlException("the policy " + 
dropPolicyLog.getPolicyName() + " not exist");
@@ -210,6 +206,14 @@ public class PolicyMgr implements Writable {
         }
     }
 
+    /**
+     * Drop policy through stmt.
+     **/
+    public void dropPolicy(DropPolicyStmt stmt) throws DdlException, 
AnalysisException {
+        DropPolicyLog dropPolicyLog = DropPolicyLog.fromDropStmt(stmt);
+        dropPolicy(dropPolicyLog, stmt.isIfExists());
+    }
+
     /**
      * Check whether the policy exist.
      *
diff --git 
a/regression-test/suites/nereids_p0/test_drop_storage_policy_command.groovy 
b/regression-test/suites/nereids_p0/test_drop_storage_policy_command.groovy
new file mode 100644
index 00000000000..78e0e684b49
--- /dev/null
+++ b/regression-test/suites/nereids_p0/test_drop_storage_policy_command.groovy
@@ -0,0 +1,63 @@
+// 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.
+
+suite("test_drop_storage_policy_command", "drop,storage_policy") {
+    String policyName = "test_drop_storage_policy";
+    String resourceName = "test_drop_storage_policy_resource";
+    try {
+        // Drop existing storage policy and resource if they exist before 
creating new ones
+        try_sql("DROP STORAGE POLICY IF EXISTS ${policyName}")
+        try_sql("DROP RESOURCE IF EXISTS ${resourceName}")
+        // Create a new resource to be used in the storage policy
+        sql """
+            CREATE RESOURCE IF NOT EXISTS "${resourceName}"
+            PROPERTIES(
+                "type"="s3",
+                "AWS_ENDPOINT" = "${getS3Endpoint()}",
+                "AWS_REGION" = "${getS3Region()}",
+                "AWS_ROOT_PATH" = "regression/cooldown",
+                "AWS_ACCESS_KEY" = "${getS3AK()}",
+                "AWS_SECRET_KEY" = "${getS3SK()}",
+                "AWS_MAX_CONNECTIONS" = "50",
+                "AWS_REQUEST_TIMEOUT_MS" = "3000",
+                "AWS_CONNECTION_TIMEOUT_MS" = "1000",
+                "AWS_BUCKET" = "${getS3BucketName()}",
+                "s3_validity_check" = "false"
+            );
+        """
+
+        // Create a new storage policy to test the SHOW STORAGE POLICY command
+        sql """
+            CREATE STORAGE POLICY IF NOT EXISTS ${policyName}
+            PROPERTIES(
+                "storage_resource" = "${resourceName}",
+                "cooldown_ttl" = "300"
+            )
+        """
+
+        checkNereidsExecute("DROP STORAGE POLICY IF EXISTS ${policyName}")
+ 
+    } catch (Exception e) {
+        // Log any exceptions that occur during testing
+        log.error("Failed to execute SHOW STORAGE POLICY command", e)
+        throw e
+    } finally {
+        // Clean up by dropping the storage policy and resource if they still 
exist
+        try_sql("DROP STORAGE POLICY IF EXISTS ${policyName}")
+        try_sql("DROP RESOURCE IF EXISTS ${resourceName}")
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to