From 6f186d3dd2e67f32ba300272c0b4e15e6333c63e Mon Sep 17 00:00:00 2001 From: Nikita Taranov Date: Fri, 16 Sep 2022 21:54:36 +0200 Subject: [PATCH] Do not return empty blocks from `ConvertingAggregatedToChunksTransform` (#41152) * impl * add test * update test --- .../Transforms/AggregatingTransform.cpp | 14 ++++++--- ...rtingAggregatedToChunksTransform.reference | 6 ++++ ...m_ConvertingAggregatedToChunksTransform.sh | 30 +++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 tests/queries/0_stateless/02418_do_not_return_empty_blocks_from_ConvertingAggregatedToChunksTransform.reference create mode 100755 tests/queries/0_stateless/02418_do_not_return_empty_blocks_from_ConvertingAggregatedToChunksTransform.sh diff --git a/src/Processors/Transforms/AggregatingTransform.cpp b/src/Processors/Transforms/AggregatingTransform.cpp index 4e55081ca48..ca8e9c0c85b 100644 --- a/src/Processors/Transforms/AggregatingTransform.cpp +++ b/src/Processors/Transforms/AggregatingTransform.cpp @@ -248,8 +248,11 @@ private: throw Exception(ErrorCodes::LOGICAL_ERROR, "Some ready chunks expected"); auto & output = outputs.front(); - output.push(std::move(single_level_chunks.back())); + auto chunk = std::move(single_level_chunks.back()); single_level_chunks.pop_back(); + const auto has_rows = chunk.hasRows(); + if (has_rows) + output.push(std::move(chunk)); if (finished && single_level_chunks.empty()) { @@ -257,7 +260,7 @@ private: return Status::Finished; } - return Status::PortFull; + return has_rows ? Status::PortFull : Status::Ready; } /// Read all sources and try to push current bucket. @@ -281,7 +284,10 @@ private: if (!two_level_chunks[current_bucket_num]) return Status::NeedData; - output.push(std::move(two_level_chunks[current_bucket_num])); + auto chunk = std::move(two_level_chunks[current_bucket_num]); + const auto has_rows = chunk.hasRows(); + if (has_rows) + output.push(std::move(chunk)); ++current_bucket_num; if (current_bucket_num == NUM_BUCKETS) @@ -291,7 +297,7 @@ private: return Status::Finished; } - return Status::PortFull; + return has_rows ? Status::PortFull : Status::Ready; } AggregatingTransformParamsPtr params; diff --git a/tests/queries/0_stateless/02418_do_not_return_empty_blocks_from_ConvertingAggregatedToChunksTransform.reference b/tests/queries/0_stateless/02418_do_not_return_empty_blocks_from_ConvertingAggregatedToChunksTransform.reference new file mode 100644 index 00000000000..f2586c9c42a --- /dev/null +++ b/tests/queries/0_stateless/02418_do_not_return_empty_blocks_from_ConvertingAggregatedToChunksTransform.reference @@ -0,0 +1,6 @@ +┌─number─┐ +│ 42 │ +└────────┘ +┌─number─┐ +│ 42 │ +└────────┘ diff --git a/tests/queries/0_stateless/02418_do_not_return_empty_blocks_from_ConvertingAggregatedToChunksTransform.sh b/tests/queries/0_stateless/02418_do_not_return_empty_blocks_from_ConvertingAggregatedToChunksTransform.sh new file mode 100755 index 00000000000..08c7e18e12c --- /dev/null +++ b/tests/queries/0_stateless/02418_do_not_return_empty_blocks_from_ConvertingAggregatedToChunksTransform.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -ue + +unset CLICKHOUSE_LOG_COMMENT + +CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +# shellcheck source=../shell_config.sh +. "$CURDIR"/../shell_config.sh + +${CLICKHOUSE_CURL} \ + $CLICKHOUSE_URL \ + --get \ + --data-urlencode "query= + select number + from numbers_mt(1e6) + where number = 42 + group by number + settings max_threads = 10, max_bytes_before_external_group_by = 1, group_by_two_level_threshold = 1 + format PrettyCompact" + +${CLICKHOUSE_CURL} \ + $CLICKHOUSE_URL \ + --get \ + --data-urlencode "query= + select number + from numbers_mt(1e6) + where number = 42 + group by number + settings max_threads = 10, max_bytes_before_external_group_by = 0, group_by_two_level_threshold = 1 + format PrettyCompact"