From 9e76592297d7d20d6b46e9531b00cbd9d220e5c8 Mon Sep 17 00:00:00 2001 From: Jibing-Li <64681310+Jibing-Li@users.noreply.github.com> Date: Sun, 4 Feb 2024 14:27:09 +0800 Subject: [PATCH] Support analyze materialized view. (#30540) --- .../apache/doris/analysis/AnalyzeTblStmt.java | 44 +-- .../apache/doris/analysis/DropStatsStmt.java | 2 +- .../doris/analysis/ShowAnalyzeTaskStatus.java | 1 + .../doris/analysis/ShowColumnStatsStmt.java | 8 +- .../org/apache/doris/catalog/OlapTable.java | 60 +++- .../java/org/apache/doris/catalog/Table.java | 5 + .../org/apache/doris/catalog/TableIf.java | 2 + .../doris/catalog/external/ExternalTable.java | 5 + .../doris/nereids/minidump/MinidumpUtils.java | 3 +- .../nereids/rules/analysis/BindRelation.java | 8 +- .../doris/nereids/stats/StatsCalculator.java | 3 +- .../trees/plans/logical/LogicalOlapScan.java | 5 +- .../org/apache/doris/qe/ShowExecutor.java | 66 +++-- .../apache/doris/statistics/AnalysisInfo.java | 17 +- .../apache/doris/statistics/AnalysisJob.java | 3 + .../doris/statistics/AnalysisManager.java | 53 +++- .../doris/statistics/BaseAnalysisTask.java | 6 +- .../statistics/ExternalAnalysisTask.java | 1 + .../doris/statistics/OlapAnalysisTask.java | 82 ++++-- .../doris/statistics/OlapScanStatsDerive.java | 4 +- .../statistics/StatisticsAutoCollector.java | 5 +- .../doris/statistics/StatisticsCache.java | 13 +- .../doris/statistics/StatisticsCacheKey.java | 8 - .../doris/statistics/StatisticsCleaner.java | 2 +- .../statistics/StatisticsRepository.java | 20 +- .../doris/statistics/util/StatisticsUtil.java | 20 ++ .../apache/doris/statistics/CacheTest.java | 12 +- .../doris/statistics/HMSAnalysisTaskTest.java | 2 +- .../statistics/OlapAnalysisTaskTest.java | 6 +- .../StatisticsAutoCollectorTest.java | 21 +- .../test_hive_statistics_all_type_p0.groovy | 112 ++++---- .../hive/test_hive_statistics_p0.groovy | 166 +++++------ .../jdbc/test_mysql_jdbc_statistics.groovy | 24 +- .../hive/test_hive_statistic.groovy | 266 +++++++++--------- .../hive/test_hive_statistic_auto.groovy | 36 +-- .../hive/test_hive_statistic_cache.groovy | 226 +++++++-------- .../hive/test_hive_statistic_clean.groovy | 84 +++--- .../hive/test_hive_statistic_sample.groovy | 108 +++---- .../hive/test_hive_statistics_from_hms.groovy | 208 +++++++------- .../suites/statistics/analyze_stats.groovy | 147 +++++----- .../statistics/test_agg_complex_type.groovy | 14 +- .../suites/statistics/test_analyze_mv.groovy | 256 +++++++++++++++++ .../statistics/test_basic_statistics.groovy | 36 +-- 43 files changed, 1291 insertions(+), 879 deletions(-) create mode 100644 regression-test/suites/statistics/test_analyze_mv.groovy diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeTblStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeTblStmt.java index a88cd137ad..fe4d17ea84 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeTblStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeTblStmt.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.Column; import org.apache.doris.catalog.Database; import org.apache.doris.catalog.DatabaseIf; import org.apache.doris.catalog.Env; +import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.TableIf; import org.apache.doris.catalog.View; import org.apache.doris.catalog.external.ExternalTable; @@ -147,26 +148,26 @@ public class AnalyzeTblStmt extends AnalyzeStmt { } checkAnalyzePriv(tableName.getDb(), tableName.getTbl()); if (columnNames == null) { - // Filter unsupported type columns. - columnNames = table.getBaseSchema(false).stream() + columnNames = table.getSchemaAllIndexes(false).stream() + // Filter unsupported type columns. .filter(c -> !StatisticsUtil.isUnsupportedType(c.getType())) .map(Column::getName) .collect(Collectors.toList()); - } - table.readLock(); - try { - List baseSchema = table.getBaseSchema(false) - .stream().map(Column::getName).collect(Collectors.toList()); - Optional optional = columnNames.stream() - .filter(entity -> !baseSchema.contains(entity)).findFirst(); - if (optional.isPresent()) { - String columnName = optional.get(); - ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_COLUMN_NAME, - columnName, FeNameFormat.getColumnNameRegex()); + } else { + table.readLock(); + try { + List baseSchema = table.getSchemaAllIndexes(false) + .stream().map(Column::getName).collect(Collectors.toList()); + Optional optional = columnNames.stream() + .filter(entity -> !baseSchema.contains(entity)).findFirst(); + if (optional.isPresent()) { + String columnName = optional.get(); + ErrorReport.reportAnalysisException(ErrorCode.ERR_BAD_FIELD_ERROR, columnName, tableName.getTbl()); + } + checkColumn(); + } finally { + table.readUnlock(); } - checkColumn(); - } finally { - table.readUnlock(); } analyzeProperties.check(); @@ -187,7 +188,9 @@ public class AnalyzeTblStmt extends AnalyzeStmt { private void checkColumn() throws AnalysisException { boolean containsUnsupportedTytpe = false; for (String colName : columnNames) { - Column column = table.getColumn(colName); + Column column = table instanceof OlapTable + ? ((OlapTable) table).getVisibleColumn(colName) + : table.getColumn(colName); if (column == null) { ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_COLUMN_NAME, colName, FeNameFormat.getColumnNameRegex()); @@ -200,7 +203,9 @@ public class AnalyzeTblStmt extends AnalyzeStmt { if (ConnectContext.get() == null || !ConnectContext.get().getSessionVariable().enableAnalyzeComplexTypeColumn) { columnNames = columnNames.stream() - .filter(c -> !StatisticsUtil.isUnsupportedType(table.getColumn(c).getType())) + .filter(c -> !StatisticsUtil.isUnsupportedType(table instanceof OlapTable + ? ((OlapTable) table).getVisibleColumn(c).getType() + : table.getColumn(c).getType())) .collect(Collectors.toList()); } else { throw new AnalysisException( @@ -233,8 +238,7 @@ public class AnalyzeTblStmt extends AnalyzeStmt { } public Set getColumnNames() { - return columnNames == null ? table.getBaseSchema(false) - .stream().map(Column::getName).collect(Collectors.toSet()) : Sets.newHashSet(columnNames); + return Sets.newHashSet(columnNames); } public Set getPartitionNames() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropStatsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropStatsStmt.java index 5e3bd20c0f..c0ba720c13 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropStatsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropStatsStmt.java @@ -122,7 +122,7 @@ public class DropStatsStmt extends DdlStmt { } } else { isAllColumns = true; - columnNames = table.getColumns().stream().map(Column::getName).collect(Collectors.toSet()); + columnNames = table.getSchemaAllIndexes(false).stream().map(Column::getName).collect(Collectors.toSet()); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeTaskStatus.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeTaskStatus.java index e5e5cde734..364e3d0a4f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeTaskStatus.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAnalyzeTaskStatus.java @@ -32,6 +32,7 @@ public class ShowAnalyzeTaskStatus extends ShowStmt { ShowResultSetMetaData.builder() .addColumn(new Column("task_id", ScalarType.createVarchar(100))) .addColumn(new Column("col_name", ScalarType.createVarchar(1000))) + .addColumn(new Column("index_name", ScalarType.createVarchar(1000))) .addColumn(new Column("message", ScalarType.createVarchar(1000))) .addColumn(new Column("last_state_change_time", ScalarType.createVarchar(1000))) .addColumn(new Column("time_cost_in_ms", ScalarType.createVarchar(1000))) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java index f974d8f572..f858263b9d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowColumnStatsStmt.java @@ -48,6 +48,7 @@ public class ShowColumnStatsStmt extends ShowStmt { private static final ImmutableList TITLE_NAMES = new ImmutableList.Builder() .add("column_name") + .add("index_name") .add("count") .add("ndv") .add("num_null") @@ -135,7 +136,7 @@ public class ShowColumnStatsStmt extends ShowStmt { return table; } - public ShowResultSet constructResultSet(List> columnStatistics) { + public ShowResultSet constructResultSet(List, ColumnStatistic>> columnStatistics) { List> result = Lists.newArrayList(); columnStatistics.forEach(p -> { if (p.second.isUnKnown) { @@ -143,7 +144,8 @@ public class ShowColumnStatsStmt extends ShowStmt { } List row = Lists.newArrayList(); - row.add(p.first); + row.add(p.first.first); + row.add(p.first.second); row.add(String.valueOf(p.second.count)); row.add(String.valueOf(p.second.ndv)); row.add(String.valueOf(p.second.numNulls)); @@ -152,7 +154,7 @@ public class ShowColumnStatsStmt extends ShowStmt { row.add(String.valueOf(p.second.minExpr == null ? "N/A" : p.second.minExpr.toSql())); row.add(String.valueOf(p.second.maxExpr == null ? "N/A" : p.second.maxExpr.toSql())); ColStatsMeta colStatsMeta = Env.getCurrentEnv().getAnalysisManager().findColStatsMeta(table.getId(), - p.first); + p.first.first); row.add(String.valueOf(colStatsMeta == null ? "N/A" : colStatsMeta.analysisMethod)); row.add(String.valueOf(colStatsMeta == null ? "N/A" : colStatsMeta.analysisType)); row.add(String.valueOf(colStatsMeta == null ? "N/A" : colStatsMeta.jobType)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index ee47d7616e..bc847dd22c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -21,6 +21,7 @@ import org.apache.doris.alter.MaterializedViewHandler; import org.apache.doris.analysis.AggregateInfo; import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.ColumnDef; +import org.apache.doris.analysis.CreateMaterializedViewStmt; import org.apache.doris.analysis.DataSortInfo; import org.apache.doris.analysis.Expr; import org.apache.doris.analysis.SlotDescriptor; @@ -492,6 +493,17 @@ public class OlapTable extends Table implements MTMVRelatedTableIf { return null; } + public List getMvColumnIndexIds(String columnName) { + List ids = Lists.newArrayList(); + for (MaterializedIndexMeta meta : getVisibleIndexIdToMeta().values()) { + Column target = meta.getColumnByDefineName(columnName); + if (target != null) { + ids.add(meta.getIndexId()); + } + } + return ids; + } + @Override public long getUpdateTime() { long updateTime = tempPartitions.getUpdateTime(); @@ -698,6 +710,15 @@ public class OlapTable extends Table implements MTMVRelatedTableIf { } } + @Override + public List getSchemaAllIndexes(boolean full) { + List columns = Lists.newArrayList(); + for (Long indexId : indexIdToMeta.keySet()) { + columns.addAll(getSchemaByIndexId(indexId, full)); + } + return columns; + } + public List getBaseSchemaKeyColumns() { return getKeyColumnsByIndexId(baseIndexId); } @@ -1207,25 +1228,29 @@ public class OlapTable extends Table implements MTMVRelatedTableIf { @Override public Map> findReAnalyzeNeededPartitions() { - TableIf table = this; - TableStatsMeta tableStats = Env.getCurrentEnv().getAnalysisManager().findTableStatsStatus(table.getId()); - Set allPartitions = table.getPartitionNames().stream().map(table::getPartition) + TableStatsMeta tableStats = Env.getCurrentEnv().getAnalysisManager().findTableStatsStatus(getId()); + Set allPartitions = getPartitionNames().stream().map(this::getPartition) .filter(Partition::hasData).map(Partition::getName).collect(Collectors.toSet()); if (tableStats == null) { - return table.getBaseSchema().stream().filter(c -> !StatisticsUtil.isUnsupportedType(c.getType())) - .collect(Collectors.toMap(Column::getName, v -> allPartitions)); + Map> ret = Maps.newHashMap(); + for (Column col : getSchemaAllIndexes(false)) { + if (StatisticsUtil.isUnsupportedType(col.getType())) { + continue; + } + ret.put(col.getName(), allPartitions); + } + return ret; } Map> colToPart = new HashMap<>(); - for (Column col : table.getBaseSchema()) { + for (Column col : getSchemaAllIndexes(false)) { if (StatisticsUtil.isUnsupportedType(col.getType())) { continue; } long lastUpdateTime = tableStats.findColumnLastUpdateTime(col.getName()); - Set partitions = table.getPartitionNames().stream() - .map(table::getPartition) + Set partitions = getPartitionNames().stream() + .map(this::getPartition) .filter(Partition::hasData) - .filter(partition -> - partition.getVisibleVersionTime() >= lastUpdateTime).map(Partition::getName) + .filter(partition -> partition.getVisibleVersionTime() >= lastUpdateTime).map(Partition::getName) .collect(Collectors.toSet()); colToPart.put(col.getName(), partitions); } @@ -1241,6 +1266,15 @@ public class OlapTable extends Table implements MTMVRelatedTableIf { return rowCount; } + public long getRowCountForIndex(long indexId) { + long rowCount = 0; + for (Map.Entry entry : idToPartition.entrySet()) { + MaterializedIndex index = entry.getValue().getIndex(indexId); + rowCount += index == null ? 0 : index.getRowCount(); + } + return rowCount; + } + @Override public long getCacheRowCount() { return getRowCount(); @@ -2472,8 +2506,12 @@ public class OlapTable extends Table implements MTMVRelatedTableIf { @Override public boolean isPartitionColumn(String columnName) { + if (columnName.startsWith(CreateMaterializedViewStmt.MATERIALIZED_VIEW_NAME_PREFIX)) { + columnName = columnName.substring(CreateMaterializedViewStmt.MATERIALIZED_VIEW_NAME_PREFIX.length()); + } + String finalColumnName = columnName; return getPartitionInfo().getPartitionColumns().stream() - .anyMatch(c -> c.getName().equalsIgnoreCase(columnName)); + .anyMatch(c -> c.getName().equalsIgnoreCase(finalColumnName)); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java index 7294577fc5..a5f2a9e55e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java @@ -356,6 +356,11 @@ public abstract class Table extends MetaObject implements Writable, TableIf { return getBaseSchema(Util.showHiddenColumns()); } + @Override + public List getSchemaAllIndexes(boolean full) { + return getBaseSchema(); + } + public List getBaseSchema(boolean full) { if (full) { return fullSchema; diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java index 67efd98fec..d0985aa692 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java @@ -94,6 +94,8 @@ public interface TableIf { List getBaseSchema(); + List getSchemaAllIndexes(boolean full); + default List getBaseSchemaOrEmpty() { try { return getBaseSchema(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/ExternalTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/ExternalTable.java index 1af013fcbf..d8e89aab48 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/ExternalTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/ExternalTable.java @@ -256,6 +256,11 @@ public class ExternalTable implements TableIf, Writable, GsonPostProcessable { return getFullSchema(); } + @Override + public List getSchemaAllIndexes(boolean full) { + return getBaseSchema(); + } + @Override public List getBaseSchema(boolean full) { return getFullSchema(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java index 4187e1fc4c..327b0aa6ff 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java @@ -241,8 +241,9 @@ public class MinidumpUtils { } private static ColumnStatistic getColumnStatistic(TableIf table, String colName) { + // TODO. Get index id for materialized view. return Env.getCurrentEnv().getStatisticsCache().getColumnStatistics( - table.getDatabase().getCatalog().getId(), table.getDatabase().getId(), table.getId(), colName); + table.getDatabase().getCatalog().getId(), table.getDatabase().getId(), table.getId(), -1, colName); } private static Histogram getColumnHistogram(TableIf table, String colName) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java index c955aa5b17..04bac9915b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java @@ -18,6 +18,7 @@ package org.apache.doris.nereids.rules.analysis; import org.apache.doris.catalog.Column; +import org.apache.doris.catalog.KeysType; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.TableIf; @@ -197,9 +198,14 @@ public class BindRelation extends OneAnalysisRuleFactory { throw new AnalysisException("Table " + olapTable.getName() + " doesn't have materialized view " + indexName.get()); } + PreAggStatus preAggStatus + = olapTable.getIndexMetaByIndexId(indexId).getKeysType().equals(KeysType.DUP_KEYS) + ? PreAggStatus.on() + : PreAggStatus.off("For direct index scan."); + scan = new LogicalOlapScan(unboundRelation.getRelationId(), (OlapTable) table, ImmutableList.of(tableQualifier.get(1)), tabletIds, indexId, - unboundRelation.getHints(), unboundRelation.getTableSample()); + preAggStatus, unboundRelation.getHints(), unboundRelation.getTableSample()); } else { scan = new LogicalOlapScan(unboundRelation.getRelationId(), (OlapTable) table, ImmutableList.of(tableQualifier.get(1)), tabletIds, unboundRelation.getHints(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java index 76587bcffb..cf1803705c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java @@ -633,8 +633,9 @@ public class StatsCalculator extends DefaultPlanVisitor { return ColumnStatistic.UNKNOWN; } } else { + // TODO. Get index id for materialized view. return Env.getCurrentEnv().getStatisticsCache().getColumnStatistics( - catalogId, dbId, table.getId(), colName); + catalogId, dbId, table.getId(), -1, colName); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java index bcf80fd899..9adef45345 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java @@ -145,10 +145,11 @@ public class LogicalOlapScan extends LogicalCatalogRelation implements OlapScan } public LogicalOlapScan(RelationId id, OlapTable table, List qualifier, List tabletIds, - long selectedIndexId, List hints, Optional tableSample) { + long selectedIndexId, PreAggStatus preAggStatus, List hints, + Optional tableSample) { this(id, table, qualifier, Optional.empty(), Optional.empty(), table.getPartitionIds(), false, tabletIds, - selectedIndexId, true, PreAggStatus.off("For direct index scan."), + selectedIndexId, true, preAggStatus, ImmutableList.of(), hints, Maps.newHashMap(), tableSample, true, false); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java index c6cb9dcb05..66e155a2e8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java @@ -2502,43 +2502,54 @@ public class ShowExecutor { ShowColumnStatsStmt showColumnStatsStmt = (ShowColumnStatsStmt) stmt; TableName tableName = showColumnStatsStmt.getTableName(); TableIf tableIf = showColumnStatsStmt.getTable(); - List> columnStatistics = new ArrayList<>(); + List, ColumnStatistic>> columnStatistics = new ArrayList<>(); Set columnNames = showColumnStatsStmt.getColumnNames(); PartitionNames partitionNames = showColumnStatsStmt.getPartitionNames(); boolean showCache = showColumnStatsStmt.isCached(); for (String colName : columnNames) { - // Show column statistics in columnStatisticsCache. For validation. - if (showCache) { - ColumnStatistic columnStatistic = Env.getCurrentEnv().getStatisticsCache().getColumnStatistics( - tableIf.getDatabase().getCatalog().getId(), - tableIf.getDatabase().getId(), tableIf.getId(), colName); - columnStatistics.add(Pair.of(colName, columnStatistic)); - } else if (partitionNames == null) { - ColumnStatistic columnStatistic = - StatisticsRepository.queryColumnStatisticsByName(tableIf.getId(), colName); - columnStatistics.add(Pair.of(colName, columnStatistic)); + // Olap base index use -1 as index id. + List indexIds = Lists.newArrayList(); + if (StatisticsUtil.isMvColumn(tableIf, colName)) { + OlapTable olapTable = (OlapTable) tableIf; + indexIds = olapTable.getMvColumnIndexIds(colName); } else { - columnStatistics.addAll(StatisticsRepository.queryColumnStatisticsByPartitions(tableName, - colName, showColumnStatsStmt.getPartitionNames().getPartitionNames()) - .stream().map(s -> Pair.of(colName, s)) - .collect(Collectors.toList())); + indexIds.add(-1L); + } + for (long indexId : indexIds) { + String indexName = "N/A"; + if (indexId != -1) { + indexName = ((OlapTable) tableIf).getIndexNameById(indexId); + if (indexName == null) { + continue; + } + } + // Show column statistics in columnStatisticsCache. + if (showCache) { + ColumnStatistic columnStatistic = Env.getCurrentEnv().getStatisticsCache().getColumnStatistics( + tableIf.getDatabase().getCatalog().getId(), + tableIf.getDatabase().getId(), tableIf.getId(), indexId, colName); + columnStatistics.add(Pair.of(Pair.of(colName, indexName), columnStatistic)); + } else if (partitionNames == null) { + ColumnStatistic columnStatistic = + StatisticsRepository.queryColumnStatisticsByName(tableIf.getId(), indexId, colName); + columnStatistics.add(Pair.of(Pair.of(colName, indexName), columnStatistic)); + } else { + String finalIndexName = indexName; + columnStatistics.addAll(StatisticsRepository.queryColumnStatisticsByPartitions(tableName, + colName, showColumnStatsStmt.getPartitionNames().getPartitionNames()) + .stream().map(s -> Pair.of(Pair.of(colName, finalIndexName), s)) + .collect(Collectors.toList())); + } } - } resultSet = showColumnStatsStmt.constructResultSet(columnStatistics); } public void handleShowColumnHist() { + // TODO: support histogram in the future. ShowColumnHistStmt showColumnHistStmt = (ShowColumnHistStmt) stmt; - TableIf tableIf = showColumnHistStmt.getTable(); - Set columnNames = showColumnHistStmt.getColumnNames(); - - List> columnStatistics = columnNames.stream() - .map(colName -> Pair.of(colName, - StatisticsRepository.queryColumnHistogramByName(tableIf.getId(), colName))) - .collect(Collectors.toList()); - + List> columnStatistics = Lists.newArrayList(); resultSet = showColumnHistStmt.constructResultSet(columnStatistics); } @@ -2921,12 +2932,19 @@ public class ShowExecutor { private void handleShowAnalyzeTaskStatus() { ShowAnalyzeTaskStatus showStmt = (ShowAnalyzeTaskStatus) stmt; + AnalysisInfo jobInfo = Env.getCurrentEnv().getAnalysisManager().findJobInfo(showStmt.getJobId()); + TableIf table = StatisticsUtil.findTable(jobInfo.catalogId, jobInfo.dbId, jobInfo.tblId); List analysisInfos = Env.getCurrentEnv().getAnalysisManager().findTasks(showStmt.getJobId()); List> rows = new ArrayList<>(); for (AnalysisInfo analysisInfo : analysisInfos) { List row = new ArrayList<>(); row.add(String.valueOf(analysisInfo.taskId)); row.add(analysisInfo.colName); + if (StatisticsUtil.isMvColumn(table, analysisInfo.colName)) { + row.add(((OlapTable) table).getIndexNameById(analysisInfo.indexId)); + } else { + row.add("N/A"); + } row.add(analysisInfo.message); row.add(TimeUtils.DATETIME_FORMAT.format( LocalDateTime.ofInstant(Instant.ofEpochMilli(analysisInfo.lastExecTimeInMs), diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java index 97788174e6..c707107e0e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisInfo.java @@ -17,6 +17,7 @@ package org.apache.doris.statistics; +import org.apache.doris.catalog.TableIf; import org.apache.doris.common.io.Text; import org.apache.doris.common.io.Writable; import org.apache.doris.persist.gson.GsonUtils; @@ -24,7 +25,6 @@ import org.apache.doris.statistics.util.StatisticsUtil; import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; -import com.google.gson.reflect.TypeToken; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -33,7 +33,6 @@ import org.apache.logging.log4j.core.util.CronExpression; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import java.lang.reflect.Type; import java.text.ParseException; import java.util.List; import java.util.Map; @@ -310,16 +309,6 @@ public class AnalysisInfo implements Writable { return gson.toJson(colToPartitions); } - private static Map> getColToPartition(String colToPartitionStr) { - if (colToPartitionStr == null || colToPartitionStr.isEmpty()) { - return null; - } - Gson gson = new Gson(); - Type type = new TypeToken>>() { - }.getType(); - return gson.fromJson(colToPartitionStr, type); - } - @Override public void write(DataOutput out) throws IOException { String json = GsonUtils.GSON.toJson(this); @@ -352,4 +341,8 @@ public class AnalysisInfo implements Writable { state = AnalysisState.FAILED; endTime = System.currentTimeMillis(); } + + public TableIf getTable() { + return StatisticsUtil.findTable(catalogId, dbId, tblId); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisJob.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisJob.java index 19dda4934d..c747b0da14 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisJob.java @@ -191,4 +191,7 @@ public class AnalysisJob { } } + public AnalysisInfo getJobInfo() { + return jobInfo; + } } 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 a1a6dd962e..051dcfbb1b 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 @@ -417,10 +417,17 @@ public class AnalysisManager implements Writable { public void createTaskForEachColumns(AnalysisInfo jobInfo, Map analysisTasks, boolean isSync) throws DdlException { Map> columnToPartitions = jobInfo.colToPartitions; + TableIf table = jobInfo.getTable(); for (Entry> entry : columnToPartitions.entrySet()) { - long indexId = -1; - long taskId = Env.getCurrentEnv().getNextId(); String colName = entry.getKey(); + List indexIds = Lists.newArrayList(); + // Get index id this column belongs to for OlapTable. Set it to -1 for baseIndex id. + if (StatisticsUtil.isMvColumn(table, colName)) { + OlapTable olapTable = (OlapTable) table; + indexIds = olapTable.getMvColumnIndexIds(colName); + } else { + indexIds.add(-1L); + } AnalysisInfoBuilder colTaskInfoBuilder = new AnalysisInfoBuilder(jobInfo); if (jobInfo.analysisType != AnalysisType.HISTOGRAM) { colTaskInfoBuilder.setAnalysisType(AnalysisType.FUNDAMENTALS); @@ -428,14 +435,17 @@ public class AnalysisManager implements Writable { colToParts.put(colName, entry.getValue()); colTaskInfoBuilder.setColToPartitions(colToParts); } - AnalysisInfo analysisInfo = colTaskInfoBuilder.setColName(colName).setIndexId(indexId) - .setTaskId(taskId).setLastExecTimeInMs(System.currentTimeMillis()).build(); - analysisTasks.put(taskId, createTask(analysisInfo)); - jobInfo.addTaskId(taskId); - if (isSync) { - continue; + for (long indexId : indexIds) { + long taskId = Env.getCurrentEnv().getNextId(); + AnalysisInfo analysisInfo = colTaskInfoBuilder.setColName(colName).setIndexId(indexId) + .setTaskId(taskId).setLastExecTimeInMs(System.currentTimeMillis()).build(); + analysisTasks.put(taskId, createTask(analysisInfo)); + jobInfo.addTaskId(taskId); + if (isSync) { + continue; + } + replayCreateAnalysisTask(analysisInfo); } - replayCreateAnalysisTask(analysisInfo); } } @@ -670,7 +680,7 @@ public class AnalysisManager implements Writable { long catalogId = table.getDatabase().getCatalog().getId(); long dbId = table.getDatabase().getId(); long tableId = table.getId(); - Set cols = table.getBaseSchema().stream().map(Column::getName).collect(Collectors.toSet()); + Set cols = table.getSchemaAllIndexes(false).stream().map(Column::getName).collect(Collectors.toSet()); invalidateLocalStats(catalogId, dbId, tableId, cols, tableStats); // Drop stats ddl is master only operation. invalidateRemoteStats(catalogId, dbId, tableId, cols, true); @@ -682,14 +692,25 @@ public class AnalysisManager implements Writable { if (tableStats == null) { return; } + TableIf table = StatisticsUtil.findTable(catalogId, dbId, tableId); StatisticsCache statisticsCache = Env.getCurrentEnv().getStatisticsCache(); if (columns == null) { - TableIf table = StatisticsUtil.findTable(catalogId, dbId, tableId); - columns = table.getBaseSchema().stream().map(Column::getName).collect(Collectors.toSet()); + columns = table.getSchemaAllIndexes(false) + .stream().map(Column::getName).collect(Collectors.toSet()); } + for (String column : columns) { - tableStats.removeColumn(column); - statisticsCache.invalidate(tableId, -1, column); + List indexIds = Lists.newArrayList(); + if (StatisticsUtil.isMvColumn(table, column)) { + OlapTable olapTable = (OlapTable) table; + indexIds = olapTable.getMvColumnIndexIds(column); + } else { + indexIds.add(-1L); + } + for (long indexId : indexIds) { + tableStats.removeColumn(column); + statisticsCache.invalidate(tableId, indexId, column); + } } tableStats.updatedTime = 0; tableStats.userInjected = false; @@ -1036,6 +1057,10 @@ public class AnalysisManager implements Writable { return idToAnalysisJob.get(id); } + public AnalysisInfo findJobInfo(long id) { + return analysisJobInfoMap.get(id); + } + public void constructJob(AnalysisInfo jobInfo, Collection tasks) { AnalysisJob job = new AnalysisJob(jobInfo, tasks); idToAnalysisJob.put(jobInfo.jobId, job); diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseAnalysisTask.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseAnalysisTask.java index 6a8bc2602e..5b8f64a5db 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseAnalysisTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/BaseAnalysisTask.java @@ -63,7 +63,7 @@ public abstract class BaseAnalysisTask { + " SUBSTRING(CAST(MAX(`${colName}`) AS STRING), 1, 1024) AS `max`, " + " ${dataSizeFunction} AS `data_size`, " + " NOW() AS `update_time` " - + " FROM `${catalogName}`.`${dbName}`.`${tblName}`"; + + " FROM `${catalogName}`.`${dbName}`.`${tblName}` ${index}"; protected static final String LINEAR_ANALYZE_TEMPLATE = " SELECT " + "CONCAT(${tblId}, '-', ${idxId}, '-', '${colId}') AS `id`, " @@ -80,7 +80,7 @@ public abstract class BaseAnalysisTask { + "SUBSTRING(CAST(${max} AS STRING), 1, 1024) AS `max`, " + "${dataSizeFunction} * ${scaleFactor} AS `data_size`, " + "NOW() " - + "FROM `${catalogName}`.`${dbName}`.`${tblName}` ${sampleHints} ${limit}"; + + "FROM `${catalogName}`.`${dbName}`.`${tblName}` ${index} ${sampleHints} ${limit}"; protected static final String DUJ1_ANALYZE_TEMPLATE = "SELECT " + "CONCAT('${tblId}', '-', '${idxId}', '-', '${colId}') AS `id`, " @@ -100,7 +100,7 @@ public abstract class BaseAnalysisTask { + "FROM ( " + " SELECT t0.`${colName}` as `column_key`, COUNT(1) as `count` " + " FROM " - + " (SELECT `${colName}` FROM `${catalogName}`.`${dbName}`.`${tblName}` " + + " (SELECT `${colName}` FROM `${catalogName}`.`${dbName}`.`${tblName}` ${index} " + " ${sampleHints} ${limit}) as `t0` " + " GROUP BY `t0`.`${colName}` " + ") as `t1` "; diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/ExternalAnalysisTask.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/ExternalAnalysisTask.java index b9ce541d55..98c844a046 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/ExternalAnalysisTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/ExternalAnalysisTask.java @@ -164,6 +164,7 @@ public class ExternalAnalysisTask extends BaseAnalysisTask { commonParams.put("sampleHints", getSampleHint()); commonParams.put("limit", ""); commonParams.put("scaleFactor", "1"); + commonParams.put("index", ""); if (col != null) { commonParams.put("type", col.getType().toString()); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java index f9ac408825..577dac1c6b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapAnalysisTask.java @@ -17,8 +17,11 @@ package org.apache.doris.statistics; +import org.apache.doris.analysis.CreateMaterializedViewStmt; +import org.apache.doris.catalog.Column; import org.apache.doris.catalog.KeysType; import org.apache.doris.catalog.MaterializedIndex; +import org.apache.doris.catalog.MaterializedIndexMeta; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Partition; import org.apache.doris.common.FeConstants; @@ -49,7 +52,7 @@ public class OlapAnalysisTask extends BaseAnalysisTask { private static final String BASIC_STATS_TEMPLATE = "SELECT " + "SUBSTRING(CAST(MIN(`${colName}`) AS STRING), 1, 1024) as min, " + "SUBSTRING(CAST(MAX(`${colName}`) AS STRING), 1, 1024) as max " - + "FROM `${dbName}`.`${tblName}`"; + + "FROM `${dbName}`.`${tblName}` ${index}"; @VisibleForTesting public OlapAnalysisTask() { @@ -89,13 +92,16 @@ public class OlapAnalysisTask extends BaseAnalysisTask { Pair, Long> pair = calcActualSampleTablets(tbl.isPartitionColumn(col.getName())); LOG.info("Number of tablets selected {}, rows in tablets {}", pair.first.size(), pair.second); List tabletIds = pair.first; - double scaleFactor = (double) tbl.getRowCount() / (double) pair.second; + long totalRowCount = info.indexId == -1 + ? tbl.getRowCount() + : ((OlapTable) tbl).getRowCountForIndex(info.indexId); + double scaleFactor = (double) totalRowCount / (double) pair.second; // might happen if row count in fe metadata hasn't been updated yet if (Double.isInfinite(scaleFactor) || Double.isNaN(scaleFactor)) { LOG.warn("Scale factor is infinite or Nan, will set scale factor to 1."); scaleFactor = 1; tabletIds = Collections.emptyList(); - pair.second = tbl.getRowCount(); + pair.second = totalRowCount; } String tabletStr = tabletIds.stream() .map(Object::toString) @@ -103,7 +109,6 @@ public class OlapAnalysisTask extends BaseAnalysisTask { try (AutoCloseConnectContext r = StatisticsUtil.buildConnectContext(info.jobType.equals(JobType.SYSTEM))) { // Get basic stats, including min and max. ResultRow basicStats = collectBasicStat(r); - long rowCount = tbl.getRowCount(); String min = StatisticsUtil.escapeSQL(basicStats != null && basicStats.getValues().size() > 0 ? basicStats.get(0) : null); String max = StatisticsUtil.escapeSQL(basicStats != null && basicStats.getValues().size() > 1 @@ -122,16 +127,17 @@ public class OlapAnalysisTask extends BaseAnalysisTask { params.put("colId", StatisticsUtil.escapeSQL(String.valueOf(info.colName))); params.put("dataSizeFunction", getDataSizeFunction(col, false)); params.put("dbName", db.getFullName()); - params.put("colName", info.colName); + params.put("colName", StatisticsUtil.escapeColumnName(info.colName)); params.put("tblName", tbl.getName()); params.put("scaleFactor", String.valueOf(scaleFactor)); params.put("sampleHints", tabletStr.isEmpty() ? "" : String.format("TABLET(%s)", tabletStr)); - params.put("ndvFunction", getNdvFunction(String.valueOf(rowCount))); + params.put("ndvFunction", getNdvFunction(String.valueOf(totalRowCount))); params.put("min", StatisticsUtil.quote(min)); params.put("max", StatisticsUtil.quote(max)); - params.put("rowCount", String.valueOf(rowCount)); + params.put("rowCount", String.valueOf(totalRowCount)); params.put("type", col.getType().toString()); params.put("limit", ""); + params.put("index", getIndex()); if (needLimit()) { // If the tablets to be sampled are too large, use limit to control the rows to read, and re-calculate // the scaleFactor. @@ -148,7 +154,7 @@ public class OlapAnalysisTask extends BaseAnalysisTask { if (useLinearAnalyzeTemplate()) { // For single unique key, use count as ndv. if (isSingleUniqueKey()) { - params.put("ndvFunction", String.valueOf(rowCount)); + params.put("ndvFunction", String.valueOf(totalRowCount)); } else { params.put("ndvFunction", "ROUND(NDV(`${colName}`) * ${scaleFactor})"); } @@ -177,8 +183,9 @@ public class OlapAnalysisTask extends BaseAnalysisTask { } Map params = new HashMap<>(); params.put("dbName", db.getFullName()); - params.put("colName", info.colName); + params.put("colName", StatisticsUtil.escapeColumnName(info.colName)); params.put("tblName", tbl.getName()); + params.put("index", getIndex()); StringSubstitutor stringSubstitutor = new StringSubstitutor(params); stmtExecutor = new StmtExecutor(context.connectContext, stringSubstitutor.replace(BASIC_STATS_TEMPLATE)); return stmtExecutor.executeInternalQuery().get(0); @@ -202,14 +209,24 @@ public class OlapAnalysisTask extends BaseAnalysisTask { params.put("dataSizeFunction", getDataSizeFunction(col, false)); params.put("catalogName", catalog.getName()); params.put("dbName", db.getFullName()); - params.put("colName", String.valueOf(info.colName)); + params.put("colName", StatisticsUtil.escapeColumnName(String.valueOf(info.colName))); params.put("tblName", String.valueOf(tbl.getName())); + params.put("index", getIndex()); StringSubstitutor stringSubstitutor = new StringSubstitutor(params); String collectColStats = stringSubstitutor.replace(COLLECT_COL_STATISTICS); runQuery(collectColStats); } - // Get sample tablets id and scale up scaleFactor + protected String getIndex() { + if (info.indexId == -1) { + return ""; + } else { + OlapTable olapTable = (OlapTable) this.tbl; + return "index `" + olapTable.getIndexNameById(info.indexId) + "`"; + } + } + + // Get sample tablets id and sample row count protected Pair, Long> calcActualSampleTablets(boolean forPartitionColumn) { // Below code copied from OlapScanNode.java long sampleRows; // The total number of sample rows @@ -224,8 +241,11 @@ public class OlapAnalysisTask extends BaseAnalysisTask { long actualSampledRowCount = 0; boolean enough = false; for (Partition p : olapTable.getPartitions()) { - List ids = p.getBaseIndex().getTabletIdsInOrder(); - + MaterializedIndex materializedIndex = info.indexId == -1 ? p.getBaseIndex() : p.getIndex(info.indexId); + if (materializedIndex == null) { + continue; + } + List ids = materializedIndex.getTabletIdsInOrder(); if (ids.isEmpty()) { continue; } @@ -233,11 +253,10 @@ public class OlapAnalysisTask extends BaseAnalysisTask { // Skip partitions with row count < row count / 2 expected to be sampled per partition. // It can be expected to sample a smaller number of partitions to avoid uneven distribution // of sampling results. - if (p.getBaseIndex().getRowCount() < (avgRowsPerPartition / 2)) { + if (materializedIndex.getRowCount() < (avgRowsPerPartition / 2)) { continue; } - MaterializedIndex baseIndex = p.getBaseIndex(); - long avgRowsPerTablet = Math.max(baseIndex.getRowCount() / ids.size(), 1); + long avgRowsPerTablet = Math.max(materializedIndex.getRowCount() / ids.size(), 1); long tabletCounts = Math.max( avgRowsPerPartition / avgRowsPerTablet + (avgRowsPerPartition % avgRowsPerTablet != 0 ? 1 : 0), 1); tabletCounts = Math.min(tabletCounts, ids.size()); @@ -247,13 +266,13 @@ public class OlapAnalysisTask extends BaseAnalysisTask { int seekTid = (int) ((i + seek) % ids.size()); long tabletId = ids.get(seekTid); sampleTabletIds.add(tabletId); - actualSampledRowCount += baseIndex.getTablet(tabletId).getRowCount(true); + actualSampledRowCount += materializedIndex.getTablet(tabletId).getRowCount(true); if (actualSampledRowCount >= sampleRows && !forPartitionColumn) { enough = true; break; } } - totalRows += p.getBaseIndex().getRowCount(); + totalRows += materializedIndex.getRowCount(); totalTablet += ids.size(); if (enough) { break; @@ -308,8 +327,12 @@ public class OlapAnalysisTask extends BaseAnalysisTask { if (isSingleUniqueKey()) { return true; } + String columnName = col.getName(); + if (columnName.startsWith(CreateMaterializedViewStmt.MATERIALIZED_VIEW_NAME_PREFIX)) { + columnName = columnName.substring(CreateMaterializedViewStmt.MATERIALIZED_VIEW_NAME_PREFIX.length()); + } Set distributionColumns = tbl.getDistributionColumnNames(); - return distributionColumns.size() == 1 && distributionColumns.contains(col.getName().toLowerCase()); + return distributionColumns.size() == 1 && distributionColumns.contains(columnName.toLowerCase()); } /** @@ -317,8 +340,25 @@ public class OlapAnalysisTask extends BaseAnalysisTask { * @return True if the table has a single unique/agg key. False otherwise. */ protected boolean isSingleUniqueKey() { - int keysNum = ((OlapTable) tbl).getKeysNum(); - KeysType keysType = ((OlapTable) tbl).getKeysType(); + OlapTable olapTable = (OlapTable) this.tbl; + List schema; + KeysType keysType; + if (info.indexId == -1) { + schema = olapTable.getBaseSchema(); + keysType = olapTable.getKeysType(); + } else { + MaterializedIndexMeta materializedIndexMeta = olapTable.getIndexIdToMeta().get(info.indexId); + schema = materializedIndexMeta.getSchema(); + keysType = materializedIndexMeta.getKeysType(); + } + + int keysNum = 0; + for (Column column : schema) { + if (column.isKey()) { + keysNum += 1; + } + } + return col.isKey() && keysNum == 1 && (keysType.equals(KeysType.UNIQUE_KEYS) || keysType.equals(KeysType.AGG_KEYS)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapScanStatsDerive.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapScanStatsDerive.java index 7833da4b58..b65678d185 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapScanStatsDerive.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/OlapScanStatsDerive.java @@ -62,9 +62,11 @@ public class OlapScanStatsDerive extends BaseStatsDerive { double rowCount = table.estimatedRowCount(); for (Map.Entry entry : slotIdToTableIdAndColumnName.entrySet()) { String colName = entry.getValue(); + // TODO. Get index id for materialized view. ColumnStatistic statistic = Env.getCurrentEnv().getStatisticsCache().getColumnStatistics( - table.getDatabase().getCatalog().getId(), table.getDatabase().getId(), table.getId(), colName); + table.getDatabase().getCatalog().getId(), + table.getDatabase().getId(), table.getId(), -1, colName); if (!statistic.isUnKnown) { rowCount = statistic.count; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java index a09b56acfc..d69ea0cf43 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsAutoCollector.java @@ -187,8 +187,9 @@ public class StatisticsAutoCollector extends StatisticsCollector { .setDBId(db.getId()) .setTblId(table.getId()) .setColName( - table.getBaseSchema().stream().filter(c -> !StatisticsUtil.isUnsupportedType(c.getType())) - .map(Column::getName).collect(Collectors.joining(",")) + table.getSchemaAllIndexes(false).stream() + .filter(c -> !StatisticsUtil.isUnsupportedType(c.getType())) + .map(Column::getName).collect(Collectors.joining(",")) ) .setAnalysisType(AnalysisInfo.AnalysisType.FUNDAMENTALS) .setAnalysisMode(AnalysisInfo.AnalysisMode.INCREMENTAL) diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java index 73eaaaff1c..20f25eb3e9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCache.java @@ -90,26 +90,21 @@ public class StatisticsCache { }); } - public ColumnStatistic getColumnStatistics(long catalogId, long dbId, long tblId, String colName) { - return getColumnStatistics(catalogId, dbId, tblId, -1, colName).orElse(ColumnStatistic.UNKNOWN); - } - - public Optional getColumnStatistics(long catalogId, long dbId, - long tblId, long idxId, String colName) { + public ColumnStatistic getColumnStatistics(long catalogId, long dbId, long tblId, long idxId, String colName) { ConnectContext ctx = ConnectContext.get(); if (ctx != null && ctx.getSessionVariable().internalSession) { - return Optional.empty(); + return ColumnStatistic.UNKNOWN; } StatisticsCacheKey k = new StatisticsCacheKey(catalogId, dbId, tblId, idxId, colName); try { CompletableFuture> f = columnStatisticsCache.get(k); if (f.isDone()) { - return f.get(); + return f.get().orElse(ColumnStatistic.UNKNOWN); } } catch (Exception e) { LOG.warn("Unexpected exception while returning ColumnStatistic", e); } - return Optional.empty(); + return ColumnStatistic.UNKNOWN; } public Histogram getHistogram(long tblId, String colName) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCacheKey.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCacheKey.java index e254adf4e9..055dd128be 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCacheKey.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCacheKey.java @@ -41,18 +41,10 @@ public class StatisticsCacheKey { private static final String DELIMITER = "-"; - public StatisticsCacheKey(long tableId, String colName) { - this(tableId, -1, colName); - } - public StatisticsCacheKey(long tableId, long idxId, String colName) { this(-1, -1, tableId, idxId, colName); } - public StatisticsCacheKey(long catalogId, long dbId, long tableId) { - this(catalogId, dbId, tableId, -1, ""); - } - public StatisticsCacheKey(long catalogId, long dbId, long tableId, long idxId, String colName) { this.catalogId = catalogId; this.dbId = dbId; diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCleaner.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCleaner.java index 3a142351a2..2879991c92 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCleaner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsCleaner.java @@ -231,7 +231,7 @@ public class StatisticsCleaner extends MasterDaemon { TableIf t = idToTbl.get(tblId); String colId = statsId.colId; - if (t.getColumn(colId) == null) { + if (!StatisticsUtil.isMvColumn(t, colId) && t.getColumn(colId) == null) { expiredStats.ids.add(id); continue; } 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 b406faa4be..92ff3cd42b 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 @@ -102,8 +102,8 @@ public class StatisticsRepository { + " ${inPredicate}" + " AND part_id IS NOT NULL"; - public static ColumnStatistic queryColumnStatisticsByName(long tableId, String colName) { - ResultRow resultRow = queryColumnStatisticById(tableId, colName); + public static ColumnStatistic queryColumnStatisticsByName(long tableId, long indexId, String colName) { + ResultRow resultRow = queryColumnStatisticById(tableId, indexId, colName); if (resultRow == null) { return ColumnStatistic.UNKNOWN; } @@ -126,17 +126,17 @@ public class StatisticsRepository { Collectors.toList()); } - public static ResultRow queryColumnStatisticById(long tblId, String colName) { - return queryColumnStatisticById(tblId, colName, false); + public static ResultRow queryColumnStatisticById(long tblId, long indexId, String colName) { + return queryColumnStatisticById(tblId, indexId, colName, false); } - public static ResultRow queryColumnHistogramById(long tblId, String colName) { - return queryColumnStatisticById(tblId, colName, true); + public static ResultRow queryColumnHistogramById(long tblId, long indexId, String colName) { + return queryColumnStatisticById(tblId, indexId, colName, true); } - private static ResultRow queryColumnStatisticById(long tblId, String colName, boolean isHistogram) { + private static ResultRow queryColumnStatisticById(long tblId, long indexId, String colName, boolean isHistogram) { Map map = new HashMap<>(); - String id = constructId(tblId, -1, colName); + String id = constructId(tblId, indexId, colName); map.put("id", StatisticsUtil.escapeSQL(id)); List rows = isHistogram ? StatisticsUtil.executeQuery(FETCH_COLUMN_HISTOGRAM_TEMPLATE, map) : StatisticsUtil.executeQuery(FETCH_COLUMN_STATISTIC_TEMPLATE, map); @@ -158,8 +158,8 @@ public class StatisticsRepository { return rows == null ? Collections.emptyList() : rows; } - public static Histogram queryColumnHistogramByName(long tableId, String colName) { - ResultRow resultRow = queryColumnHistogramById(tableId, colName); + public static Histogram queryColumnHistogramByName(long tableId, long indexId, String colName) { + ResultRow resultRow = queryColumnHistogramById(tableId, indexId, colName); if (resultRow == null) { return Histogram.UNKNOWN; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/util/StatisticsUtil.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/util/StatisticsUtil.java index 65c4800c58..50dd416cc2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/util/StatisticsUtil.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/util/StatisticsUtil.java @@ -19,6 +19,7 @@ package org.apache.doris.statistics.util; import org.apache.doris.analysis.Analyzer; import org.apache.doris.analysis.BoolLiteral; +import org.apache.doris.analysis.CreateMaterializedViewStmt; import org.apache.doris.analysis.DateLiteral; import org.apache.doris.analysis.DecimalLiteral; import org.apache.doris.analysis.FloatLiteral; @@ -808,6 +809,13 @@ public class StatisticsUtil { .replace("\\", "\\\\"); } + public static String escapeColumnName(String str) { + if (str == null) { + return null; + } + return str.replace("`", "``"); + } + public static boolean isExternalTable(String catalogName, String dbName, String tblName) { TableIf table; try { @@ -981,4 +989,16 @@ public class StatisticsUtil { } } + /** + * Check if the given column name is a materialized view column. + * @param table + * @param columnName + * @return True for mv column. + */ + public static boolean isMvColumn(TableIf table, String columnName) { + return table instanceof OlapTable + && columnName.startsWith(CreateMaterializedViewStmt.MATERIALIZED_VIEW_NAME_PREFIX) + || columnName.startsWith(CreateMaterializedViewStmt.MATERIALIZED_VIEW_AGGREGATE_NAME_PREFIX); + } + } diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/CacheTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/CacheTest.java index 6b3b09c496..93ec2770c8 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/CacheTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/CacheTest.java @@ -78,10 +78,10 @@ public class CacheTest extends TestWithFeService { } }; StatisticsCache statisticsCache = new StatisticsCache(); - ColumnStatistic c = statisticsCache.getColumnStatistics(-1, -1, 1, "col"); + ColumnStatistic c = statisticsCache.getColumnStatistics(-1, -1, 1, -1, "col"); Assertions.assertTrue(c.isUnKnown); Thread.sleep(100); - c = statisticsCache.getColumnStatistics(-1, -1, 1, "col"); + c = statisticsCache.getColumnStatistics(-1, -1, 1, -1, "col"); Assertions.assertTrue(c.isUnKnown); } @@ -105,13 +105,13 @@ public class CacheTest extends TestWithFeService { } }; StatisticsCache statisticsCache = new StatisticsCache(); - ColumnStatistic columnStatistic = statisticsCache.getColumnStatistics(-1, -1, 0, "col"); + ColumnStatistic columnStatistic = statisticsCache.getColumnStatistics(-1, -1, 0, -1, "col"); // load not finished yet, should return unknown Assertions.assertTrue(columnStatistic.isUnKnown); // wait 1 sec to ensure `execStatisticQuery` is finished as much as possible. Thread.sleep(1000); // load has finished, return corresponding stats. - columnStatistic = statisticsCache.getColumnStatistics(-1, -1, 0, "col"); + columnStatistic = statisticsCache.getColumnStatistics(-1, -1, 0, -1, "col"); Assertions.assertEquals(7, columnStatistic.count); Assertions.assertEquals(8, columnStatistic.ndv); Assertions.assertEquals(11, columnStatistic.maxValue); @@ -248,9 +248,9 @@ public class CacheTest extends TestWithFeService { try { StatisticsCache statisticsCache = new StatisticsCache(); - ColumnStatistic columnStatistic = statisticsCache.getColumnStatistics(1, 1, 1, "col"); + ColumnStatistic columnStatistic = statisticsCache.getColumnStatistics(1, 1, 1, -1, "col"); Thread.sleep(3000); - columnStatistic = statisticsCache.getColumnStatistics(1, 1, 1, "col"); + columnStatistic = statisticsCache.getColumnStatistics(1, 1, 1, -1, "col"); Assertions.assertEquals(1, columnStatistic.count); Assertions.assertEquals(2, columnStatistic.ndv); Assertions.assertEquals(3, columnStatistic.avgSizeByte); diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/HMSAnalysisTaskTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/HMSAnalysisTaskTest.java index e101686452..c8b42fcb34 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/HMSAnalysisTaskTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/HMSAnalysisTaskTest.java @@ -235,7 +235,7 @@ public class HMSAnalysisTaskTest { + " SUBSTRING(CAST(MAX(`hour`) AS STRING), 1, 1024) AS `max`," + " COUNT(1) * 4 AS `data_size`," + " NOW() AS `update_time`" - + " FROM `hms`.`default`.`test`", sql); + + " FROM `hms`.`default`.`test` ", sql); } }; diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/OlapAnalysisTaskTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/OlapAnalysisTaskTest.java index fe695ecebc..5d9d57406a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/OlapAnalysisTaskTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/OlapAnalysisTaskTest.java @@ -162,7 +162,7 @@ public class OlapAnalysisTaskTest { + "SUM(LENGTH(`column_key`) * count) * 5.0 AS `data_size`, NOW() " + "FROM ( SELECT t0.`${colName}` as `column_key`, COUNT(1) " + "as `count` FROM (SELECT `${colName}` FROM " - + "`catalogName`.`${dbName}`.`${tblName}` " + + "`catalogName`.`${dbName}`.`${tblName}` " + " limit 100) as `t0` GROUP BY `t0`.`${colName}` ) as `t1` ", sql); return; } @@ -238,7 +238,7 @@ public class OlapAnalysisTaskTest { + "AS `null_count`, SUBSTRING(CAST('1' AS STRING), 1, 1024) AS `min`, " + "SUBSTRING(CAST('2' AS STRING), 1, 1024) AS `max`, " + "SUM(LENGTH(`${colName}`)) * 5.0 AS `data_size`, NOW() " - + "FROM `catalogName`.`${dbName}`.`${tblName}` limit 100", sql); + + "FROM `catalogName`.`${dbName}`.`${tblName}` limit 100", sql); return; } }; @@ -322,7 +322,7 @@ public class OlapAnalysisTaskTest { + "SUBSTRING(CAST('1' AS STRING), 1, 1024) AS `min`, " + "SUBSTRING(CAST('2' AS STRING), 1, 1024) AS `max`, " + "SUM(LENGTH(`column_key`) * count) * 5.0 AS `data_size`, NOW() " - + "FROM ( SELECT t0.`${colName}` as `column_key`, COUNT(1) as `count` FROM (SELECT `${colName}` FROM `catalogName`.`${dbName}`.`${tblName}` limit 100) as `t0` GROUP BY `t0`.`${colName}` ) as `t1` ", sql); + + "FROM ( SELECT t0.`${colName}` as `column_key`, COUNT(1) as `count` FROM (SELECT `${colName}` FROM `catalogName`.`${dbName}`.`${tblName}` limit 100) as `t0` GROUP BY `t0`.`${colName}` ) as `t1` ", sql); return; } }; diff --git a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java index 2455581c29..a85a1e5f1d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/statistics/StatisticsAutoCollectorTest.java @@ -38,6 +38,8 @@ import org.apache.doris.statistics.AnalysisInfo.JobType; import org.apache.doris.statistics.util.StatisticsUtil; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import mockit.Expectations; import mockit.Injectable; import mockit.Mock; @@ -131,7 +133,7 @@ public class StatisticsAutoCollectorTest { } @Mock - public List getBaseSchema() { + public List getSchemaAllIndexes(boolean full) { List columns = new ArrayList<>(); columns.add(new Column("c1", PrimitiveType.INT)); columns.add(new Column("c2", PrimitiveType.HLL)); @@ -139,10 +141,9 @@ public class StatisticsAutoCollectorTest { } }; StatisticsAutoCollector saa = new StatisticsAutoCollector(); - List analysisInfos = - saa.constructAnalysisInfo(new Database(1, "anydb")); - Assertions.assertEquals(1, analysisInfos.size()); - Assertions.assertEquals("c1", analysisInfos.get(0).colName.split(",")[0]); + List analysisInfoList = saa.constructAnalysisInfo(new Database(1, "anydb")); + Assertions.assertEquals(1, analysisInfoList.size()); + Assertions.assertEquals("c1", analysisInfoList.get(0).colName.split(",")[0]); } @Test @@ -243,6 +244,16 @@ public class StatisticsAutoCollectorTest { return thresholds[count++]; } }; + + new MockUp() { + @Mock + public Map> findReAnalyzeNeededPartitions() { + HashMap> ret = Maps.newHashMap(); + ret.put("key1", Sets.newHashSet()); + return ret; + } + }; + AnalysisInfo analysisInfo = new AnalysisInfoBuilder().build(); StatisticsAutoCollector statisticsAutoCollector = new StatisticsAutoCollector(); Assertions.assertNull(statisticsAutoCollector.getReAnalyzeRequiredPart(analysisInfo)); diff --git a/regression-test/suites/external_table_p0/hive/test_hive_statistics_all_type_p0.groovy b/regression-test/suites/external_table_p0/hive/test_hive_statistics_all_type_p0.groovy index 741103b3ec..a37a553511 100644 --- a/regression-test/suites/external_table_p0/hive/test_hive_statistics_all_type_p0.groovy +++ b/regression-test/suites/external_table_p0/hive/test_hive_statistics_all_type_p0.groovy @@ -35,101 +35,101 @@ suite("test_hive_statistics_all_type_p0", "all_types,p0,external,hive,external_d result = sql """show column stats orc_all_types (int_col);""" assertEquals("int_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3256.0", result[0][2]) - assertEquals("361.0", result[0][3]) - assertEquals("14400.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3256.0", result[0][3]) + assertEquals("361.0", result[0][4]) + assertEquals("14400.0", result[0][5]) result = sql """show column stats orc_all_types (char_col);""" assertEquals("char_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("25273.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("25273.0", result[0][5]) result = sql """show column stats orc_all_types (binary_col);""" assertEquals("binary_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3240.0", result[0][2]) - assertEquals("362.0", result[0][3]) - assertEquals("85788.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3240.0", result[0][3]) + assertEquals("362.0", result[0][4]) + assertEquals("85788.0", result[0][5]) result = sql """show column stats orc_all_types (bigint_col);""" assertEquals("bigint_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3209.0", result[0][2]) - assertEquals("377.0", result[0][3]) - assertEquals("28800.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3209.0", result[0][3]) + assertEquals("377.0", result[0][4]) + assertEquals("28800.0", result[0][5]) result = sql """show column stats orc_all_types (boolean_col);""" assertEquals("boolean_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("2.0", result[0][2]) - assertEquals("369.0", result[0][3]) - assertEquals("3600.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("2.0", result[0][3]) + assertEquals("369.0", result[0][4]) + assertEquals("3600.0", result[0][5]) result = sql """show column stats orc_all_types (date_col);""" assertEquals("date_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("2148.0", result[0][2]) - assertEquals("378.0", result[0][3]) - assertEquals("14400.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("2148.0", result[0][3]) + assertEquals("378.0", result[0][4]) + assertEquals("14400.0", result[0][5]) result = sql """show column stats orc_all_types (float_col);""" assertEquals("float_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3274.0", result[0][2]) - assertEquals("340.0", result[0][3]) - assertEquals("14400.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3274.0", result[0][3]) + assertEquals("340.0", result[0][4]) + assertEquals("14400.0", result[0][5]) result = sql """show column stats orc_all_types (string_col);""" assertEquals("string_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3261.0", result[0][2]) - assertEquals("347.0", result[0][3]) - assertEquals("453634.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3261.0", result[0][3]) + assertEquals("347.0", result[0][4]) + assertEquals("453634.0", result[0][5]) result = sql """show column stats orc_all_types (varchar_col);""" assertEquals("varchar_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("6.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("35950.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("6.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("35950.0", result[0][5]) result = sql """show column stats orc_all_types (smallint_col);""" assertEquals("smallint_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("90.0", result[0][2]) - assertEquals("359.0", result[0][3]) - assertEquals("7200.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("90.0", result[0][3]) + assertEquals("359.0", result[0][4]) + assertEquals("7200.0", result[0][5]) result = sql """show column stats orc_all_types (timestamp_col);""" assertEquals("timestamp_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3243.0", result[0][2]) - assertEquals("339.0", result[0][3]) - assertEquals("28800.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3243.0", result[0][3]) + assertEquals("339.0", result[0][4]) + assertEquals("28800.0", result[0][5]) result = sql """show column stats orc_all_types (tinyint_col);""" assertEquals("tinyint_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("9.0", result[0][2]) - assertEquals("366.0", result[0][3]) - assertEquals("3600.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("9.0", result[0][3]) + assertEquals("366.0", result[0][4]) + assertEquals("3600.0", result[0][5]) result = sql """show column stats orc_all_types (double_col);""" assertEquals("double_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3200.0", result[0][2]) - assertEquals("395.0", result[0][3]) - assertEquals("28800.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3200.0", result[0][3]) + assertEquals("395.0", result[0][4]) + assertEquals("28800.0", result[0][5]) result = sql """show column stats orc_all_types (decimal_col);""" assertEquals("decimal_col", result[0][0]) - assertEquals("3600.0", result[0][1]) - assertEquals("3218.0", result[0][2]) - assertEquals("367.0", result[0][3]) - assertEquals("28800.0", result[0][4]) + assertEquals("3600.0", result[0][2]) + assertEquals("3218.0", result[0][3]) + assertEquals("367.0", result[0][4]) + assertEquals("28800.0", result[0][5]) sql """drop catalog if exists ${catalog_name}""" } finally { diff --git a/regression-test/suites/external_table_p0/hive/test_hive_statistics_p0.groovy b/regression-test/suites/external_table_p0/hive/test_hive_statistics_p0.groovy index ec96eb0560..09fc180960 100644 --- a/regression-test/suites/external_table_p0/hive/test_hive_statistics_p0.groovy +++ b/regression-test/suites/external_table_p0/hive/test_hive_statistics_p0.groovy @@ -59,62 +59,62 @@ suite("test_hive_statistics_p0", "all_types,p0,external,hive,external_docker,ext result = sql """show column stats stats_test1(id);""" assertEquals(1, result.size()) assertEquals("id", result[0][0]) - assertEquals("3.0", result[0][1]) assertEquals("3.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("12.0", result[0][4]) - assertEquals("4.0", result[0][5]) - assertEquals("1", result[0][6]) - assertEquals("3", result[0][7]) - assertEquals("FULL" , result[0][8]) - assertEquals("FUNDAMENTALS" , result[0][9]) - assertEquals("MANUAL" , result[0][10]) - assertEquals("0" , result[0][11]) + assertEquals("3.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("12.0", result[0][5]) + assertEquals("4.0", result[0][6]) + assertEquals("1", result[0][7]) + assertEquals("3", result[0][8]) + assertEquals("FULL" , result[0][9]) + assertEquals("FUNDAMENTALS" , result[0][10]) + assertEquals("MANUAL" , result[0][11]) + assertEquals("0" , result[0][12]) result = sql """show column stats stats_test1(value);""" assertEquals(1, result.size()) assertEquals("value", result[0][0]) - assertEquals("3.0", result[0][1]) assertEquals("3.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("15.0", result[0][4]) - assertEquals("5.0", result[0][5]) - assertEquals("\'name1\'" , result[0][6]) - assertEquals("\'name3\'" , result[0][7]) - assertEquals("FULL" , result[0][8]) - assertEquals("FUNDAMENTALS" , result[0][9]) - assertEquals("MANUAL" , result[0][10]) - assertEquals("0" , result[0][11]) + assertEquals("3.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("15.0", result[0][5]) + assertEquals("5.0", result[0][6]) + assertEquals("\'name1\'" , result[0][7]) + assertEquals("\'name3\'" , result[0][8]) + assertEquals("FULL" , result[0][9]) + assertEquals("FUNDAMENTALS" , result[0][10]) + assertEquals("MANUAL" , result[0][11]) + assertEquals("0" , result[0][12]) result = sql """show column stats stats_test2(id);""" assertEquals(1, result.size()) assertEquals("id", result[0][0]) - assertEquals("2.0", result[0][1]) assertEquals("2.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("8.0", result[0][4]) - assertEquals("4.0", result[0][5]) - assertEquals("1", result[0][6]) - assertEquals("2", result[0][7]) - assertEquals("FULL" , result[0][8]) - assertEquals("FUNDAMENTALS" , result[0][9]) - assertEquals("MANUAL" , result[0][10]) - assertEquals("0" , result[0][11]) + assertEquals("2.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("8.0", result[0][5]) + assertEquals("4.0", result[0][6]) + assertEquals("1", result[0][7]) + assertEquals("2", result[0][8]) + assertEquals("FULL" , result[0][9]) + assertEquals("FUNDAMENTALS" , result[0][10]) + assertEquals("MANUAL" , result[0][11]) + assertEquals("0" , result[0][12]) result = sql """show column stats stats_test2(value);""" assertEquals(1, result.size()) assertEquals("value", result[0][0]) - assertEquals("2.0", result[0][1]) assertEquals("2.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("2.0", result[0][4]) - assertEquals("1.0", result[0][5]) - assertEquals("\'*\'", result[0][6]) - assertEquals("\';\'", result[0][7]) - assertEquals("FULL" , result[0][8]) - assertEquals("FUNDAMENTALS" , result[0][9]) - assertEquals("MANUAL" , result[0][10]) - assertEquals("0" , result[0][11]) + assertEquals("2.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("2.0", result[0][5]) + assertEquals("1.0", result[0][6]) + assertEquals("\'*\'", result[0][7]) + assertEquals("\';\'", result[0][8]) + assertEquals("FULL" , result[0][9]) + assertEquals("FUNDAMENTALS" , result[0][10]) + assertEquals("MANUAL" , result[0][11]) + assertEquals("0" , result[0][12]) sql """drop catalog if exists ${catalog_name}""" @@ -127,17 +127,17 @@ suite("test_hive_statistics_p0", "all_types,p0,external,hive,external_docker,ext result = sql """show column stats stats_test1(value);""" assertEquals(1, result.size()) assertEquals("value", result[0][0]) - assertEquals("3.0", result[0][1]) assertEquals("3.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("15.0", result[0][4]) - assertEquals("5.0", result[0][5]) - assertEquals("\'name1\'" , result[0][6]) - assertEquals("\'name3\'" , result[0][7]) - assertEquals("FULL" , result[0][8]) - assertEquals("FUNDAMENTALS" , result[0][9]) - assertEquals("MANUAL" , result[0][10]) - assertEquals("0" , result[0][11]) + assertEquals("3.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("15.0", result[0][5]) + assertEquals("5.0", result[0][6]) + assertEquals("\'name1\'" , result[0][7]) + assertEquals("\'name3\'" , result[0][8]) + assertEquals("FULL" , result[0][9]) + assertEquals("FUNDAMENTALS" , result[0][10]) + assertEquals("MANUAL" , result[0][11]) + assertEquals("0" , result[0][12]) result = sql """show column stats stats_test1(id);""" assertEquals(0, result.size()) @@ -146,72 +146,72 @@ suite("test_hive_statistics_p0", "all_types,p0,external,hive,external_docker,ext result = sql """show column stats stats_test1(id);""" assertEquals(1, result.size()) assertEquals("id", result[0][0]) - assertEquals("3.0", result[0][1]) assertEquals("3.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("12.0", result[0][4]) - assertEquals("4.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("3.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("12.0", result[0][5]) + assertEquals("4.0", result[0][6]) assertEquals("N/A", result[0][7]) - assertEquals("SAMPLE" , result[0][8]) - assertEquals("FUNDAMENTALS" , result[0][9]) - assertEquals("MANUAL" , result[0][10]) - assertEquals("0" , result[0][11]) + assertEquals("N/A", result[0][8]) + assertEquals("SAMPLE" , result[0][9]) + assertEquals("FUNDAMENTALS" , result[0][10]) + assertEquals("MANUAL" , result[0][11]) + assertEquals("0" , result[0][12]) sql """analyze table stats_test2 with sync;""" result = sql """show column stats stats_test2(id);""" assertEquals(1, result.size()) assertEquals("id", result[0][0]) - assertEquals("2.0", result[0][1]) assertEquals("2.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("8.0", result[0][4]) - assertEquals("4.0", result[0][5]) - assertEquals("1", result[0][6]) - assertEquals("2", result[0][7]) - assertEquals("FULL" , result[0][8]) - assertEquals("FUNDAMENTALS" , result[0][9]) - assertEquals("MANUAL" , result[0][10]) - assertEquals("0" , result[0][11]) + assertEquals("2.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("8.0", result[0][5]) + assertEquals("4.0", result[0][6]) + assertEquals("1", result[0][7]) + assertEquals("2", result[0][8]) + assertEquals("FULL" , result[0][9]) + assertEquals("FUNDAMENTALS" , result[0][10]) + assertEquals("MANUAL" , result[0][11]) + assertEquals("0" , result[0][12]) result = sql """show column stats stats_test2(value);""" assertEquals(1, result.size()) assertEquals("value", result[0][0]) - assertEquals("2.0", result[0][1]) assertEquals("2.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("2.0", result[0][4]) - assertEquals("1.0", result[0][5]) - assertEquals("\'*\'", result[0][6]) - assertEquals("\';\'", result[0][7]) - assertEquals("FULL" , result[0][8]) - assertEquals("FUNDAMENTALS" , result[0][9]) - assertEquals("MANUAL" , result[0][10]) - assertEquals("0" , result[0][11]) + assertEquals("2.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("2.0", result[0][5]) + assertEquals("1.0", result[0][6]) + assertEquals("\'*\'", result[0][7]) + assertEquals("\';\'", result[0][8]) + assertEquals("FULL" , result[0][9]) + assertEquals("FUNDAMENTALS" , result[0][10]) + assertEquals("MANUAL" , result[0][11]) + assertEquals("0" , result[0][12]) sql """analyze table stats_test3 with sync""" result = sql """show column stats stats_test3(id);""" assertEquals(1, result.size()) assertEquals("id", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats stats_test3(value);""" assertEquals(1, result.size()) assertEquals("value", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) sql """drop catalog if exists ${catalog_name}""" diff --git a/regression-test/suites/external_table_p0/jdbc/test_mysql_jdbc_statistics.groovy b/regression-test/suites/external_table_p0/jdbc/test_mysql_jdbc_statistics.groovy index f73ab3aaad..66b04ebd51 100644 --- a/regression-test/suites/external_table_p0/jdbc/test_mysql_jdbc_statistics.groovy +++ b/regression-test/suites/external_table_p0/jdbc/test_mysql_jdbc_statistics.groovy @@ -39,24 +39,24 @@ suite("test_mysql_jdbc_statistics", "p0,external,mysql,external_docker,external_ def result = sql """show column stats ex_tb0 (name)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "name") - assertTrue(result[0][1] == "5.0") assertTrue(result[0][2] == "5.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "15.0") - assertTrue(result[0][5] == "3.0") - assertEquals(result[0][6], "'abc'") - assertEquals(result[0][7], "'abg'") + assertTrue(result[0][3] == "5.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "15.0") + assertTrue(result[0][6] == "3.0") + assertEquals(result[0][7], "'abc'") + assertEquals(result[0][8], "'abg'") result = sql """show column stats ex_tb0 (id)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "id") - assertTrue(result[0][1] == "5.0") assertTrue(result[0][2] == "5.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "20.0") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "111") - assertTrue(result[0][7] == "115") + assertTrue(result[0][3] == "5.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "20.0") + assertTrue(result[0][6] == "4.0") + assertTrue(result[0][7] == "111") + assertTrue(result[0][8] == "115") sql """drop catalog ${catalog_name}""" } diff --git a/regression-test/suites/external_table_p2/hive/test_hive_statistic.groovy b/regression-test/suites/external_table_p2/hive/test_hive_statistic.groovy index 8107139883..4fcd70fe73 100644 --- a/regression-test/suites/external_table_p2/hive/test_hive_statistic.groovy +++ b/regression-test/suites/external_table_p2/hive/test_hive_statistic.groovy @@ -41,195 +41,195 @@ suite("test_hive_statistic", "p2,external,hive,external_remote,external_remote_h def result = sql """show column stats `statistics` (lo_quantity)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_quantity") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "46.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "50") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "46.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "50") result = sql """show column stats `statistics` (lo_orderkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_orderkey") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "98") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "98") result = sql """show column stats `statistics` (lo_linenumber)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_linenumber") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "7.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "7") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "7.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "7") result = sql """show column stats `statistics` (lo_custkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_custkey") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "67423") - assertEquals(result[0][7], "2735521") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "67423") + assertEquals(result[0][8], "2735521") result = sql """show column stats `statistics` (lo_partkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_partkey") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "2250") - assertEquals(result[0][7], "989601") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "2250") + assertEquals(result[0][8], "989601") result = sql """show column stats `statistics` (lo_suppkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_suppkey") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "4167") - assertEquals(result[0][7], "195845") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "4167") + assertEquals(result[0][8], "195845") result = sql """show column stats `statistics` (lo_orderdate)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_orderdate") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "19920221") - assertEquals(result[0][7], "19980721") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "19920221") + assertEquals(result[0][8], "19980721") result = sql """show column stats `statistics` (lo_orderpriority)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_orderpriority") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "5.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "880.0") - assertEquals(result[0][5], "8.8") - assertEquals(result[0][6], "'1-URGENT'") - assertEquals(result[0][7], "'5-LOW'") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "5.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "880.0") + assertEquals(result[0][6], "8.8") + assertEquals(result[0][7], "'1-URGENT'") + assertEquals(result[0][8], "'5-LOW'") result = sql """show column stats `statistics` (lo_shippriority)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_shippriority") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "1.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "0") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "1.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") assertEquals(result[0][7], "0") + assertEquals(result[0][8], "0") result = sql """show column stats `statistics` (lo_extendedprice)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_extendedprice") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "104300") - assertEquals(result[0][7], "9066094") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "104300") + assertEquals(result[0][8], "9066094") result = sql """show column stats `statistics` (lo_ordtotalprice)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_ordtotalprice") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "3428256") - assertEquals(result[0][7], "36771805") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "3428256") + assertEquals(result[0][8], "36771805") result = sql """show column stats `statistics` (lo_discount)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_discount") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "11.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "0") - assertEquals(result[0][7], "10") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "11.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "0") + assertEquals(result[0][8], "10") result = sql """show column stats `statistics` (lo_revenue)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_revenue") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "101171") - assertEquals(result[0][7], "8703450") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "101171") + assertEquals(result[0][8], "8703450") result = sql """show column stats `statistics` (lo_supplycost)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_supplycost") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "58023") - assertEquals(result[0][7], "121374") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "58023") + assertEquals(result[0][8], "121374") result = sql """show column stats `statistics` (lo_tax)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_tax") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "9.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "0") - assertEquals(result[0][7], "8") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "9.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "0") + assertEquals(result[0][8], "8") result = sql """show column stats `statistics` (lo_commitdate)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_commitdate") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "95.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "19920515") - assertEquals(result[0][7], "19981016") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "95.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "19920515") + assertEquals(result[0][8], "19981016") result = sql """show column stats `statistics` (lo_shipmode)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_shipmode") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "7.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "421.0") - assertEquals(result[0][5], "4.21") - assertEquals(result[0][6], "'AIR'") - assertEquals(result[0][7], "'TRUCK'") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "7.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "421.0") + assertEquals(result[0][6], "4.21") + assertEquals(result[0][7], "'AIR'") + assertEquals(result[0][8], "'TRUCK'") sql """ALTER TABLE statistics MODIFY COLUMN lo_shipmode SET STATS ('row_count'='6001215')""" result = sql "show column stats `statistics` (lo_shipmode)" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_shipmode") - assertEquals(result[0][1], "6001215.0") + assertEquals(result[0][2], "6001215.0") sql """drop stats statistics""" result = sql """show column stats statistics""" @@ -291,8 +291,8 @@ suite("test_hive_statistic", "p2,external,hive,external_remote,external_remote_h result = sql """show column stats logs1_parquet (log_time)""" assertEquals(result.size(), 1) - assertEquals(result[0][6], "N/A") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") sql """use tpch1_parquet;""" sql """drop stats region""" @@ -302,35 +302,35 @@ suite("test_hive_statistic", "p2,external,hive,external_remote,external_remote_h result = sql """show column stats region(r_regionkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "r_regionkey") - assertEquals(result[0][1], "5.0") assertEquals(result[0][2], "5.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "20.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "0") - assertEquals(result[0][7], "4") + assertEquals(result[0][3], "5.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "20.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "0") + assertEquals(result[0][8], "4") result = sql """show column stats region(r_comment)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "r_comment") - assertEquals(result[0][1], "5.0") assertEquals(result[0][2], "5.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "330.0") - assertEquals(result[0][5], "66.0") - assertEquals(result[0][6], "\'ges. thinly even pinto beans ca\'") - assertEquals(result[0][7], "\'uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl\'") + assertEquals(result[0][3], "5.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "330.0") + assertEquals(result[0][6], "66.0") + assertEquals(result[0][7], "\'ges. thinly even pinto beans ca\'") + assertEquals(result[0][8], "\'uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl\'") result = sql """show column stats region(r_name)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "r_name") - assertEquals(result[0][1], "5.0") assertEquals(result[0][2], "5.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "34.0") - assertEquals(result[0][5], "6.8") - assertEquals(result[0][6], "\'AFRICA\'") - assertEquals(result[0][7], "\'MIDDLE EAST\'") + assertEquals(result[0][3], "5.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "34.0") + assertEquals(result[0][6], "6.8") + assertEquals(result[0][7], "\'AFRICA\'") + assertEquals(result[0][8], "\'MIDDLE EAST\'") sql """drop catalog ${catalog_name}""" } diff --git a/regression-test/suites/external_table_p2/hive/test_hive_statistic_auto.groovy b/regression-test/suites/external_table_p2/hive/test_hive_statistic_auto.groovy index 4a6c33f351..8a7591daeb 100644 --- a/regression-test/suites/external_table_p2/hive/test_hive_statistic_auto.groovy +++ b/regression-test/suites/external_table_p2/hive/test_hive_statistic_auto.groovy @@ -43,13 +43,13 @@ suite("test_hive_statistic_auto", "p2,external,hive,external_remote,external_rem } assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_quantity") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "46.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "46.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats `statistics` (lo_orderkey)""" if (result.size <= 0) { @@ -57,13 +57,13 @@ suite("test_hive_statistic_auto", "p2,external,hive,external_remote,external_rem } assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_orderkey") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats `statistics` (lo_linenumber)""" if (result.size <= 0) { @@ -71,13 +71,13 @@ suite("test_hive_statistic_auto", "p2,external,hive,external_remote,external_rem } assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_linenumber") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "7.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "7.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") } sql """drop catalog ${catalog_name}""" diff --git a/regression-test/suites/external_table_p2/hive/test_hive_statistic_cache.groovy b/regression-test/suites/external_table_p2/hive/test_hive_statistic_cache.groovy index 74ce33ace4..3b18f2a725 100644 --- a/regression-test/suites/external_table_p2/hive/test_hive_statistic_cache.groovy +++ b/regression-test/suites/external_table_p2/hive/test_hive_statistic_cache.groovy @@ -73,173 +73,173 @@ suite("test_hive_statistic_cache", "p2,external,hive,external_remote,external_re Thread.sleep(5000); result = sql """show column cached stats `stats` (lo_orderkey)""" assertEquals(result[0][0], "lo_orderkey") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "98") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "98") result = sql """show column cached stats `stats` (lo_linenumber)""" assertEquals(result[0][0], "lo_linenumber") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "7.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "7") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "7.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "7") result = sql """show column cached stats `stats` (lo_custkey)""" assertEquals(result[0][0], "lo_custkey") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "67423") - assertEquals(result[0][7], "2735521") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "67423") + assertEquals(result[0][8], "2735521") result = sql """show column cached stats `stats` (lo_partkey)""" assertEquals(result[0][0], "lo_partkey") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "2250") - assertEquals(result[0][7], "989601") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "2250") + assertEquals(result[0][8], "989601") result = sql """show column cached stats `stats` (lo_suppkey)""" assertEquals(result[0][0], "lo_suppkey") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "4167") - assertEquals(result[0][7], "195845") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "4167") + assertEquals(result[0][8], "195845") result = sql """show column cached stats `stats` (lo_orderdate)""" assertEquals(result[0][0], "lo_orderdate") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "19920221") - assertEquals(result[0][7], "19980721") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "19920221") + assertEquals(result[0][8], "19980721") result = sql """show column cached stats `stats` (lo_orderpriority)""" assertEquals(result[0][0], "lo_orderpriority") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "5.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "880.0") - assertEquals(result[0][5], "8.8") - assertEquals(result[0][6], "'1-URGENT'") - assertEquals(result[0][7], "'5-LOW'") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "5.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "880.0") + assertEquals(result[0][6], "8.0") + assertEquals(result[0][7], "'1-URGENT'") + assertEquals(result[0][8], "'5-LOW'") result = sql """show column cached stats `stats` (lo_shippriority)""" assertEquals(result[0][0], "lo_shippriority") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "1.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "0") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "1.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") assertEquals(result[0][7], "0") + assertEquals(result[0][8], "0") result = sql """show column cached stats `stats` (lo_extendedprice)""" assertEquals(result[0][0], "lo_extendedprice") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "104300") - assertEquals(result[0][7], "9066094") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "104300") + assertEquals(result[0][8], "9066094") result = sql """show column cached stats `stats` (lo_ordtotalprice)""" assertEquals(result[0][0], "lo_ordtotalprice") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "3428256") - assertEquals(result[0][7], "36771805") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "3428256") + assertEquals(result[0][8], "36771805") result = sql """show column cached stats `stats` (lo_discount)""" assertEquals(result[0][0], "lo_discount") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "11.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "0") - assertEquals(result[0][7], "10") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "11.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "0") + assertEquals(result[0][8], "10") result = sql """show column cached stats `stats` (lo_revenue)""" assertEquals(result[0][0], "lo_revenue") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "101171") - assertEquals(result[0][7], "8703450") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "101171") + assertEquals(result[0][8], "8703450") result = sql """show column cached stats `stats` (lo_supplycost)""" assertEquals(result[0][0], "lo_supplycost") - assertEquals(result[0][1], "100.0") assertEquals(result[0][2], "100.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "58023") - assertEquals(result[0][7], "121374") + assertEquals(result[0][3], "100.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "58023") + assertEquals(result[0][8], "121374") result = sql """show column cached stats `stats` (lo_tax)""" assertEquals(result[0][0], "lo_tax") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "9.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "0") - assertEquals(result[0][7], "8") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "9.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "0") + assertEquals(result[0][8], "8") result = sql """show column cached stats `stats` (lo_commitdate)""" assertEquals(result[0][0], "lo_commitdate") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "95.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "19920515") - assertEquals(result[0][7], "19981016") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "95.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "19920515") + assertEquals(result[0][8], "19981016") result = sql """show column cached stats `stats` (lo_shipmode)""" assertEquals(result[0][0], "lo_shipmode") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "7.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "421.0") - assertEquals(result[0][5], "4.21") - assertEquals(result[0][6], "'AIR'") - assertEquals(result[0][7], "'TRUCK'") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "7.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "421.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "'AIR'") + assertEquals(result[0][8], "'TRUCK'") result = sql """show column cached stats `stats` (lo_quantity)""" assertEquals(result[0][0], "lo_quantity") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "46.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "50") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "46.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "50") } } diff --git a/regression-test/suites/external_table_p2/hive/test_hive_statistic_clean.groovy b/regression-test/suites/external_table_p2/hive/test_hive_statistic_clean.groovy index bef2e44883..e04f9fbe88 100644 --- a/regression-test/suites/external_table_p2/hive/test_hive_statistic_clean.groovy +++ b/regression-test/suites/external_table_p2/hive/test_hive_statistic_clean.groovy @@ -38,69 +38,69 @@ suite("test_hive_statistic_clean", "p2,external,hive,external_remote,external_re def result = sql """show column stats `statistics` (lo_quantity)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_quantity") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "46.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "50") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "46.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "50") result = sql """show column stats `statistics` (lo_orderkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_orderkey") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "98") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "98") result = sql """show column stats `statistics` (lo_linenumber)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_linenumber") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "7.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "7") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "7.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "7") sql """drop expired stats""" result = sql """show column stats `statistics` (lo_quantity)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_quantity") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "46.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "50") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "46.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "50") result = sql """show column stats `statistics` (lo_orderkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_orderkey") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "26.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "98") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "26.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "98") result = sql """show column stats `statistics` (lo_linenumber)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "lo_linenumber") - assertEquals(result[0][1], "100.0") - assertEquals(result[0][2], "7.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "400.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "1") - assertEquals(result[0][7], "7") + assertEquals(result[0][2], "100.0") + assertEquals(result[0][3], "7.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "400.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "7") def ctlId result = sql """show catalogs""" diff --git a/regression-test/suites/external_table_p2/hive/test_hive_statistic_sample.groovy b/regression-test/suites/external_table_p2/hive/test_hive_statistic_sample.groovy index 675a9409b3..3bd9594afd 100644 --- a/regression-test/suites/external_table_p2/hive/test_hive_statistic_sample.groovy +++ b/regression-test/suites/external_table_p2/hive/test_hive_statistic_sample.groovy @@ -37,112 +37,112 @@ suite("test_hive_statistic_sample", "p2,external,hive,external_remote,external_r def result = sql """show column stats region (r_regionkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "r_regionkey") - assertEquals(result[0][1], "5.0") assertEquals(result[0][2], "5.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "20.0") - assertEquals(result[0][5], "4.0") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][3], "5.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "20.0") + assertEquals(result[0][6], "4.0") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats region (r_name)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "r_name") - assertEquals(result[0][1], "5.0") assertEquals(result[0][2], "5.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "34.0") - assertEquals(result[0][5], "6.8") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][3], "5.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "34.0") + assertEquals(result[0][6], "6.8") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats region (r_comment)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "r_comment") - assertEquals(result[0][1], "5.0") assertEquals(result[0][2], "5.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "330.0") - assertEquals(result[0][5], "66.0") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][3], "5.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "330.0") + assertEquals(result[0][6], "66.0") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats supplier (s_suppkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "s_suppkey") - assertEquals(result[0][1], "9998799.0") assertEquals(result[0][2], "9998799.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "3.9995194E7") - assertEquals(result[0][5], "3.9999997999759773") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][3], "9998799.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "3.9995194E7") + assertEquals(result[0][6], "3.9999997999759773") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats supplier (s_name)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "s_name") - assertEquals(result[0][1], "9998799.0") assertEquals(result[0][2], "9998799.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "1.79978374E8") - assertEquals(result[0][5], "17.999999199903908") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][3], "9998799.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "1.79978374E8") + assertEquals(result[0][6], "17.999999199903908") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats supplier (s_address)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "s_address") - assertEquals(result[0][1], "9998799.0") assertEquals(result[0][2], "9998799.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "2.50070604E8") - assertEquals(result[0][5], "25.010064108699456") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][3], "9998799.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "2.50070604E8") + assertEquals(result[0][6], "25.010064108699456") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats supplier (s_nationkey)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "s_nationkey") - assertEquals(result[0][1], "9998799.0") - assertEquals(result[0][2], "25.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "3.9995194E7") - assertEquals(result[0][5], "3.9999997999759773") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][2], "9998799.0") + assertEquals(result[0][3], "25.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "3.9995194E7") + assertEquals(result[0][6], "3.9999997999759773") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats supplier (s_phone)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "s_phone") - assertEquals(result[0][1], "9998799.0") - assertEquals(result[0][2], "9996537.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "1.49981978E8") - assertEquals(result[0][5], "14.99999929991592") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][2], "9998799.0") + assertEquals(result[0][3], "9996537.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "1.49981978E8") + assertEquals(result[0][6], "14.99999929991592") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats supplier (s_acctbal)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "s_acctbal") - assertEquals(result[0][1], "9998799.0") - assertEquals(result[0][2], "1054512.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "7.9990388E7") - assertEquals(result[0][5], "7.999999599951955") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][2], "9998799.0") + assertEquals(result[0][3], "58727.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "7.9990388E7") + assertEquals(result[0][6], "7.999999599951955") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") result = sql """show column stats supplier (s_comment)""" assertEquals(result.size(), 1) assertEquals(result[0][0], "s_comment") - assertEquals(result[0][1], "9998799.0") - assertEquals(result[0][2], "9630165.0") - assertEquals(result[0][3], "0.0") - assertEquals(result[0][4], "6.24883849E8") - assertEquals(result[0][5], "62.49589065646784") - assertEquals(result[0][6], "N/A") + assertEquals(result[0][2], "9998799.0") + assertEquals(result[0][3], "9630165.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "6.24883849E8") + assertEquals(result[0][6], "62.49589065646784") assertEquals(result[0][7], "N/A") + assertEquals(result[0][8], "N/A") sql """drop catalog ${catalog_name}""" } diff --git a/regression-test/suites/external_table_p2/hive/test_hive_statistics_from_hms.groovy b/regression-test/suites/external_table_p2/hive/test_hive_statistics_from_hms.groovy index 14426e5c2b..b25102f227 100644 --- a/regression-test/suites/external_table_p2/hive/test_hive_statistics_from_hms.groovy +++ b/regression-test/suites/external_table_p2/hive/test_hive_statistics_from_hms.groovy @@ -41,169 +41,169 @@ suite("test_hive_statistics_from_hms", "p2,external,hive,external_remote,externa def result = sql """show column cached stats lineitem (l_returnflag)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_returnflag") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "2.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "6001215.0") - assertTrue(result[0][5] == "1.0") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "2.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "6001215.0") + assertTrue(result[0][6] == "1.0") result = sql """show column cached stats lineitem (l_receiptdate)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_receiptdate") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "2535.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.400486E7") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "\'1992-01-04\'") - assertTrue(result[0][7] == "\'1998-12-31\'") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "2535.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "2.400486E7") + assertTrue(result[0][6] == "4.0") + assertTrue(result[0][7] == "\'1992-01-04\'") + assertTrue(result[0][8] == "\'1998-12-31\'") result = sql """show column cached stats lineitem (l_tax)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_tax") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "8.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "4.800972E7") - assertTrue(result[0][5] == "8.0") - assertTrue(result[0][6] == "0") - assertTrue(result[0][7] == "0.08") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "8.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "4.800972E7") + assertTrue(result[0][6] == "8.0") + assertTrue(result[0][7] == "0") + assertTrue(result[0][8] == "0.08") result = sql """show column cached stats lineitem (l_shipmode)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_shipmode") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "7.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.5717007E7") - assertTrue(result[0][5] == "4.285300060071169") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "7.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "2.5717007E7") + assertTrue(result[0][6] == "4.285300060071169") result = sql """show column cached stats lineitem (l_suppkey)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_suppkey") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "6.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.400486E7") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "7") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "6.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "2.400486E7") + assertTrue(result[0][6] == "4.0") + assertTrue(result[0][7] == "1") + assertTrue(result[0][8] == "7") result = sql """show column cached stats lineitem (l_shipdate)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_shipdate") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "2535.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.400486E7") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "\'1992-01-02\'") - assertTrue(result[0][7] == "\'1998-12-01\'") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "2535.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "2.400486E7") + assertTrue(result[0][6] == "4.0") + assertTrue(result[0][7] == "\'1992-01-02\'") + assertTrue(result[0][8] == "\'1998-12-01\'") result = sql """show column cached stats lineitem (l_commitdate)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_commitdate") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "2427.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.400486E7") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "\'1992-01-31\'") - assertTrue(result[0][7] == "\'1998-10-31\'") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "2427.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "2.400486E7") + assertTrue(result[0][6] == "4.0") + assertTrue(result[0][7] == "\'1992-01-31\'") + assertTrue(result[0][8] == "\'1998-10-31\'") result = sql """show column cached stats lineitem (l_partkey)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_partkey") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "13152.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.400486E7") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "10000") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "13152.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "2.400486E7") + assertTrue(result[0][6] == "4.0") + assertTrue(result[0][7] == "1") + assertTrue(result[0][8] == "10000") result = sql """show column cached stats lineitem (l_orderkey)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_orderkey") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "1000998.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.400486E7") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "6000000") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "1000998.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "2.400486E7") + assertTrue(result[0][6] == "4.0") + assertTrue(result[0][7] == "1") + assertTrue(result[0][8] == "6000000") result = sql """show column cached stats lineitem (l_quantity)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_quantity") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "31.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "4.800972E7") - assertTrue(result[0][5] == "8.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "50") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "31.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "4.800972E7") + assertTrue(result[0][6] == "8.0") + assertTrue(result[0][7] == "1") + assertTrue(result[0][8] == "50") result = sql """show column cached stats lineitem (l_linestatus)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_linestatus") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "2.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "6001215.0") - assertTrue(result[0][5] == "1.0") - + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "2.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "6001215.0") + assertTrue(result[0][6] == "1.0") + result = sql """show column cached stats lineitem (l_comment)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_comment") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "3834237.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "1.5899739E8") - assertTrue(result[0][5] == "26.494199924515286") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "3834237.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "1.5899739E8") + assertTrue(result[0][6] == "26.494199924515286") result = sql """show column cached stats lineitem (l_extendedprice)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_extendedprice") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "1000998.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "4.800972E7") - assertTrue(result[0][5] == "8.0") - assertTrue(result[0][6] == "901") - assertTrue(result[0][7] == "104949.5") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "1000998.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "4.800972E7") + assertTrue(result[0][6] == "8.0") + assertTrue(result[0][7] == "901") + assertTrue(result[0][8] == "104949.5") result = sql """show column cached stats lineitem (l_linenumber)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_linenumber") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "261329.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "2.400486E7") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "200000") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "261329.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "2.400486E7") + assertTrue(result[0][6] == "4.0") + assertTrue(result[0][7] == "1") + assertTrue(result[0][8] == "200000") result = sql """show column cached stats lineitem (l_discount)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_discount") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "15.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "4.800972E7") - assertTrue(result[0][5] == "8.0") - assertTrue(result[0][6] == "0") - assertTrue(result[0][7] == "0.1") + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "15.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "4.800972E7") + assertTrue(result[0][6] == "8.0") + assertTrue(result[0][7] == "0") + assertTrue(result[0][8] == "0.1") result = sql """show column cached stats lineitem (l_shipinstruct)""" assertTrue(result.size() == 1) assertTrue(result[0][0] == "l_shipinstruct") - assertTrue(result[0][1] == "6001215.0") - assertTrue(result[0][2] == "4.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "7.2006178E7") - assertTrue(result[0][5] == "11.998599950176756") - + assertTrue(result[0][2] == "6001215.0") + assertTrue(result[0][3] == "4.0") + assertTrue(result[0][4] == "0.0") + assertTrue(result[0][5] == "7.2006178E7") + assertTrue(result[0][6] == "11.998599950176756") + result = sql """show table cached stats lineitem""" assertTrue(result.size() == 1) assertTrue(result[0][2] == "6001215") diff --git a/regression-test/suites/statistics/analyze_stats.groovy b/regression-test/suites/statistics/analyze_stats.groovy index 78a477f9ab..c02fef4793 100644 --- a/regression-test/suites/statistics/analyze_stats.groovy +++ b/regression-test/suites/statistics/analyze_stats.groovy @@ -250,7 +250,7 @@ suite("test_analyze") { def expected_result = { r-> for(int i = 0; i < r.size; i++) { - if ((int) Double.parseDouble(r[i][1]) == 6) { + if ((int) Double.parseDouble(r[i][2]) == 6) { return true } else { return false @@ -892,7 +892,7 @@ PARTITION `p599` VALUES IN (599) sql """ANALYZE TABLE test_600_partition_table_analyze WITH SYNC""" - // 0:column_name | 1:count | 2:ndv | 3:num_null | 4:data_size | 5:avg_size_byte | 6:min | 7:max | 8:updated_time + // 0:column_name | 1:index_name | 2:count | 3:ndv | 4:num_null | 5:data_size | 6:avg_size_byte | 7:min | 8:max | 9:method | 10:type | 11:trigger | 12:query_times | 13:updated_time id_col_stats = sql """ SHOW COLUMN CACHED STATS test_600_partition_table_analyze(id); """ @@ -901,25 +901,14 @@ PARTITION `p599` VALUES IN (599) return (int) Double.parseDouble(r[0][idx]) == expected_value } - assert expected_col_stats(id_col_stats, 600, 1) - assert (int) Double.parseDouble(id_col_stats[0][2]) < 700 - && (int) Double.parseDouble(id_col_stats[0][2]) > 500 - assert expected_col_stats(id_col_stats, 0, 3) - assert expected_col_stats(id_col_stats, 2400, 4) - assert expected_col_stats(id_col_stats, 4, 5) - assert expected_col_stats(id_col_stats, 0, 6) - assert expected_col_stats(id_col_stats, 599, 7) - - def update_time = id_col_stats[0][8] - - sql """ANALYZE TABLE test_600_partition_table_analyze WITH SYNC""" - - // Data has no change, update time shouldn't be update since this table don't need to analyze again - id_col_stats_2 = sql """ - SHOW COLUMN CACHED STATS test_600_partition_table_analyze(id); - """ - - assert update_time == id_col_stats_2[0][8] + assert expected_col_stats(id_col_stats, 600, 2) + assert (int) Double.parseDouble(id_col_stats[0][3]) < 700 + && (int) Double.parseDouble(id_col_stats[0][3]) > 500 + assert expected_col_stats(id_col_stats, 0, 4) + assert expected_col_stats(id_col_stats, 2400, 5) + assert expected_col_stats(id_col_stats, 4, 6) + assert expected_col_stats(id_col_stats, 0, 7) + assert expected_col_stats(id_col_stats, 599, 8) sql """DROP TABLE IF EXISTS increment_analyze_test""" sql """ @@ -947,7 +936,7 @@ PARTITION `p599` VALUES IN (599) SHOW COLUMN CACHED STATS increment_analyze_test(id) """ - expected_col_stats(inc_res, 6, 1) + expected_col_stats(inc_res, 6, 2) sql """ DROP TABLE increment_analyze_test; @@ -987,12 +976,12 @@ PARTITION `p599` VALUES IN (599) SHOW COLUMN CACHED STATS a_partitioned_table_for_analyze_test(val) """ - expected_col_stats(col_val_res, 3, 1) + expected_col_stats(col_val_res, 3, 2) def col_id_res = sql """ SHOW COLUMN CACHED STATS a_partitioned_table_for_analyze_test(id) """ - expected_col_stats(col_id_res, 3, 1) + expected_col_stats(col_id_res, 3, 2) sql """DROP TABLE IF EXISTS `some_complex_type_test`""" @@ -1269,8 +1258,8 @@ PARTITION `p599` VALUES IN (599) def truncate_test_result = sql """ SHOW COLUMN CACHED STATS ${tbl}(analyzetestlimitedk12) """ - assert "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" == truncate_test_result[0][6].substring(1, 1025) assert "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" == truncate_test_result[0][7].substring(1, 1025) + assert "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" == truncate_test_result[0][8].substring(1, 1025) sql """TRUNCATE TABLE ${tbl}""" result_after_truncate = sql """show column stats ${tbl}""" @@ -1282,156 +1271,156 @@ PARTITION `p599` VALUES IN (599) result = sql """show column stats ${tbl}(analyzetestlimitedk0);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk0", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk1);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk1", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk2);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk2", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk3);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk3", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk4);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk4", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk5);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk5", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk6);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk6", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk7);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk7", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk8);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk8", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk9);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk9", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk10);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk10", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk11);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk11", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk12);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk12", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) result = sql """show column stats ${tbl}(analyzetestlimitedk13);""" assertEquals(1, result.size()) assertEquals("analyzetestlimitedk13", result[0][0]) - assertEquals("0.0", result[0][1]) assertEquals("0.0", result[0][2]) assertEquals("0.0", result[0][3]) assertEquals("0.0", result[0][4]) assertEquals("0.0", result[0][5]) - assertEquals("N/A", result[0][6]) + assertEquals("0.0", result[0][6]) assertEquals("N/A", result[0][7]) + assertEquals("N/A", result[0][8]) // Test drop stats with more than 1024 columns. sql """ @@ -2551,7 +2540,7 @@ PARTITION `p599` VALUES IN (599) sql """ CREATE TABLE region ( `r_regionkey` int NOT NULL, - `r'name` VARCHAR(25) NOT NULL, + `r%name` VARCHAR(25) NOT NULL, `r_comment` VARCHAR(152) )ENGINE=OLAP DUPLICATE KEY(`r_regionkey`) @@ -2565,14 +2554,14 @@ PARTITION `p599` VALUES IN (599) sql """insert into region values(2,'name2', 'comment2') """ sql """insert into region values(3,'name3', 'comment3') """ sql """ANALYZE TABLE region WITH SYNC""" - result = sql """show column stats region (`r'name`);""" + result = sql """show column stats region (`r%name`);""" assertEquals(1, result.size()) - assertEquals("r'name", result[0][0]) - assertEquals("3.0", result[0][1]) + assertEquals("r%name", result[0][0]) assertEquals("3.0", result[0][2]) - assertEquals("0.0", result[0][3]) - assertEquals("\'name1\'", result[0][6]) - assertEquals("\'name3\'", result[0][7]) + assertEquals("3.0", result[0][3]) + assertEquals("0.0", result[0][4]) + assertEquals("\'name1\'", result[0][7]) + assertEquals("\'name3\'", result[0][8]) // Test partititon load data for the first time. sql """ @@ -2627,8 +2616,8 @@ PARTITION `p599` VALUES IN (599) Thread.sleep(1000 * 60) sql """analyze table agg_table_test with sample rows 100 with sync""" def agg_result = sql """show column stats agg_table_test (name)""" - assertEquals(agg_result[0][6], "N/A") assertEquals(agg_result[0][7], "N/A") + assertEquals(agg_result[0][8], "N/A") // Test sample string type min max sql """ @@ -2703,19 +2692,19 @@ PARTITION `p599` VALUES IN (599) def result_sample = sql """analyze table trigger_test with sample percent 10 with sync""" result_sample = sql """show column stats trigger_test""" assertEquals(2, result_sample.size()) - assertEquals("0.0", result_sample[0][1]) - assertEquals("SAMPLE", result_sample[0][8]) - assertEquals("0.0", result_sample[1][1]) - assertEquals("SAMPLE", result_sample[1][8]) + assertEquals("0.0", result_sample[0][2]) + assertEquals("SAMPLE", result_sample[0][9]) + assertEquals("0.0", result_sample[1][2]) + assertEquals("SAMPLE", result_sample[1][9]) sql """drop stats trigger_test""" sql """analyze table trigger_test with sample rows 1000 with sync""" result_sample = sql """show column stats trigger_test""" assertEquals(2, result_sample.size()) - assertEquals("0.0", result_sample[0][1]) - assertEquals("SAMPLE", result_sample[0][8]) - assertEquals("0.0", result_sample[1][1]) - assertEquals("SAMPLE", result_sample[1][8]) + assertEquals("0.0", result_sample[0][2]) + assertEquals("SAMPLE", result_sample[0][9]) + assertEquals("0.0", result_sample[1][2]) + assertEquals("SAMPLE", result_sample[1][9]) // Test show task result_sample = sql """analyze table trigger_test with sample percent 10""" @@ -2740,34 +2729,34 @@ PARTITION `p599` VALUES IN (599) Thread.sleep(1000) continue; } - assertEquals(result[0][10], "SYSTEM") - assertEquals(result[1][10], "SYSTEM") + assertEquals(result[0][11], "SYSTEM") + assertEquals(result[1][11], "SYSTEM") break } if (i < 10) { sql """analyze table trigger_test with sync""" def result = sql """show column stats trigger_test""" assertEquals(result.size(), 2) - assertEquals(result[0][10], "MANUAL") - assertEquals(result[1][10], "MANUAL") + assertEquals(result[0][11], "MANUAL") + assertEquals(result[1][11], "MANUAL") } // Test analyze default full. sql """analyze table trigger_test with sync""" def result = sql """show column stats trigger_test""" assertEquals(2, result.size()) - assertEquals("4.0", result[0][1]) - assertEquals("FULL", result[0][8]) - assertEquals("4.0", result[1][1]) - assertEquals("FULL", result[1][8]) + assertEquals("4.0", result[0][2]) + assertEquals("FULL", result[0][9]) + assertEquals("4.0", result[1][2]) + assertEquals("FULL", result[1][9]) // Test analyze hive health value sql """insert into trigger_test values(5,'name5') """ sql """analyze table trigger_test with sync""" result = sql """show column stats trigger_test""" assertEquals(2, result.size()) - assertEquals("5.0", result[0][1]) - assertEquals("5.0", result[1][1]) + assertEquals("5.0", result[0][2]) + assertEquals("5.0", result[1][2]) sql """DROP DATABASE IF EXISTS trigger""" diff --git a/regression-test/suites/statistics/test_agg_complex_type.groovy b/regression-test/suites/statistics/test_agg_complex_type.groovy index 4800959fe5..0f10234ae6 100644 --- a/regression-test/suites/statistics/test_agg_complex_type.groovy +++ b/regression-test/suites/statistics/test_agg_complex_type.groovy @@ -46,10 +46,10 @@ suite("test_analyze_with_agg_complex_type") { return (int) Double.parseDouble(r[0][idx]) == expected_value } - assert expected_col_stats(show_result, 2, 1) - assert expected_col_stats(show_result, 0, 3) - assert expected_col_stats(show_result, 8, 4) - assert expected_col_stats(show_result, 4, 5) - assert expected_col_stats(show_result, 1, 6) - assert expected_col_stats(show_result, 2, 7) -} \ No newline at end of file + assert expected_col_stats(show_result, 2, 2) + assert expected_col_stats(show_result, 0, 4) + assert expected_col_stats(show_result, 8, 5) + assert expected_col_stats(show_result, 4, 6) + assert expected_col_stats(show_result, 1, 7) + assert expected_col_stats(show_result, 2, 8) +} diff --git a/regression-test/suites/statistics/test_analyze_mv.groovy b/regression-test/suites/statistics/test_analyze_mv.groovy new file mode 100644 index 0000000000..91c4c24f70 --- /dev/null +++ b/regression-test/suites/statistics/test_analyze_mv.groovy @@ -0,0 +1,256 @@ +// 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_analyze_mv") { + + sql """drop database if exists test_analyze_mv""" + sql """create database test_analyze_mv""" + sql """use test_analyze_mv""" + + sql """CREATE TABLE mvTestDup ( + key1 bigint NOT NULL, + key2 bigint NOT NULL, + value1 int NOT NULL, + value2 int NOT NULL, + value3 int NOT NULL + )ENGINE=OLAP + DUPLICATE KEY(`key1`, `key2`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`key1`) BUCKETS 2 + PROPERTIES ( + "replication_num" = "1" + ) + """ + sql """create materialized view mv1 as select key1 from mvTestDup;""" + Thread.sleep(1500) + sql """create materialized view mv2 as select key2 from mvTestDup;""" + Thread.sleep(1500) + sql """create materialized view mv3 as select key1, key2, sum(value1), max(value2), min(value3) from mvTestDup group by key1, key2;""" + Thread.sleep(1500) + sql """insert into mvTestDup values (1, 2, 3, 4, 5), (1, 2, 3, 4, 5), (10, 20, 30, 40, 50), (10, 20, 30, 40, 50), (100, 200, 300, 400, 500), (1001, 2001, 3001, 4001, 5001);""" + + sql """analyze table mvTestDup with sync;""" + + def result_sample = sql """show column stats mvTestDup""" + assertEquals(12, result_sample.size()) + + result_sample = sql """show column stats mvTestDup(key1)""" + assertEquals(1, result_sample.size()) + assertEquals("key1", result_sample[0][0]) + assertEquals("N/A", result_sample[0][1]) + assertEquals("6.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("1", result_sample[0][7]) + assertEquals("1001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestDup(value1)""" + assertEquals(1, result_sample.size()) + assertEquals("value1", result_sample[0][0]) + assertEquals("N/A", result_sample[0][1]) + assertEquals("6.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("3", result_sample[0][7]) + assertEquals("3001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestDup(mv_key1)""" + assertEquals(2, result_sample.size()) + assertEquals("mv_key1", result_sample[0][0]) + assertTrue(result_sample[0][1] == 'mv1' && result_sample[1][1] == 'mv3' || result_sample[0][1] == 'mv3' && result_sample[1][1] == 'mv1') + if (result_sample[0][1] == 'mv1') { + assertEquals("6.0", result_sample[0][2]) + } else { + assertEquals("4.0", result_sample[0][2]) + } + assertEquals("4.0", result_sample[0][3]) + assertEquals("1", result_sample[0][7]) + assertEquals("1001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestDup(`mva_SUM__CAST(``value1`` AS BIGINT)`)""" + assertEquals(1, result_sample.size()) + assertEquals("mva_SUM__CAST(`value1` AS BIGINT)", result_sample[0][0]) + assertEquals("mv3", result_sample[0][1]) + assertEquals("4.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("6", result_sample[0][7]) + assertEquals("3001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestDup(`mva_MAX__``value2```)""" + assertEquals(1, result_sample.size()) + assertEquals("mva_MAX__`value2`", result_sample[0][0]) + assertEquals("mv3", result_sample[0][1]) + assertEquals("4.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("4", result_sample[0][7]) + assertEquals("4001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestDup(`mva_MIN__``value3```)""" + assertEquals(1, result_sample.size()) + assertEquals("mva_MIN__`value3`", result_sample[0][0]) + assertEquals("mv3", result_sample[0][1]) + assertEquals("4.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("5", result_sample[0][7]) + assertEquals("5001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + + + sql """CREATE TABLE mvTestAgg ( + key1 bigint NOT NULL, + key2 bigint NOT NULL, + value1 int SUM NOT NULL, + value2 int MAX NOT NULL, + value3 int MIN NOT NULL + )ENGINE=OLAP + AGGREGATE KEY(`key1`, `key2`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`key1`) BUCKETS 2 + PROPERTIES ( + "replication_num" = "1" + ); + """ + + sql """create materialized view mv1 as select key2 from mvTestAgg;""" + Thread.sleep(1500) + sql """create materialized view mv3 as select key1, key2, sum(value1), max(value2), min(value3) from mvTestAgg group by key1, key2;""" + Thread.sleep(1500) + sql """create materialized view mv6 as select key1, sum(value1) from mvTestAgg group by key1;""" + Thread.sleep(1500) + sql """insert into mvTestAgg values (1, 2, 3, 4, 5), (1, 2, 3, 4, 5), (1, 11, 22, 33, 44), (10, 20, 30, 40, 50), (10, 20, 30, 40, 50), (100, 200, 300, 400, 500), (1001, 2001, 3001, 4001, 5001);""" + + sql """analyze table mvTestAgg with sync;""" + result_sample = sql """show column stats mvTestAgg""" + assertEquals(13, result_sample.size()) + + result_sample = sql """show column stats mvTestAgg(key2)""" + assertEquals(1, result_sample.size()) + assertEquals("key2", result_sample[0][0]) + assertEquals("N/A", result_sample[0][1]) + assertEquals("5.0", result_sample[0][2]) + assertEquals("5.0", result_sample[0][3]) + assertEquals("2", result_sample[0][7]) + assertEquals("2001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestAgg(value2)""" + assertEquals(1, result_sample.size()) + assertEquals("value2", result_sample[0][0]) + assertEquals("N/A", result_sample[0][1]) + assertEquals("5.0", result_sample[0][2]) + assertEquals("5.0", result_sample[0][3]) + assertEquals("4", result_sample[0][7]) + assertEquals("4001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestAgg(mv_key2)""" + assertEquals(2, result_sample.size()) + assertEquals("mv_key2", result_sample[0][0]) + assertTrue(result_sample[0][1] == 'mv1' && result_sample[1][1] == 'mv3' || result_sample[0][1] == 'mv3' && result_sample[1][1] == 'mv1') + assertEquals("5.0", result_sample[0][2]) + assertEquals("5.0", result_sample[0][3]) + assertEquals("2", result_sample[0][7]) + assertEquals("2001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestAgg(`mva_MAX__``value2```)""" + assertEquals(1, result_sample.size()) + assertEquals("mva_MAX__`value2`", result_sample[0][0]) + assertEquals("mv3", result_sample[0][1]) + assertEquals("5.0", result_sample[0][2]) + assertEquals("5.0", result_sample[0][3]) + assertEquals("4", result_sample[0][7]) + assertEquals("4001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestAgg(`mva_MIN__``value3```)""" + assertEquals(1, result_sample.size()) + assertEquals("mva_MIN__`value3`", result_sample[0][0]) + assertEquals("mv3", result_sample[0][1]) + assertEquals("5.0", result_sample[0][2]) + assertEquals("5.0", result_sample[0][3]) + assertEquals("5", result_sample[0][7]) + assertEquals("5001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + + sql """ + CREATE TABLE mvTestUni ( + key1 bigint NOT NULL, + key2 bigint NOT NULL, + value1 int NOT NULL, + value2 int NOT NULL, + value3 int NOT NULL + )ENGINE=OLAP + UNIQUE KEY(`key1`, `key2`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`key1`) BUCKETS 2 + PROPERTIES ( + "enable_unique_key_merge_on_write" = false, + "replication_num" = "1" + ); + """ + + sql """create materialized view mv1 as select key1 from mvTestUni;""" + Thread.sleep(1000) + sql """create materialized view mv6 as select key2, value2, value3 from mvTestUni;""" + Thread.sleep(1000) + sql """insert into mvTestUni values (1, 2, 3, 4, 5), (1, 2, 3, 7, 8), (1, 11, 22, 33, 44), (10, 20, 30, 40, 50), (10, 20, 30, 40, 50), (100, 200, 300, 400, 500), (1001, 2001, 3001, 4001, 5001);""" + + sql """analyze table mvTestUni with sync;""" + + sql """analyze table mvTestUni with sync;""" + result_sample = sql """show column stats mvTestUni""" + assertEquals(9, result_sample.size()) + + result_sample = sql """show column stats mvTestUni(key1)""" + assertEquals(1, result_sample.size()) + assertEquals("key1", result_sample[0][0]) + assertEquals("N/A", result_sample[0][1]) + assertEquals("5.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("1", result_sample[0][7]) + assertEquals("1001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestUni(mv_key1)""" + assertEquals(1, result_sample.size()) + assertEquals("mv_key1", result_sample[0][0]) + assertEquals("mv1", result_sample[0][1]) + assertEquals("4.0", result_sample[0][2]) + assertEquals("4.0", result_sample[0][3]) + assertEquals("1", result_sample[0][7]) + assertEquals("1001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + result_sample = sql """show column stats mvTestUni(mv_value2)""" + assertEquals(1, result_sample.size()) + assertEquals("mv_value2", result_sample[0][0]) + assertEquals("mv6", result_sample[0][1]) + assertEquals("5.0", result_sample[0][2]) + assertEquals("5.0", result_sample[0][3]) + assertEquals("7", result_sample[0][7]) + assertEquals("4001", result_sample[0][8]) + assertEquals("FULL", result_sample[0][9]) + + sql """drop database if exists test_analyze_mv""" +} + diff --git a/regression-test/suites/statistics/test_basic_statistics.groovy b/regression-test/suites/statistics/test_basic_statistics.groovy index 6ee54baa94..b6cbc25cc8 100644 --- a/regression-test/suites/statistics/test_basic_statistics.groovy +++ b/regression-test/suites/statistics/test_basic_statistics.groovy @@ -48,26 +48,26 @@ suite("test_basic_statistics") { sql """ analyze table ${tbl} with sync""" def result = sql """show column stats ${tbl} (id)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "id") - assertTrue(result[0][1] == "9.0") - assertTrue(result[0][2] == "9.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "36.0") - assertTrue(result[0][5] == "4.0") - assertTrue(result[0][6] == "1") - assertTrue(result[0][7] == "9") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "id") + assertEquals(result[0][2], "9.0") + assertEquals(result[0][3], "9.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "36.0") + assertEquals(result[0][6], "4.0") + assertEquals(result[0][7], "1") + assertEquals(result[0][8], "9") result = sql """show column stats ${tbl} (name)""" - assertTrue(result.size() == 1) - assertTrue(result[0][0] == "name") - assertTrue(result[0][1] == "9.0") - assertTrue(result[0][2] == "9.0") - assertTrue(result[0][3] == "0.0") - assertTrue(result[0][4] == "45.0") - assertTrue(result[0][5] == "5.0") - assertTrue(result[0][6] == "\'name1\'") - assertTrue(result[0][7] == "\'name9\'") + assertEquals(result.size(), 1) + assertEquals(result[0][0], "name") + assertEquals(result[0][2], "9.0") + assertEquals(result[0][3], "9.0") + assertEquals(result[0][4], "0.0") + assertEquals(result[0][5], "45.0") + assertEquals(result[0][6], "5.0") + assertEquals(result[0][7], "\'name1\'") + assertEquals(result[0][8], "\'name9\'") sql """drop stats ${tbl}""" sql """drop table ${tbl}"""