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 2ca19d15954 [Chore](nereids) remove AlterColumnStatsStmt (#51790)
2ca19d15954 is described below
commit 2ca19d159546b0367b339a81ac57f427b8acecb9
Author: yaoxiao <[email protected]>
AuthorDate: Wed Jun 18 09:41:06 2025 +0800
[Chore](nereids) remove AlterColumnStatsStmt (#51790)
---
fe/fe-core/src/main/cup/sql_parser.cup | 10 -
.../doris/analysis/AlterColumnStatsStmt.java | 230 ---------------------
.../main/java/org/apache/doris/qe/DdlExecutor.java | 4 -
.../doris/statistics/StatisticsRepository.java | 95 ---------
4 files changed, 339 deletions(-)
diff --git a/fe/fe-core/src/main/cup/sql_parser.cup
b/fe/fe-core/src/main/cup/sql_parser.cup
index f39a485d4a0..0bcc4af8f6b 100644
--- a/fe/fe-core/src/main/cup/sql_parser.cup
+++ b/fe/fe-core/src/main/cup/sql_parser.cup
@@ -1430,16 +1430,6 @@ alter_stmt ::=
{:
RESULT = new AlterTableStatsStmt(tbl, map);
:}
- | KW_ALTER KW_TABLE table_name:tbl KW_MODIFY KW_COLUMN ident:columnName
- KW_SET KW_STATS LPAREN key_value_map:map RPAREN
opt_partition_names:partitionNames
- {:
- RESULT = new AlterColumnStatsStmt(tbl, null, columnName, map,
partitionNames);
- :}
- | KW_ALTER KW_TABLE table_name:tbl KW_INDEX ident:idx KW_MODIFY KW_COLUMN
ident:columnName
- KW_SET KW_STATS LPAREN key_value_map:map RPAREN
opt_partition_names:partitionNames
- {:
- RESULT = new AlterColumnStatsStmt(tbl, idx, columnName, map,
partitionNames);
- :}
| KW_ALTER KW_TABLE table_name:tbl KW_SET LPAREN key_value_map:properties
RPAREN
{:
ModifyTablePropertiesClause clause = new
ModifyTablePropertiesClause(properties);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterColumnStatsStmt.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterColumnStatsStmt.java
deleted file mode 100644
index 3cb2f110181..00000000000
---
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterColumnStatsStmt.java
+++ /dev/null
@@ -1,230 +0,0 @@
-// 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.analysis;
-
-import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.DatabaseIf;
-import org.apache.doris.catalog.Env;
-import org.apache.doris.catalog.OlapTable;
-import org.apache.doris.catalog.Partition;
-import org.apache.doris.catalog.PartitionType;
-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.common.util.PrintableMap;
-import org.apache.doris.datasource.CatalogIf;
-import org.apache.doris.mysql.privilege.PrivPredicate;
-import org.apache.doris.qe.ConnectContext;
-import org.apache.doris.statistics.ColumnStatistic;
-import org.apache.doris.statistics.StatsType;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * Manually inject statistics for columns.
- * Only OLAP table statistics are supported.
- *
- * Syntax:
- * ALTER TABLE table_name MODIFY COLUMN columnName
- * SET STATS ('k1' = 'v1', ...);
- *
- * e.g.
- * ALTER TABLE stats_test.example_tbl MODIFY COLUMN age
- * SET STATS ('row_count'='6001215');
- *
- * Note: partition stats injection is mainly convenient for test cost
estimation,
- * and can be removed after the related functions are completed.
- */
-public class AlterColumnStatsStmt extends DdlStmt implements
NotFallbackInParser {
-
- private static final ImmutableSet<StatsType> CONFIGURABLE_PROPERTIES_SET =
new ImmutableSet.Builder<StatsType>()
- .add(StatsType.ROW_COUNT)
- .add(ColumnStatistic.NDV)
- .add(ColumnStatistic.AVG_SIZE)
- .add(ColumnStatistic.MAX_SIZE)
- .add(ColumnStatistic.NUM_NULLS)
- .add(ColumnStatistic.MIN_VALUE)
- .add(ColumnStatistic.MAX_VALUE)
- .add(StatsType.DATA_SIZE)
- .build();
-
- private final TableName tableName;
- private final String indexName;
- private final String columnName;
- private final Map<String, String> properties;
- private final PartitionNames optPartitionNames;
-
- private final List<Long> partitionIds = Lists.newArrayList();
- private final Map<StatsType, String> statsTypeToValue = Maps.newHashMap();
-
- private long indexId = -1;
-
- public AlterColumnStatsStmt(TableName tableName, String indexName, String
columnName,
- Map<String, String> properties, PartitionNames optPartitionNames) {
- this.tableName = tableName;
- this.indexName = indexName;
- this.columnName = columnName;
- this.properties = properties == null ? Collections.emptyMap() :
properties;
- this.optPartitionNames = optPartitionNames;
- }
-
- public TableName getTableName() {
- return tableName;
- }
-
- public String getColumnName() {
- return columnName;
- }
-
- public long getIndexId() {
- return indexId;
- }
-
- public List<Long> getPartitionIds() {
- return partitionIds;
- }
-
- public Map<StatsType, String> getStatsTypeToValue() {
- return statsTypeToValue;
- }
-
- @Override
- public void analyze(Analyzer analyzer) 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");
- }
- super.analyze(analyzer);
-
- // check table name
- tableName.analyze(analyzer);
-
- // check partition & column
- checkPartitionAndColumn();
-
- // check properties
- Optional<StatsType> optional =
properties.keySet().stream().map(StatsType::fromString)
- .filter(statsType ->
!CONFIGURABLE_PROPERTIES_SET.contains(statsType))
- .findFirst();
- if (optional.isPresent()) {
- throw new AnalysisException(optional.get() + " is invalid
statistics");
- }
-
- if (!properties.containsKey(StatsType.ROW_COUNT.getValue())) {
- throw new AnalysisException("Set column stats must set row_count.
e.g. 'row_count'='5'");
- }
-
- // get statsTypeToValue
- properties.forEach((key, value) -> {
- StatsType statsType = StatsType.fromString(key);
- statsTypeToValue.put(statsType, value);
- });
- }
-
- @Override
- public void checkPriv() throws AnalysisException {
- if (!Env.getCurrentEnv().getAccessManager()
- .checkTblPriv(ConnectContext.get(), tableName.getCtl(),
tableName.getDb(),
- tableName.getTbl(), PrivPredicate.ALTER)) {
-
ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR,
"ALTER COLUMN STATS",
- ConnectContext.get().getQualifiedUser(),
ConnectContext.get().getRemoteIP(),
- tableName.getDb() + ": " + tableName.getTbl());
- }
- }
-
- private void checkPartitionAndColumn() throws AnalysisException {
- CatalogIf catalog =
analyzer.getEnv().getCatalogMgr().getCatalog(tableName.getCtl());
- DatabaseIf db = catalog.getDbOrAnalysisException(tableName.getDb());
- TableIf table = db.getTableOrAnalysisException(tableName.getTbl());
-
- if (indexName != null) {
- if (!(table instanceof OlapTable)) {
- throw new AnalysisException("Only OlapTable support alter
index stats. "
- + "Table " + table.getName() + " is not OlapTable.");
- }
- OlapTable olapTable = (OlapTable) table;
- Long idxId = olapTable.getIndexIdByName(indexName);
- if (idxId == null) {
- throw new AnalysisException("Index " + indexName + " not exist
in table " + table.getName());
- }
- indexId = idxId;
- }
- Column column = table.getColumn(columnName);
- if (column == null || !column.getName().equals(columnName)) {
- ErrorReport.reportAnalysisException(ErrorCode.ERR_BAD_FIELD_ERROR,
columnName, table.getName());
- }
-
- if (optPartitionNames != null && table instanceof OlapTable) {
- OlapTable olapTable = (OlapTable) table;
- if
(olapTable.getPartitionInfo().getType().equals(PartitionType.UNPARTITIONED)) {
- throw new AnalysisException("Not a partitioned table: " +
olapTable.getName());
- }
-
- optPartitionNames.analyze(analyzer);
- List<String> partitionNames =
optPartitionNames.getPartitionNames();
- for (String partitionName : partitionNames) {
- Partition partition = olapTable.getPartition(partitionName);
- if (partition == null) {
- throw new AnalysisException("Partition does not exist: " +
partitionName);
- }
- partitionIds.add(partition.getId());
- }
- }
- }
-
- @Override
- public String toSql() {
- StringBuilder sb = new StringBuilder();
- sb.append("ALTER TABLE ");
- sb.append(tableName.toSql());
- if (indexName != null) {
- sb.append(" INDEX ");
- sb.append(indexName);
- }
- sb.append(" MODIFY COLUMN ");
- sb.append(columnName);
- sb.append(" SET STATS ");
- sb.append("(");
- sb.append(new PrintableMap<>(properties,
- " = ", true, false));
- sb.append(")");
- if (optPartitionNames != null) {
- sb.append(" ");
- sb.append(optPartitionNames.toSql());
- }
- return sb.toString();
- }
-
- public String getValue(StatsType statsType) {
- return statsTypeToValue.get(statsType);
- }
-
- @Override
- public StmtType stmtType() {
- return StmtType.ALTER;
- }
-}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
index 6092c244a53..2deb55bf1bd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
@@ -33,7 +33,6 @@ import org.apache.doris.analysis.AlterCatalogCommentStmt;
import org.apache.doris.analysis.AlterCatalogNameStmt;
import org.apache.doris.analysis.AlterCatalogPropertyStmt;
import org.apache.doris.analysis.AlterColocateGroupStmt;
-import org.apache.doris.analysis.AlterColumnStatsStmt;
import org.apache.doris.analysis.AlterDatabasePropertyStmt;
import org.apache.doris.analysis.AlterDatabaseQuotaStmt;
import org.apache.doris.analysis.AlterDatabaseRename;
@@ -138,7 +137,6 @@ import org.apache.doris.load.loadv2.JobState;
import org.apache.doris.load.loadv2.LoadJob;
import org.apache.doris.mysql.privilege.Auth;
import org.apache.doris.persist.CleanQueryStatsInfo;
-import org.apache.doris.statistics.StatisticsRepository;
import com.google.common.collect.Lists;
import org.apache.logging.log4j.LogManager;
@@ -180,8 +178,6 @@ public class DdlExecutor {
env.createMaterializedView((CreateMaterializedViewStmt) ddlStmt);
} else if (ddlStmt instanceof AlterTableStmt) {
env.alterTable((AlterTableStmt) ddlStmt);
- } else if (ddlStmt instanceof AlterColumnStatsStmt) {
- StatisticsRepository.alterColumnStatistics((AlterColumnStatsStmt)
ddlStmt);
} else if (ddlStmt instanceof AlterViewStmt) {
env.alterView((AlterViewStmt) ddlStmt);
} else if (ddlStmt instanceof CancelAlterTableStmt) {
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 5ec13d72236..9539b415a26 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
@@ -17,8 +17,6 @@
package org.apache.doris.statistics;
-import org.apache.doris.analysis.AlterColumnStatsStmt;
-import org.apache.doris.analysis.TableName;
import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.Env;
import org.apache.doris.catalog.OlapTable;
@@ -407,99 +405,6 @@ public class StatisticsRepository {
}
}
- public static void alterColumnStatistics(AlterColumnStatsStmt
alterColumnStatsStmt) throws Exception {
- TableName tableName = alterColumnStatsStmt.getTableName();
- List<Long> partitionIds = alterColumnStatsStmt.getPartitionIds();
- DBObjects objects =
StatisticsUtil.convertTableNameToObjects(tableName);
- String rowCount = alterColumnStatsStmt.getValue(StatsType.ROW_COUNT);
- String ndv = alterColumnStatsStmt.getValue(StatsType.NDV);
- String nullCount = alterColumnStatsStmt.getValue(StatsType.NUM_NULLS);
- String min = alterColumnStatsStmt.getValue(StatsType.MIN_VALUE);
- String max = alterColumnStatsStmt.getValue(StatsType.MAX_VALUE);
- String dataSize = alterColumnStatsStmt.getValue(StatsType.DATA_SIZE);
- long indexId = alterColumnStatsStmt.getIndexId();
- if (rowCount == null) {
- throw new RuntimeException("Row count is null.");
- }
- ColumnStatisticBuilder builder = new
ColumnStatisticBuilder(Double.parseDouble(rowCount));
- String colName = alterColumnStatsStmt.getColumnName();
- Column column = objects.table.getColumn(colName);
- if (ndv != null) {
- double dNdv = Double.parseDouble(ndv);
- builder.setNdv(dNdv);
- builder.setOriginal(null);
- }
- if (nullCount != null) {
- builder.setNumNulls(Double.parseDouble(nullCount));
- }
- if (min != null) {
- builder.setMinExpr(StatisticsUtil.readableValue(column.getType(),
min));
-
builder.setMinValue(StatisticsUtil.convertToDouble(column.getType(), min));
- }
- if (max != null) {
- builder.setMaxExpr(StatisticsUtil.readableValue(column.getType(),
max));
-
builder.setMaxValue(StatisticsUtil.convertToDouble(column.getType(), max));
- }
- if (dataSize != null) {
- double size = Double.parseDouble(dataSize);
- double rows = Double.parseDouble(rowCount);
- if (size > 0) {
- builder.setDataSize(size);
- if (rows > 0) {
- builder.setAvgSizeByte(size / rows);
- }
- }
- }
-
- ColumnStatistic columnStatistic = builder.build();
- Map<String, String> params = new HashMap<>();
- params.put("id", constructId(objects.table.getId(), indexId, colName));
- params.put("catalogId", String.valueOf(objects.catalog.getId()));
- params.put("dbId", String.valueOf(objects.db.getId()));
- params.put("idxId", String.valueOf(indexId));
- params.put("tblId", String.valueOf(objects.table.getId()));
- params.put("colId", String.valueOf(colName));
- params.put("count", String.valueOf(columnStatistic.count));
- params.put("ndv", String.valueOf(columnStatistic.ndv));
- params.put("nullCount", String.valueOf(columnStatistic.numNulls));
- params.put("min", min == null ? "NULL" : "'" +
StatisticsUtil.escapeSQL(min) + "'");
- params.put("max", max == null ? "NULL" : "'" +
StatisticsUtil.escapeSQL(max) + "'");
- params.put("dataSize", String.valueOf(columnStatistic.dataSize));
-
- if (partitionIds.isEmpty()) {
- // update table granularity statistics
- params.put("partId", "NULL");
- StatisticsUtil.execUpdate(INSERT_INTO_COLUMN_STATISTICS_FOR_ALTER,
params);
- ColStatsData data = new
ColStatsData(constructId(objects.table.getId(), indexId, colName),
- objects.catalog.getId(), objects.db.getId(),
objects.table.getId(), indexId, colName,
- null, columnStatistic);
- Env.getCurrentEnv().getStatisticsCache().syncColStats(data);
- AnalysisInfo mockedJobInfo = new AnalysisInfoBuilder()
- .setTblUpdateTime(objects.table.getUpdateTime())
- .setColName("")
- .setRowCount((long) Double.parseDouble(rowCount))
- .setJobColumns(Sets.newHashSet())
- .setUserInject(true)
- .setJobType(AnalysisInfo.JobType.MANUAL)
- .build();
- if (objects.table instanceof OlapTable) {
- indexId = indexId == -1 ? ((OlapTable)
objects.table).getBaseIndexId() : indexId;
- mockedJobInfo.addIndexRowCount(indexId, (long)
Double.parseDouble(rowCount));
- }
-
Env.getCurrentEnv().getAnalysisManager().updateTableStatsForAlterStats(mockedJobInfo,
objects.table);
- } else {
- // update partition granularity statistics
- for (Long partitionId : partitionIds) {
- HashMap<String, String> partParams = Maps.newHashMap(params);
- partParams.put("partId", String.valueOf(partitionId));
-
StatisticsUtil.execUpdate(INSERT_INTO_COLUMN_STATISTICS_FOR_ALTER, partParams);
- // TODO cache partition granular statistics
- // Env.getCurrentEnv().getStatisticsCache()
- // .updateColStatsCache(partitionId, -1, colName,
builder.build());
- }
- }
- }
-
public static List<ResultRow> fetchRecentStatsUpdatedCol() {
return
StatisticsUtil.execStatisticQuery(FETCH_RECENT_STATS_UPDATED_COL);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]