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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]