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 e6c30687484 [Enhancement] (nereids)implement 
dropCached/Expired/StatsCommand in nereids (#48763)
e6c30687484 is described below

commit e6c30687484dee7dd751ae9a810e1c69473054b9
Author: yaoxiao <yx136264...@163.com>
AuthorDate: Tue Mar 18 18:22:15 2025 +0800

    [Enhancement] (nereids)implement dropCached/Expired/StatsCommand in nereids 
(#48763)
    
    Issue Number: close #42709,#42710,#42711
---
 .../antlr4/org/apache/doris/nereids/DorisParser.g4 |  10 +-
 .../doris/nereids/parser/LogicalPlanBuilder.java   |  33 +++++
 .../apache/doris/nereids/trees/plans/PlanType.java |   3 +
 .../plans/commands/DropCachedStatsCommand.java     |  99 +++++++++++++
 .../plans/commands/DropExpiredStatsCommand.java    |  50 +++++++
 .../trees/plans/commands/DropStatsCommand.java     | 165 +++++++++++++++++++++
 .../trees/plans/visitor/CommandVisitor.java        |  15 ++
 .../apache/doris/statistics/AnalysisManager.java   |  31 +++-
 .../doris/statistics/StatisticsRepository.java     |   2 +-
 9 files changed, 401 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 241e43cd46f..e67fcad0527 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
@@ -743,14 +743,14 @@ supportedStatsStatement
         MODIFY COLUMN columnName=identifier
         SET STATS LEFT_PAREN propertyItemList RIGHT_PAREN partitionSpec?       
 #alterColumnStats
     | SHOW INDEX STATS tableName=multipartIdentifier indexId=identifier        
 #showIndexStats
-    ;
-
-unsupportedStatsStatement
-    : DROP STATS tableName=multipartIdentifier
+    | DROP STATS tableName=multipartIdentifier
         columns=identifierList? partitionSpec?                                 
 #dropStats
     | DROP CACHED STATS tableName=multipartIdentifier                          
 #dropCachedStats
     | DROP EXPIRED STATS                                                       
 #dropExpiredStats
-    | DROP ANALYZE JOB INTEGER_VALUE                                           
 #dropAanalyzeJob
+    ;
+
+unsupportedStatsStatement
+    : DROP ANALYZE JOB INTEGER_VALUE                                           
 #dropAanalyzeJob
     | KILL ANALYZE jobId=INTEGER_VALUE                                         
 #killAnalyzeJob
     | SHOW TABLE STATS tableName=multipartIdentifier
         partitionSpec? columnList=identifierList?                              
 #showTableStats
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 4830a72de31..11bbc473db8 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
@@ -26,6 +26,7 @@ import org.apache.doris.analysis.ColumnPosition;
 import org.apache.doris.analysis.DbName;
 import org.apache.doris.analysis.EncryptKeyName;
 import org.apache.doris.analysis.FunctionName;
+import org.apache.doris.analysis.PartitionNames;
 import org.apache.doris.analysis.PassVar;
 import org.apache.doris.analysis.SetType;
 import org.apache.doris.analysis.StorageBackend;
@@ -563,12 +564,14 @@ 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.DropCachedStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropCatalogCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.DropCatalogRecycleBinCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.DropCatalogRecycleBinCommand.IdType;
 import org.apache.doris.nereids.trees.plans.commands.DropConstraintCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropDatabaseCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropEncryptkeyCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropExpiredStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropFileCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropFunctionCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropJobCommand;
@@ -577,6 +580,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.DropStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropStoragePolicyCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropUserCommand;
@@ -847,6 +851,7 @@ import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -6189,6 +6194,34 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
         return new DescribeCommand(tableValuedFunctionRef);
     }
 
+    @Override
+    public LogicalPlan visitDropStats(DorisParser.DropStatsContext ctx) {
+        TableNameInfo tableNameInfo = new 
TableNameInfo(visitMultipartIdentifier(ctx.tableName));
+
+        Set<String> columnNames = new HashSet<>();
+        if (ctx.identifierList() != null) {
+            columnNames.addAll(visitIdentifierList(ctx.identifierList()));
+        }
+
+        PartitionNames partitionNames = null;
+        if (ctx.partitionSpec() != null) {
+            Pair<Boolean, List<String>> partitionSpec = 
visitPartitionSpec(ctx.partitionSpec());
+            partitionNames = new PartitionNames(partitionSpec.first, 
partitionSpec.second);
+        }
+        return new DropStatsCommand(tableNameInfo, columnNames, 
partitionNames);
+    }
+
+    @Override
+    public LogicalPlan visitDropCachedStats(DorisParser.DropCachedStatsContext 
ctx) {
+        TableNameInfo tableNameInfo = new 
TableNameInfo(visitMultipartIdentifier(ctx.tableName));
+        return new DropCachedStatsCommand(tableNameInfo);
+    }
+
+    @Override
+    public LogicalPlan 
visitDropExpiredStats(DorisParser.DropExpiredStatsContext ctx) {
+        return new DropExpiredStatsCommand();
+    }
+
     @Override
     public LogicalPlan visitAlterTableStats(DorisParser.AlterTableStatsContext 
ctx) {
         TableNameInfo tableNameInfo = new 
TableNameInfo(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 b1d66432c6a..087e7106ffb 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
@@ -316,6 +316,9 @@ public enum PlanType {
     ALTER_SYSTEM_MODIFY_BACKEND,
     ALTER_SYSTEM_MODIFY_FRONTEND_OR_BACKEND_HOSTNAME,
     ALTER_SYSTEM_RENAME_COMPUTE_GROUP,
+    DROP_STATS_COMMAND,
+    DROP_CACHED_STATS_COMMAND,
+    DROP_EXPIRED_STATS_COMMAND,
     ALTER_TABLE_STATS_COMMAND,
     ALTER_COLUMN_STATS_COMMAND
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropCachedStatsCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropCachedStatsCommand.java
new file mode 100644
index 00000000000..be90f1a55bd
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropCachedStatsCommand.java
@@ -0,0 +1,99 @@
+// 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.catalog.DatabaseIf;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.CatalogIf;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+/**
+ * Manually drop cached statistics for table and its mv.
+ * <p>
+ * syntax:
+ * DROP CACHED STATS TableName;
+ */
+public class DropCachedStatsCommand extends DropCommand {
+    private final TableNameInfo tableNameInfo;
+    private long catalogId;
+    private long dbId;
+    private long tblId;
+
+    public DropCachedStatsCommand(TableNameInfo tableNameInfo) {
+        super(PlanType.DROP_CACHED_STATS_COMMAND);
+        this.tableNameInfo = tableNameInfo;
+    }
+
+    @Override
+    public void doRun(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        validate(ctx);
+        ctx.getEnv().getAnalysisManager().dropCachedStats(catalogId, dbId, 
tblId);
+    }
+
+    private void validate(ConnectContext ctx) throws UserException {
+        if (tableNameInfo == null) {
+            throw new UserException("Should specify a valid table name.");
+        }
+        tableNameInfo.analyze(ctx);
+        String catalogName = tableNameInfo.getCtl();
+        String dbName = tableNameInfo.getDb();
+        String tblName = tableNameInfo.getTbl();
+        CatalogIf catalog = 
ctx.getEnv().getCatalogMgr().getCatalogOrAnalysisException(tableNameInfo.getCtl());
+        DatabaseIf db = catalog.getDbOrAnalysisException(dbName);
+        TableIf table = db.getTableOrAnalysisException(tblName);
+        tblId = table.getId();
+        dbId = db.getId();
+        catalogId = catalog.getId();
+        // check permission
+        checkAnalyzePriv(catalogName, db.getFullName(), table.getName());
+    }
+
+    private void checkAnalyzePriv(String catalogName, String dbName, String 
tblName) throws AnalysisException {
+        if (!Env.getCurrentEnv().getAccessManager()
+                .checkTblPriv(ConnectContext.get(), catalogName, dbName, 
tblName,
+                PrivPredicate.DROP)) {
+            ErrorReport.reportAnalysisException(
+                    ErrorCode.ERR_TABLEACCESS_DENIED_ERROR,
+                    "DROP",
+                    ConnectContext.get().getQualifiedUser(),
+                    ConnectContext.get().getRemoteIP(),
+                    dbName + "." + tblName);
+        }
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitDropCachedStatsCommand(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/DropExpiredStatsCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropExpiredStatsCommand.java
new file mode 100644
index 00000000000..6eeb39ae7ee
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropExpiredStatsCommand.java
@@ -0,0 +1,50 @@
+// 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;
+
+/**
+ * DropExpiredStatsCommand
+ */
+
+public class DropExpiredStatsCommand extends DropCommand {
+
+    public DropExpiredStatsCommand() {
+        super(PlanType.DROP_EXPIRED_STATS_COMMAND);
+    }
+
+    @Override
+    public void doRun(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        ctx.getEnv().getAnalysisManager().dropExpiredStats();
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitDropExpiredStatsCommand(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/DropStatsCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropStatsCommand.java
new file mode 100644
index 00000000000..c93322a340a
--- /dev/null
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropStatsCommand.java
@@ -0,0 +1,165 @@
+// 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.PartitionNames;
+import org.apache.doris.analysis.StmtType;
+import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.CatalogIf;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo;
+import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor;
+import org.apache.doris.qe.ConnectContext;
+import org.apache.doris.qe.StmtExecutor;
+
+import java.util.Set;
+
+/**
+ * Manually drop statistics for tables or partitions.
+ * Table or partition can be specified, if neither is specified,
+ * all statistics under the current database will be deleted.
+ * <p>
+ * syntax:
+ * DROP [EXPIRED] STATS [TableName [PARTITIONS(partitionNames)]];
+ */
+public class DropStatsCommand extends DropCommand {
+
+    public static final int MAX_IN_ELEMENT_TO_DELETE = 100;
+    private final TableNameInfo tableNameInfo;
+    private final Set<String> columnNames;
+    private final PartitionNames opPartitionNames;
+    private boolean isAllColumns;
+    private long catalogId;
+    private long dbId;
+    private long tblId;
+
+    public DropStatsCommand(TableNameInfo tableNameInfo,
+                            Set<String> columnNames,
+                            PartitionNames opPartitionNames) {
+        super(PlanType.DROP_STATS_COMMAND);
+        this.tableNameInfo = tableNameInfo;
+        this.columnNames = columnNames;
+        this.opPartitionNames = opPartitionNames;
+    }
+
+    public long getCatalogId() {
+        return catalogId;
+    }
+
+    public long getDbId() {
+        return dbId;
+    }
+
+    public long getTblId() {
+        return tblId;
+    }
+
+    public PartitionNames getOpPartitionNames() {
+        return opPartitionNames;
+    }
+
+    public Set<String> getColumnNames() {
+        return columnNames;
+    }
+
+    public boolean isAllColumns() {
+        return isAllColumns;
+    }
+
+    @Override
+    public void doRun(ConnectContext ctx, StmtExecutor executor) throws 
Exception {
+        validate(ctx);
+        ctx.getEnv().getAnalysisManager().dropStats(this);
+    }
+
+    private void validate(ConnectContext ctx) throws UserException {
+        if (!ConnectContext.get().getSessionVariable().enableStats) {
+            throw new UserException("Analyze function is forbidden, you should 
add `enable_stats=true`"
+                + "in your FE conf file");
+        }
+
+        if (tableNameInfo == null) {
+            throw new UserException("Should specify a valid table name.");
+        }
+        tableNameInfo.analyze(ctx);
+        String catalogName = tableNameInfo.getCtl();
+        String dbName = tableNameInfo.getDb();
+        String tblName = tableNameInfo.getTbl();
+        CatalogIf catalog = 
ctx.getEnv().getCatalogMgr().getCatalogOrAnalysisException(tableNameInfo.getCtl());
+        DatabaseIf db = catalog.getDbOrAnalysisException(dbName);
+        TableIf table = db.getTableOrAnalysisException(tblName);
+        tblId = table.getId();
+        dbId = db.getId();
+        catalogId = catalog.getId();
+        // check permission
+        checkAnalyzePriv(catalogName, db.getFullName(), table.getName());
+        // check columnNames
+        if (columnNames != null) {
+            if (columnNames.size() > MAX_IN_ELEMENT_TO_DELETE) {
+                throw new UserException("Can't delete more that " + 
MAX_IN_ELEMENT_TO_DELETE + " columns at one time.");
+            }
+            isAllColumns = false;
+            for (String cName : columnNames) {
+                if (table.getColumn(cName) == null) {
+                    ErrorReport.reportAnalysisException(
+                            ErrorCode.ERR_WRONG_COLUMN_NAME,
+                            "DROP",
+                            ConnectContext.get().getQualifiedUser(),
+                            ConnectContext.get().getRemoteIP(),
+                            cName);
+                }
+            }
+        } else {
+            isAllColumns = true;
+        }
+        if (opPartitionNames != null && opPartitionNames.getPartitionNames() 
!= null
+                && opPartitionNames.getPartitionNames().size() > 
MAX_IN_ELEMENT_TO_DELETE) {
+            throw new UserException("Can't delete more that " + 
MAX_IN_ELEMENT_TO_DELETE + " partitions at one time");
+        }
+    }
+
+    private void checkAnalyzePriv(String catalogName, String dbName, String 
tblName) throws AnalysisException {
+        if (!Env.getCurrentEnv().getAccessManager()
+                .checkTblPriv(ConnectContext.get(), catalogName, dbName, 
tblName,
+                    PrivPredicate.DROP)) {
+            ErrorReport.reportAnalysisException(
+                    ErrorCode.ERR_TABLEACCESS_DENIED_ERROR,
+                    "DROP",
+                    ConnectContext.get().getQualifiedUser(),
+                    ConnectContext.get().getRemoteIP(),
+                    dbName + "." + tblName);
+        }
+    }
+
+    @Override
+    public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+        return visitor.visitDropStatsCommand(this, context);
+    }
+
+    @Override
+    public StmtType stmtType() {
+        return StmtType.DROP;
+    }
+}
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 b730790fd18..8ad7f4441b8 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,11 +64,13 @@ 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.DropCachedStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropCatalogCommand;
 import 
org.apache.doris.nereids.trees.plans.commands.DropCatalogRecycleBinCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropConstraintCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropDatabaseCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropEncryptkeyCommand;
+import org.apache.doris.nereids.trees.plans.commands.DropExpiredStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropFileCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropFunctionCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropJobCommand;
@@ -77,6 +79,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.DropStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropStoragePolicyCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropTableCommand;
 import org.apache.doris.nereids.trees.plans.commands.DropUserCommand;
@@ -849,6 +852,18 @@ public interface CommandVisitor<R, C> {
         return visitCommand(showTableCommand, context);
     }
 
+    default R visitDropStatsCommand(DropStatsCommand dropStatsCommand, C 
context) {
+        return visitCommand(dropStatsCommand, context);
+    }
+
+    default R visitDropCachedStatsCommand(DropCachedStatsCommand 
dropCachedStatsCommand, C context) {
+        return visitCommand(dropCachedStatsCommand, context);
+    }
+
+    default R visitDropExpiredStatsCommand(DropExpiredStatsCommand 
dropExpiredStatsCommand, C context) {
+        return visitCommand(dropExpiredStatsCommand, context);
+    }
+
     default R visitShowIndexStatsCommand(ShowIndexStatsCommand 
showIndexStatsCommand, C context) {
         return visitCommand(showIndexStatsCommand, 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 af33c722c66..8263800ea7c 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,6 +60,7 @@ 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.DropStatsCommand;
 import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo;
 import org.apache.doris.persist.AnalyzeDeletionLog;
 import org.apache.doris.persist.TableStatsDeletionLog;
@@ -867,6 +868,34 @@ public class AnalysisManager implements Writable {
                 StatisticsUtil.getAnalyzeTimeout()));
     }
 
+    public void dropStats(DropStatsCommand dropStatsCommand) throws 
DdlException {
+        TableStatsMeta tableStats = 
findTableStatsStatus(dropStatsCommand.getTblId());
+        Set<String> cols = dropStatsCommand.getColumnNames();
+        PartitionNames partitionNames = dropStatsCommand.getOpPartitionNames();
+        long catalogId = dropStatsCommand.getCatalogId();
+        long dbId = dropStatsCommand.getDbId();
+        long tblId = dropStatsCommand.getTblId();
+        TableIf table = StatisticsUtil.findTable(catalogId, dbId, tblId);
+        // Remove tableMetaStats if drop whole table stats.
+        if ((cols == null || cols.isEmpty()) && (!table.isPartitionedTable() 
|| partitionNames == null
+                || partitionNames.isStar() || 
partitionNames.getPartitionNames() == null)) {
+            removeTableStats(tblId);
+            Env.getCurrentEnv().getEditLog().logDeleteTableStats(new 
TableStatsDeletionLog(tblId));
+        }
+        invalidateLocalStats(catalogId, dbId, tblId, cols, tableStats, 
partitionNames);
+        // Drop stats ddl is master only operation.
+        Set<String> partitions = null;
+        if (partitionNames != null && !partitionNames.isStar() && 
partitionNames.getPartitionNames() != null) {
+            partitions = new HashSet<>(partitionNames.getPartitionNames());
+        }
+        invalidateRemoteStats(catalogId, dbId, tblId, cols, partitions, false);
+        StatisticsRepository.dropStatistics(catalogId, dbId, tblId, cols, 
partitions);
+    }
+
+    public void dropExpiredStats() {
+        Env.getCurrentEnv().getStatisticsCleaner().clear();
+    }
+
     public void dropCachedStats(DropCachedStatsStmt stmt) {
         long catalogId = stmt.getCatalogIdId();
         long dbId = stmt.getDbId();
@@ -1005,7 +1034,7 @@ public class AnalysisManager implements Writable {
                                      TableStatsMeta tableStats, PartitionNames 
partitionNames) {
         TableIf table = StatisticsUtil.findTable(catalogId, dbId, tableId);
         StatisticsCache statsCache = Env.getCurrentEnv().getStatisticsCache();
-        if (columns == null) {
+        if (columns == null || columns.isEmpty()) {
             columns = table.getSchemaAllIndexes(false)
                 .stream().map(Column::getName).collect(Collectors.toSet());
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsRepository.java
 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsRepository.java
index f3a12cb4f8c..5ec13d72236 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsRepository.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsRepository.java
@@ -219,7 +219,7 @@ public class StatisticsRepository {
 
     public static void dropStatistics(
             long ctlId, long dbId, long tblId, Set<String> colNames, 
Set<String> partNames) throws DdlException {
-        if (colNames == null && partNames == null) {
+        if ((colNames == null || colNames.isEmpty()) && (partNames == null || 
partNames.isEmpty())) {
             executeDropStatisticsAllColumnSql(ctlId, dbId, tblId);
         } else {
             dropStatisticsByColAndPartitionName(ctlId, dbId, tblId, colNames, 
partNames);


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

Reply via email to