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 a7d61489db2 [Enhancement] (nereids) implement 
drop/killAnalyzeJobCommand in nereids (#48942)
a7d61489db2 is described below

commit a7d61489db229d0a4e1c4aa9d8c286e563ad31c6
Author: yaoxiao <yx136264...@163.com>
AuthorDate: Thu Mar 27 15:11:32 2025 +0800

    [Enhancement] (nereids) implement drop/killAnalyzeJobCommand in nereids 
(#48942)
    
    Issue Number: close #42712,#42713
---
 .../antlr4/org/apache/doris/nereids/DorisParser.g4 |  6 +--
 .../doris/nereids/parser/LogicalPlanBuilder.java   | 14 ++++++
 .../apache/doris/nereids/trees/plans/PlanType.java |  4 +-
 .../plans/commands/DropAnalyzeJobCommand.java      | 55 +++++++++++++++++++++
 .../plans/commands/KillAnalyzeJobCommand.java      | 56 ++++++++++++++++++++++
 .../nereids/trees/plans/commands/KillCommand.java  | 44 +++++++++++++++++
 .../trees/plans/visitor/CommandVisitor.java        | 10 ++++
 .../apache/doris/statistics/AnalysisManager.java   | 32 +++++++++++++
 .../suites/statistics/test_drop_analyze_job.groovy | 53 ++++++++++++++++++++
 9 files changed, 270 insertions(+), 4 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 4a7be12468d..2c806bc996c 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
@@ -745,15 +745,15 @@ supportedStatsStatement
         columns=identifierList? partitionSpec?                                 
 #dropStats
     | DROP CACHED STATS tableName=multipartIdentifier                          
 #dropCachedStats
     | DROP EXPIRED STATS                                                       
 #dropExpiredStats
+    | KILL ANALYZE jobId=INTEGER_VALUE                                         
 #killAnalyzeJob
+    | DROP ANALYZE JOB INTEGER_VALUE                                           
 #dropAnalyzeJob
     | SHOW TABLE STATS tableName=multipartIdentifier
         partitionSpec? columnList=identifierList?                              
 #showTableStats
     | SHOW TABLE STATS tableId=INTEGER_VALUE                                   
 #showTableStats
     ;
 
 unsupportedStatsStatement
-    : DROP ANALYZE JOB INTEGER_VALUE                                           
 #dropAanalyzeJob
-    | KILL ANALYZE jobId=INTEGER_VALUE                                         
 #killAnalyzeJob
-    | SHOW COLUMN CACHED? STATS tableName=multipartIdentifier
+    : SHOW COLUMN CACHED? STATS tableName=multipartIdentifier
         columnList=identifierList? partitionSpec?                              
 #showColumnStats
     | SHOW ANALYZE TASK STATUS jobId=INTEGER_VALUE                             
 #showAnalyzeTask
     ;
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 6d6341c7246..d17988c8b19 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
@@ -565,6 +565,7 @@ import 
org.apache.doris.nereids.trees.plans.commands.CreateWorkloadGroupCommand;
 import org.apache.doris.nereids.trees.plans.commands.DeleteFromCommand;
 import org.apache.doris.nereids.trees.plans.commands.DeleteFromUsingCommand;
 import org.apache.doris.nereids.trees.plans.commands.DescribeCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropAnalyzeJobCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropCachedStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropCatalogCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.DropCatalogRecycleBinCommand;
@@ -591,6 +592,7 @@ import 
org.apache.doris.nereids.trees.plans.commands.ExplainCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel;
 import org.apache.doris.nereids.trees.plans.commands.ExportCommand;
 import org.apache.doris.nereids.trees.plans.commands.HelpCommand;
+import org.apache.doris.nereids.trees.plans.commands.KillAnalyzeJobCommand;
 import org.apache.doris.nereids.trees.plans.commands.LoadCommand;
 import org.apache.doris.nereids.trees.plans.commands.PauseJobCommand;
 import org.apache.doris.nereids.trees.plans.commands.PauseMTMVCommand;
@@ -6365,5 +6367,17 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
             columnName,
             properties);
     }
+
+    @Override
+    public LogicalPlan visitDropAnalyzeJob(DorisParser.DropAnalyzeJobContext 
ctx) {
+        long jobId = Long.parseLong(ctx.INTEGER_VALUE().getText());
+        return new DropAnalyzeJobCommand(jobId);
+    }
+
+    @Override
+    public LogicalPlan visitKillAnalyzeJob(DorisParser.KillAnalyzeJobContext 
ctx) {
+        long jobId = Long.parseLong(ctx.jobId.getText());
+        return new KillAnalyzeJobCommand(jobId);
+    }
 }
 
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 048a4cb2e7d..67a5341b055 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
@@ -325,5 +325,7 @@ public enum PlanType {
     DROP_CACHED_STATS_COMMAND,
     DROP_EXPIRED_STATS_COMMAND,
     ALTER_TABLE_STATS_COMMAND,
-    ALTER_COLUMN_STATS_COMMAND
+    ALTER_COLUMN_STATS_COMMAND,
+    KILL_ANALYZE_JOB_COMMAND,
+    DROP_ANALYZE_JOB_COMMAND
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropAnalyzeJobCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropAnalyzeJobCommand.java
new file mode 100644
index 00000000000..402e5c55750
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropAnalyzeJobCommand.java
@@ -0,0 +1,55 @@
+// 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.analysis.StmtType;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+/**
+ * DROP ANALYZE JOB [JOB_ID]
+ */
+public class DropAnalyzeJobCommand extends DropCommand {
+    private final long jobId;
+
+    public DropAnalyzeJobCommand(long jobId) {
+        super(PlanType.DROP_ANALYZE_JOB_COMMAND);
+        this.jobId = jobId;
+    }
+
+    public long getJobId() {
+        return jobId;
+    }
+
+    @Override
+    public void doRun(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        ctx.getEnv().getAnalysisManager().dropAnalyzeJob(this);
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitDropAnalyzeJobCommand(this, context);
+    }
+
+    @Override
+    public StmtType stmtType() {
+        return StmtType.DROP;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/KillAnalyzeJobCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/KillAnalyzeJobCommand.java
new file mode 100644
index 00000000000..3c363cba9b2
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/KillAnalyzeJobCommand.java
@@ -0,0 +1,56 @@
+// 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.analysis.StmtType;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+/**
+ * KillAnalyzeJobCommand
+ */
+public class KillAnalyzeJobCommand extends KillCommand {
+
+    private final long jobId;
+
+    public KillAnalyzeJobCommand(long jobId) {
+        super(PlanType.KILL_ANALYZE_JOB_COMMAND);
+        this.jobId = jobId;
+    }
+
+    public long getJobId() {
+        return jobId;
+    }
+
+    @Override
+    public void doRun(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        ctx.getEnv().getAnalysisManager().handleKillAnalyzeJob(this);
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitKillAnalyzeJobCommand(this, context);
+    }
+
+    @Override
+    public StmtType stmtType() {
+        return StmtType.KILL;
+    }
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/KillCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/KillCommand.java
new file mode 100644
index 00000000000..3b3bec93ea4
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/KillCommand.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.doris.nereids.trees.plans.commands;
+
+import org.apache.doris.analysis.StmtType;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+/**
+ * base class for all kill commands
+ */
+public abstract class KillCommand extends Command implements ForwardWithSync {
+    public KillCommand(PlanType type) {
+        super(type);
+    }
+
+    @Override
+    public StmtType stmtType() {
+        return StmtType.KILL;
+    }
+
+    @Override
+    public void run(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        doRun(ctx, executor);
+    }
+
+    public abstract void doRun(ConnectContext ctx, StmtExecutor executor) 
throws Exception;
+}
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 958ea039071..4bdac8127bd 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
@@ -64,6 +64,7 @@ import 
org.apache.doris.nereids.trees.plans.commands.CreateWorkloadGroupCommand;
 import org.apache.doris.nereids.trees.plans.commands.DeleteFromCommand;
 import org.apache.doris.nereids.trees.plans.commands.DeleteFromUsingCommand;
 import org.apache.doris.nereids.trees.plans.commands.DescribeCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropAnalyzeJobCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropCachedStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropCatalogCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.DropCatalogRecycleBinCommand;
@@ -88,6 +89,7 @@ import 
org.apache.doris.nereids.trees.plans.commands.DropWorkloadPolicyCommand;
 import org.apache.doris.nereids.trees.plans.commands.ExplainCommand;
 import org.apache.doris.nereids.trees.plans.commands.ExportCommand;
 import org.apache.doris.nereids.trees.plans.commands.HelpCommand;
+import org.apache.doris.nereids.trees.plans.commands.KillAnalyzeJobCommand;
 import org.apache.doris.nereids.trees.plans.commands.LoadCommand;
 import org.apache.doris.nereids.trees.plans.commands.PauseJobCommand;
 import org.apache.doris.nereids.trees.plans.commands.PauseMTMVCommand;
@@ -904,4 +906,12 @@ public interface CommandVisitor<R, C> {
     default R visitAlterColumnStatsCommand(AlterColumnStatsCommand 
alterColumnStatsCommand, C context) {
         return visitCommand(alterColumnStatsCommand, context);
     }
+
+    default R visitKillAnalyzeJobCommand(KillAnalyzeJobCommand 
killAnalyzeJobCommand, C context) {
+        return visitCommand(killAnalyzeJobCommand, context);
+    }
+
+    default R visitDropAnalyzeJobCommand(DropAnalyzeJobCommand 
dropAnalyzeJobCommand, C context) {
+        return visitCommand(dropAnalyzeJobCommand, context);
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
index d04120b3af7..c43adeccc41 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java
@@ -60,7 +60,9 @@ import 
org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.plans.commands.AnalyzeCommand;
 import org.apache.doris.nereids.trees.plans.commands.AnalyzeDatabaseCommand;
 import org.apache.doris.nereids.trees.plans.commands.AnalyzeTableCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropAnalyzeJobCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropStatsCommand;
+import org.apache.doris.nereids.trees.plans.commands.KillAnalyzeJobCommand;
 import org.apache.doris.nereids.trees.plans.commands.info.PartitionNamesInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo;
 import org.apache.doris.persist.AnalyzeDeletionLog;
@@ -1166,6 +1168,23 @@ public class AnalysisManager implements Writable {
         }
     }
 
+    public void handleKillAnalyzeJob(KillAnalyzeJobCommand 
killAnalyzeJobCommand) throws DdlException {
+        Map<Long, BaseAnalysisTask> analysisTaskMap = 
analysisJobIdToTaskMap.remove(killAnalyzeJobCommand.getJobId());
+        if (analysisTaskMap == null) {
+            throw new DdlException("Job not exists or already finished");
+        }
+        BaseAnalysisTask anyTask = 
analysisTaskMap.values().stream().findFirst().orElse(null);
+        if (anyTask == null) {
+            return;
+        }
+        checkPriv(anyTask);
+        logKilled(analysisJobInfoMap.get(anyTask.getJobId()));
+        for (BaseAnalysisTask taskInfo : analysisTaskMap.values()) {
+            taskInfo.cancel();
+            logKilled(taskInfo.info);
+        }
+    }
+
     public void handleKillAnalyzeStmt(KillAnalysisJobStmt killAnalysisJobStmt) 
throws DdlException {
         Map<Long, BaseAnalysisTask> analysisTaskMap = 
analysisJobIdToTaskMap.remove(killAnalysisJobStmt.jobId);
         if (analysisTaskMap == null) {
@@ -1335,6 +1354,19 @@ public class AnalysisManager implements Writable {
         }
     }
 
+    public void dropAnalyzeJob(DropAnalyzeJobCommand analyzeJobCommand) throws 
DdlException {
+        AnalysisInfo jobInfo = 
analysisJobInfoMap.get(analyzeJobCommand.getJobId());
+        if (jobInfo == null) {
+            throw new DdlException(String.format("Analyze job [%d] not 
exists", analyzeJobCommand.getJobId()));
+        }
+        checkPriv(jobInfo);
+        long jobId = analyzeJobCommand.getJobId();
+        AnalyzeDeletionLog analyzeDeletionLog = new AnalyzeDeletionLog(jobId);
+        
Env.getCurrentEnv().getEditLog().logDeleteAnalysisJob(analyzeDeletionLog);
+        replayDeleteAnalysisJob(analyzeDeletionLog);
+        removeAll(findTasks(jobId));
+    }
+
     public void dropAnalyzeJob(DropAnalyzeJobStmt analyzeJobStmt) throws 
DdlException {
         AnalysisInfo jobInfo = 
analysisJobInfoMap.get(analyzeJobStmt.getJobId());
         if (jobInfo == null) {
diff --git a/regression-test/suites/statistics/test_drop_analyze_job.groovy 
b/regression-test/suites/statistics/test_drop_analyze_job.groovy
new file mode 100644
index 00000000000..f77509ac165
--- /dev/null
+++ b/regression-test/suites/statistics/test_drop_analyze_job.groovy
@@ -0,0 +1,53 @@
+// 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_analyze_job") {
+
+    sql """drop database if exists test_drop_analyze_job"""
+    sql """create database test_drop_analyze_job"""
+    sql """use test_drop_analyze_job"""
+
+    sql """CREATE TABLE drop_analyze_job_test (
+            key1 int NOT NULL,
+            value1 varchar(25) NOT NULL,
+            value2 varchar(125) NOT NULL
+        )ENGINE=OLAP
+        DUPLICATE KEY(`key1`)
+        COMMENT "OLAP"
+        DISTRIBUTED BY HASH(`key1`) BUCKETS 2
+        PROPERTIES (
+            "replication_num" = "1"
+        )
+    """
+
+    sql """insert into drop_analyze_job_test values (1, "1", "1")"""
+    sql """analyze table drop_analyze_job_test"""
+
+    def result = sql """show analyze drop_analyze_job_test"""
+    assertEquals(1, result.size())
+       
+       result = sql """show analyze drop_analyze_job_test"""
+       jobId0 = result[0][0]
+       
+       sql """drop analyze job ${jobId0}"""
+       
+       result = sql """show analyze drop_analyze_job_test"""
+    assertEquals(0, result.size())
+       
+    sql """drop database if exists test_drop_analyze_jobs"""
+}
+


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

Reply via email to