From 427f444ba441197eb7df05cec0ef31392f4a0c98 Mon Sep 17 00:00:00 2001 From: Nikolai Kochetov Date: Thu, 22 Apr 2021 14:26:17 +0300 Subject: [PATCH] Fix prewhere. --- .../MergeTree/MergeTreeDataSelectExecutor.cpp | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp index 9c40340f072..e52c93b03a3 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp @@ -205,9 +205,31 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( const auto & given_select = query_info.query->as(); if (!projection_parts.empty()) { + auto projection_names = query_info.projection_names; + + if (query_info.prewhere_info) + { + const auto prewhere_columns = + (query_info.prewhere_info->alias_actions ? + query_info.prewhere_info->alias_actions : + (query_info.prewhere_info->row_level_filter ? + query_info.prewhere_info->row_level_filter : + query_info.prewhere_info->prewhere_actions))->getRequiredColumns(); + + NameSet added_column(projection_names.begin(), projection_names.end()); + for (const auto & col : prewhere_columns) + { + if (added_column.count(col) == 0) + { + added_column.insert(col); + projection_names.push_back(col); + } + } + } + auto plan = readFromParts( std::move(projection_parts), - query_info.projection_names, // raw columns without key transformation + projection_names, // raw columns without key transformation query_info.aggregate_projection->metadata, query_info, context, @@ -222,7 +244,7 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( { // If `key_actions` is not empty, transform input blocks by adding needed columns // originated from key columns. We already project the block at the end, using - // projection_block, so we can just add more colunms here without worrying + // projection_block, so we can just add more columns here without worrying if (!query_info.key_actions.func_map.empty()) { ASTPtr expr = std::make_shared();