mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 16:12:01 +00:00
dbms: fixed error with WITH TOTALS and group_by_overflow_mode [#METR-14604].
This commit is contained in:
parent
715f5bf8d1
commit
819f13801d
@ -520,6 +520,24 @@ struct AggregatedDataVariants : private boost::noncopyable
|
||||
}
|
||||
}
|
||||
|
||||
/// Размер без учёта строчки, в которую записываются данные для расчёта TOTALS.
|
||||
size_t sizeWithoutOverflowRow() const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case Type::EMPTY: return 0;
|
||||
case Type::without_key: return 1;
|
||||
|
||||
#define M(NAME, IS_TWO_LEVEL) \
|
||||
case Type::NAME: return NAME->data.size();
|
||||
APPLY_FOR_AGGREGATED_VARIANTS(M)
|
||||
#undef M
|
||||
|
||||
default:
|
||||
throw Exception("Unknown aggregated data variant.", ErrorCodes::UNKNOWN_AGGREGATED_DATA_VARIANT);
|
||||
}
|
||||
}
|
||||
|
||||
const char * getMethodName() const
|
||||
{
|
||||
switch (type)
|
||||
|
@ -637,7 +637,7 @@ bool Aggregator::executeOnBlock(Block & block, AggregatedDataVariants & result,
|
||||
}
|
||||
}
|
||||
|
||||
size_t result_size = result.size();
|
||||
size_t result_size = result.sizeWithoutOverflowRow();
|
||||
|
||||
/// Если результат уже достаточно большой, и его можно сконвертировать в двухуровневую хэш-таблицу.
|
||||
constexpr auto TWO_LEVEL_HASH_TABLE_THRESHOLD = 30000;
|
||||
@ -889,7 +889,7 @@ BlocksList Aggregator::prepareBlocksAndFillWithoutKey(AggregatedDataVariants & d
|
||||
|
||||
BlocksList Aggregator::prepareBlocksAndFillSingleLevel(AggregatedDataVariants & data_variants, bool final) const
|
||||
{
|
||||
size_t rows = data_variants.size();
|
||||
size_t rows = data_variants.sizeWithoutOverflowRow();
|
||||
|
||||
auto filler = [&data_variants, this](
|
||||
ColumnPlainPtrs & key_columns,
|
||||
@ -1039,7 +1039,7 @@ BlocksList Aggregator::convertToBlocks(AggregatedDataVariants & data_variants, b
|
||||
return blocks;
|
||||
|
||||
std::unique_ptr<boost::threadpool::pool> thread_pool;
|
||||
if (max_threads > 1 && data_variants.size() > 100000 /// TODO Сделать настраиваемый порог.
|
||||
if (max_threads > 1 && data_variants.sizeWithoutOverflowRow() > 100000 /// TODO Сделать настраиваемый порог.
|
||||
&& data_variants.isTwoLevel()) /// TODO Использовать общий тред-пул с функцией merge.
|
||||
thread_pool.reset(new boost::threadpool::pool(max_threads));
|
||||
|
||||
|
@ -0,0 +1,12 @@
|
||||
0 1
|
||||
|
||||
0 1
|
||||
0 1
|
||||
|
||||
0 1
|
||||
0 1
|
||||
|
||||
0 1
|
||||
0 1
|
||||
|
||||
0 1
|
14
dbms/tests/queries/0_stateless/00106_totals_after_having.sql
Normal file
14
dbms/tests/queries/0_stateless/00106_totals_after_having.sql
Normal file
@ -0,0 +1,14 @@
|
||||
SET max_rows_to_group_by = 100000;
|
||||
SET group_by_overflow_mode = 'any';
|
||||
|
||||
SET totals_mode = 'after_having_auto';
|
||||
SELECT dummy, count() GROUP BY dummy WITH TOTALS;
|
||||
|
||||
SET totals_mode = 'after_having_inclusive';
|
||||
SELECT dummy, count() GROUP BY dummy WITH TOTALS;
|
||||
|
||||
SET totals_mode = 'after_having_exclusive';
|
||||
SELECT dummy, count() GROUP BY dummy WITH TOTALS;
|
||||
|
||||
SET totals_mode = 'before_having';
|
||||
SELECT dummy, count() GROUP BY dummy WITH TOTALS;
|
Loading…
Reference in New Issue
Block a user