diff --git a/src/Interpreters/ColumnAliasesVisitor.cpp b/src/Interpreters/ColumnAliasesVisitor.cpp index 48fcc44eac7..0028f4da25c 100644 --- a/src/Interpreters/ColumnAliasesVisitor.cpp +++ b/src/Interpreters/ColumnAliasesVisitor.cpp @@ -26,16 +26,16 @@ void ColumnAliasesMatcher::visit(ASTPtr & ast, Data & data) { if (auto column_name = IdentifierSemantic::getColumnName(*node)) { - if (const auto column_default = data.columns.getDefault(column_name.value())) + if (const auto column_default = data.columns.getDefault(*column_name)) { - if (column_default.value().kind == ColumnDefaultKind::Alias) + if (column_default->kind == ColumnDefaultKind::Alias) { const auto alias_columns = data.columns.getAliases(); for (const auto & alias_column : alias_columns) { - if (alias_column.name == column_name.value()) + if (alias_column.name == *column_name) { - ast = addTypeConversionToAST(column_default.value().expression->clone(), alias_column.type->getName()); + ast = addTypeConversionToAST(column_default->expression->clone(), alias_column.type->getName()); //revisit ast to track recursive alias columns Visitor(data).visit(ast); break; diff --git a/src/Interpreters/InterpreterSelectQuery.cpp b/src/Interpreters/InterpreterSelectQuery.cpp index 6a4561fb113..0f36a9d64ad 100644 --- a/src/Interpreters/InterpreterSelectQuery.cpp +++ b/src/Interpreters/InterpreterSelectQuery.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -1182,7 +1183,7 @@ void InterpreterSelectQuery::executeFetchColumns( else // It's possible to optimize count() given only partition predicates { SelectQueryInfo temp_query_info; - temp_query_info.query = query_ptr; + temp_query_info.query = replaceAliasColumnsInFilter(query_ptr->clone(), storage->getInMemoryMetadata().getColumns()); temp_query_info.syntax_analyzer_result = syntax_analyzer_result; temp_query_info.sets = query_analyzer->getPreparedSets(); num_rows = storage->totalRowsByPartitionPredicate(temp_query_info, *context); diff --git a/src/Interpreters/replaceAliasColumnsInFilter.cpp b/src/Interpreters/replaceAliasColumnsInFilter.cpp new file mode 100644 index 00000000000..7d113be88c7 --- /dev/null +++ b/src/Interpreters/replaceAliasColumnsInFilter.cpp @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +namespace DB +{ + +ASTPtr replaceAliasColumnsInFilter(ASTPtr && ast, const ColumnsDescription & columns) +{ + auto & temp_select = ast->as(); + ColumnAliasesVisitor::Data aliase_column_data(columns); + ColumnAliasesVisitor aliase_column_visitor(aliase_column_data); + if (temp_select.where()) + aliase_column_visitor.visit(temp_select.refWhere()); + if (temp_select.prewhere()) + aliase_column_visitor.visit(temp_select.refPrewhere()); + + return ast; +} + +} diff --git a/src/Interpreters/replaceAliasColumnsInFilter.h b/src/Interpreters/replaceAliasColumnsInFilter.h new file mode 100644 index 00000000000..c7599ad1725 --- /dev/null +++ b/src/Interpreters/replaceAliasColumnsInFilter.h @@ -0,0 +1,12 @@ +#pragma once + +#include +#include + +namespace DB +{ + +class ColumnsDescription; +ASTPtr replaceAliasColumnsInFilter(ASTPtr && ast, const ColumnsDescription & columns); + +} diff --git a/src/Interpreters/ya.make b/src/Interpreters/ya.make index e2e2f1c3543..0b88527ace4 100644 --- a/src/Interpreters/ya.make +++ b/src/Interpreters/ya.make @@ -153,6 +153,7 @@ SRCS( interpretSubquery.cpp join_common.cpp loadMetadata.cpp + replaceAliasColumnsInFilter.cpp sortBlock.cpp ) diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp index ea9ece5fd4f..0d7e29cffd5 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -214,14 +215,7 @@ QueryPlanPtr MergeTreeDataSelectExecutor::readFromParts( SelectQueryInfo query_info_for_index = query_info; if (!metadata_snapshot->getColumns().getAliases().empty()) { - query_info_for_index.query = query_info.query->clone(); - auto & temp_select = query_info_for_index.query->as(); - ColumnAliasesVisitor::Data aliase_column_data(metadata_snapshot->getColumns()); - ColumnAliasesVisitor aliase_column_visitor(aliase_column_data); - if (temp_select.where()) - aliase_column_visitor.visit(temp_select.refWhere()); - if (temp_select.prewhere()) - aliase_column_visitor.visit(temp_select.refPrewhere()); + query_info_for_index.query = replaceAliasColumnsInFilter(query_info.query->clone(), metadata_snapshot->getColumns()); } KeyCondition key_condition(query_info_for_index, context, primary_key_columns, primary_key.expression);