mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-19 06:01:57 +00:00
Fix crash in GROUPING SETS
This commit is contained in:
parent
b27af90202
commit
9ae9048184
@ -340,8 +340,6 @@ void ExpressionAnalyzer::analyzeAggregation(ActionsDAGPtr & temp_actions)
|
||||
if (getContext()->getSettingsRef().enable_positional_arguments)
|
||||
replaceForPositionalArguments(group_asts[i], select_query, ASTSelectQuery::Expression::GROUP_BY);
|
||||
|
||||
getRootActionsNoMakeSet(group_asts[i], true, temp_actions, false);
|
||||
|
||||
if (select_query->group_by_with_grouping_sets)
|
||||
{
|
||||
ASTs group_elements_ast;
|
||||
@ -354,6 +352,8 @@ void ExpressionAnalyzer::analyzeAggregation(ActionsDAGPtr & temp_actions)
|
||||
|
||||
for (ssize_t j = 0; j < ssize_t(group_elements_ast.size()); ++j)
|
||||
{
|
||||
getRootActionsNoMakeSet(group_elements_ast[j], true, temp_actions, false);
|
||||
|
||||
ssize_t group_size = group_elements_ast.size();
|
||||
const auto & column_name = group_elements_ast[j]->getColumnName();
|
||||
const auto * node = temp_actions->tryFindInIndex(column_name);
|
||||
@ -366,6 +366,8 @@ void ExpressionAnalyzer::analyzeAggregation(ActionsDAGPtr & temp_actions)
|
||||
/// Constant expressions have non-null column pointer at this stage.
|
||||
if (node->column && isColumnConst(*node->column))
|
||||
{
|
||||
select_query->group_by_with_constant_keys = true;
|
||||
|
||||
/// But don't remove last key column if no aggregate functions, otherwise aggregation will not work.
|
||||
if (!aggregate_descriptions.empty() || group_size > 1)
|
||||
{
|
||||
@ -399,6 +401,8 @@ void ExpressionAnalyzer::analyzeAggregation(ActionsDAGPtr & temp_actions)
|
||||
}
|
||||
else
|
||||
{
|
||||
getRootActionsNoMakeSet(group_asts[i], true, temp_actions, false);
|
||||
|
||||
const auto & column_name = group_asts[i]->getColumnName();
|
||||
const auto * node = temp_actions->tryFindInIndex(column_name);
|
||||
if (!node)
|
||||
|
@ -2063,12 +2063,15 @@ void InterpreterSelectQuery::initAggregatorParams(
|
||||
for (const auto & key : aggregation_keys)
|
||||
{
|
||||
size_t key_name_pos = current_data_stream_header.getPositionByName(key.name);
|
||||
keys_set.insert(key_name_pos);
|
||||
if (!keys_set.contains(key_name_pos))
|
||||
{
|
||||
keys_set.insert(key_name_pos);
|
||||
all_keys.push_back(key_name_pos);
|
||||
}
|
||||
keys.push_back(key_name_pos);
|
||||
}
|
||||
keys_vector.push_back(keys);
|
||||
}
|
||||
all_keys.assign(keys_set.begin(), keys_set.end());
|
||||
|
||||
params_ptr = std::make_unique<Aggregator::Params>(
|
||||
current_data_stream_header,
|
||||
|
156
tests/queries/0_stateless/01883_grouping_sets_crash.reference
Normal file
156
tests/queries/0_stateless/01883_grouping_sets_crash.reference
Normal file
@ -0,0 +1,156 @@
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
6 6
|
||||
7 7
|
||||
8 8
|
||||
9 9
|
||||
10 10
|
||||
SECOND QUERY:
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
5 5
|
||||
6 6
|
||||
7 7
|
||||
8 8
|
||||
9 9
|
||||
10 10
|
||||
THIRD QUERY:
|
||||
\N 1 0 0
|
||||
\N 2 0 0
|
||||
\N 3 0 0
|
||||
\N 4 0 0
|
||||
\N 5 0 0
|
||||
\N 1 0 0
|
||||
\N 2 0 0
|
||||
\N 3 0 0
|
||||
\N 4 0 0
|
||||
\N 5 0 0
|
||||
\N 0 10 10
|
||||
\N 0 9 9
|
||||
\N 0 8 8
|
||||
\N 0 7 7
|
||||
\N 0 6 6
|
||||
\N 0 5 5
|
||||
\N 0 4 4
|
||||
\N 0 3 3
|
||||
\N 0 2 2
|
||||
\N 0 1 1
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
||||
\N 0 0 0
|
64
tests/queries/0_stateless/01883_grouping_sets_crash.sql
Normal file
64
tests/queries/0_stateless/01883_grouping_sets_crash.sql
Normal file
@ -0,0 +1,64 @@
|
||||
DROP TABLE IF EXISTS grouping_sets;
|
||||
|
||||
CREATE TABLE grouping_sets(fact_1_id Int32, fact_2_id Int32, fact_3_id Int32, fact_4_id Int32, sales_value Int32) ENGINE = Memory;
|
||||
|
||||
INSERT INTO grouping_sets
|
||||
SELECT
|
||||
number % 2 + 1 AS fact_1_id,
|
||||
number % 5 + 1 AS fact_2_id,
|
||||
number % 10 + 1 AS fact_3_id,
|
||||
number % 10 + 1 AS fact_4_id,
|
||||
number % 100 AS sales_value
|
||||
FROM system.numbers limit 1000;
|
||||
|
||||
SELECT
|
||||
fact_3_id,
|
||||
fact_4_id
|
||||
FROM grouping_sets
|
||||
GROUP BY
|
||||
GROUPING SETS (
|
||||
('wo\0ldworldwo\0ldworld'),
|
||||
(fact_3_id, fact_4_id))
|
||||
ORDER BY
|
||||
fact_3_id, fact_4_id;
|
||||
|
||||
SELECT 'SECOND QUERY:';
|
||||
|
||||
SELECT
|
||||
fact_3_id,
|
||||
fact_4_id
|
||||
FROM grouping_sets
|
||||
GROUP BY
|
||||
GROUPING SETS (
|
||||
(fact_1_id, fact_2_id),
|
||||
((-9223372036854775808, NULL, (tuple(1.), (tuple(1.), 1048576), 65535))),
|
||||
((tuple(3.4028234663852886e38), (tuple(1024), -2147483647), NULL)),
|
||||
(fact_3_id, fact_4_id))
|
||||
ORDER BY
|
||||
(NULL, ('256', (tuple(NULL), NULL), NULL, NULL), NULL) ASC,
|
||||
fact_1_id DESC NULLS FIRST,
|
||||
fact_2_id DESC NULLS FIRST,
|
||||
fact_4_id ASC;
|
||||
|
||||
SELECT 'THIRD QUERY:';
|
||||
|
||||
SELECT
|
||||
extractAllGroups(NULL, 'worldworldworldwo\0ldworldworldworldwo\0ld'),
|
||||
fact_2_id,
|
||||
fact_3_id,
|
||||
fact_4_id
|
||||
FROM grouping_sets
|
||||
GROUP BY
|
||||
GROUPING SETS (
|
||||
(sales_value),
|
||||
(fact_1_id, fact_2_id),
|
||||
('wo\0ldworldwo\0ldworld'),
|
||||
(fact_3_id, fact_4_id))
|
||||
ORDER BY
|
||||
fact_1_id DESC NULLS LAST,
|
||||
fact_1_id DESC NULLS FIRST,
|
||||
fact_2_id ASC,
|
||||
fact_3_id DESC NULLS FIRST,
|
||||
fact_4_id ASC;
|
||||
|
||||
DROP TABLE IF EXISTS grouping_sets;
|
Loading…
Reference in New Issue
Block a user