Rebuild minmax_count_projection when partition key gets modified

This commit is contained in:
Amos Bird 2023-09-23 17:50:12 +08:00
parent 165b0f0afe
commit 81804ce9ba
No known key found for this signature in database
GPG Key ID: 80D430DCBECFEDB4
3 changed files with 30 additions and 0 deletions

View File

@ -11,6 +11,7 @@
#include <Interpreters/ExpressionActions.h>
#include <Interpreters/addTypeConversionToAST.h>
#include <Interpreters/ExpressionAnalyzer.h>
#include <Interpreters/FunctionNameNormalizer.h>
#include <Interpreters/TreeRewriter.h>
#include <Interpreters/RenameColumnVisitor.h>
#include <Interpreters/GinFilter.h>
@ -937,8 +938,21 @@ void AlterCommands::apply(StorageInMemoryMetadata & metadata, ContextPtr context
/// And in partition key expression
if (metadata_copy.partition_key.definition_ast != nullptr)
{
metadata_copy.partition_key.recalculateWithNewAST(metadata_copy.partition_key.definition_ast, metadata_copy.columns, context);
/// If partition key expression is changed, we also need to rebuild minmax_count_projection
if (!blocksHaveEqualStructure(metadata_copy.partition_key.sample_block, metadata.partition_key.sample_block))
{
auto minmax_columns = metadata_copy.getColumnsRequiredForPartitionKey();
auto partition_key = metadata_copy.partition_key.expression_list_ast->clone();
FunctionNameNormalizer().visit(partition_key.get());
auto primary_key_asts = metadata_copy.primary_key.expression_list_ast->children;
metadata_copy.minmax_count_projection.emplace(ProjectionDescription::getMinMaxCountProjection(
metadata_copy.columns, partition_key, minmax_columns, primary_key_asts, context));
}
}
// /// And in sample key expression
if (metadata_copy.sampling_key.definition_ast != nullptr)
metadata_copy.sampling_key.recalculateWithNewAST(metadata_copy.sampling_key.definition_ast, metadata_copy.columns, context);

View File

@ -0,0 +1,13 @@
DROP TABLE IF EXISTS test;
CREATE TABLE test (type Enum('x'), s String) ENGINE = MergeTree ORDER BY s PARTITION BY type;
INSERT INTO test VALUES ('x', 'Hello');
SELECT type, count() FROM test GROUP BY type ORDER BY type;
ALTER TABLE test MODIFY COLUMN type Enum('x', 'y');
INSERT INTO test VALUES ('y', 'World');
SELECT type, count() FROM test GROUP BY type ORDER BY type;
DROP TABLE test;