From cebc38fa6e8fe6e9a4bbc5db774fa75f558a76c2 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 9 Oct 2022 05:30:25 +0200 Subject: [PATCH 1/2] Fix a bug with projections and aggregate_functions_null_for_empty setting --- src/Storages/MergeTree/MergeTreeData.cpp | 3 ++- src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp | 5 +++++ ...460_projections_and_aggregate_null_if_empty.reference | 1 + .../02460_projections_and_aggregate_null_if_empty.sh | 9 +++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 tests/queries/0_stateless/02460_projections_and_aggregate_null_if_empty.reference create mode 100755 tests/queries/0_stateless/02460_projections_and_aggregate_null_if_empty.sh diff --git a/src/Storages/MergeTree/MergeTreeData.cpp b/src/Storages/MergeTree/MergeTreeData.cpp index b4961a1cdd95..e0dc37a571ed 100644 --- a/src/Storages/MergeTree/MergeTreeData.cpp +++ b/src/Storages/MergeTree/MergeTreeData.cpp @@ -5676,7 +5676,8 @@ std::optional MergeTreeData::getQueryProcessingStageWithAgg { const auto & metadata_snapshot = storage_snapshot->metadata; const auto & settings = query_context->getSettingsRef(); - if (!settings.allow_experimental_projection_optimization || query_info.ignore_projections || query_info.is_projection_query) + if (!settings.allow_experimental_projection_optimization || query_info.ignore_projections || query_info.is_projection_query + || settings.aggregate_functions_null_for_empty /* projections don't work correctly with this setting */) return std::nullopt; // Currently projections don't support parallel replicas reading yet. diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp index 91ecb3a37a06..a51aedbf1d67 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp @@ -176,6 +176,11 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( "No projection is used when allow_experimental_projection_optimization = 1 and force_optimize_projection = 1", ErrorCodes::PROJECTION_NOT_USED); + if (settings.force_optimize_projection && settings.aggregate_functions_null_for_empty) + throw Exception( + "Projections cannot be used with 'aggregate_functions_null_for_empty' setting enabled.", + ErrorCodes::PROJECTION_NOT_USED); + return plan; } diff --git a/tests/queries/0_stateless/02460_projections_and_aggregate_null_if_empty.reference b/tests/queries/0_stateless/02460_projections_and_aggregate_null_if_empty.reference new file mode 100644 index 000000000000..54f97aaa2e65 --- /dev/null +++ b/tests/queries/0_stateless/02460_projections_and_aggregate_null_if_empty.reference @@ -0,0 +1 @@ +20220920 diff --git a/tests/queries/0_stateless/02460_projections_and_aggregate_null_if_empty.sh b/tests/queries/0_stateless/02460_projections_and_aggregate_null_if_empty.sh new file mode 100755 index 000000000000..6e96b9b8afcd --- /dev/null +++ b/tests/queries/0_stateless/02460_projections_and_aggregate_null_if_empty.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Tags: no-fasttest +# Tag no-fasttest: depends on bzip2 + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +${CLICKHOUSE_LOCAL} --aggregate_functions_null_for_empty=1 --multiquery --query "create table test_date (date Int32) ENGINE = MergeTree ORDER BY (date) as select 20220920; SELECT max(date) FROM test_date"; From e27dbf43693e8e42a43749cf242dbfb46e7da69c Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 9 Oct 2022 18:27:47 +0300 Subject: [PATCH 2/2] Update MergeTreeDataSelectExecutor.cpp --- src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp index a51aedbf1d67..91ecb3a37a06 100644 --- a/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp +++ b/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp @@ -176,11 +176,6 @@ QueryPlanPtr MergeTreeDataSelectExecutor::read( "No projection is used when allow_experimental_projection_optimization = 1 and force_optimize_projection = 1", ErrorCodes::PROJECTION_NOT_USED); - if (settings.force_optimize_projection && settings.aggregate_functions_null_for_empty) - throw Exception( - "Projections cannot be used with 'aggregate_functions_null_for_empty' setting enabled.", - ErrorCodes::PROJECTION_NOT_USED); - return plan; }