mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-10-19 06:50:50 +00:00
47 lines
1.8 KiB
SQL
47 lines
1.8 KiB
SQL
SET group_by_two_level_threshold = 1, max_threads = 1;
|
|
|
|
SELECT
|
|
k,
|
|
anyLast(s)
|
|
FROM
|
|
(
|
|
SELECT
|
|
123456789 AS k,
|
|
'Hello 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890' AS s
|
|
UNION ALL
|
|
SELECT
|
|
234567890,
|
|
'World 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890'
|
|
)
|
|
GROUP BY k
|
|
WITH TOTALS
|
|
HAVING length(anyLast(s)) > 0
|
|
ORDER BY k;
|
|
|
|
/* There was a bug in implementation of WITH TOTALS.
|
|
* When there was more than one block after aggregation,
|
|
* nullptr is passed to IAggregateFunction::merge instead of pointer to valid Arena.
|
|
*
|
|
* To reproduce, we set 'group_by_two_level_threshold' to small value to enable two-level aggregation.
|
|
* Only in two-level aggregation there are many blocks after GROUP BY.
|
|
*
|
|
* Also use UNION ALL in subquery to generate two blocks before GROUP BY.
|
|
* Because two-level aggregation may be triggered only after a block is processed.
|
|
*
|
|
* Use large numbers as a key, because for 8, 16 bit numbers,
|
|
* two-level aggregation is not possible as simple aggregation method is used.
|
|
* These numbers are happy to hash to different buckets and we thus we have two blocks after GROUP BY.
|
|
*
|
|
* Also we use long strings (at least 64 bytes) in aggregation state,
|
|
* because aggregate functions min/max/any/anyLast use Arena only for long enough strings.
|
|
*
|
|
* And we use function 'anyLast' for method IAggregateFunction::merge to be called for every new value.
|
|
*
|
|
* We use useless HAVING (that is always true), because in absense of HAVING,
|
|
* TOTALS are calculated in a simple way in same pass during aggregation, not in TotalsHavingBlockInputStream,
|
|
* and bug doesn't trigger.
|
|
*
|
|
* We use ORDER BY for result of the test to be deterministic.
|
|
* max_threads = 1 for deterministic order of result in subquery and the value of 'anyLast'.
|
|
*/
|