mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 00:52:02 +00:00
Fix TOTALS/ROLLUP/CUBE for aggregate functions with -State and Nullable arguments #12163
This commit is contained in:
parent
f252dd94c8
commit
12e00411b4
@ -2,6 +2,7 @@
|
|||||||
#include <AggregateFunctions/AggregateFunctionNull.h>
|
#include <AggregateFunctions/AggregateFunctionNull.h>
|
||||||
#include <AggregateFunctions/AggregateFunctionNothing.h>
|
#include <AggregateFunctions/AggregateFunctionNothing.h>
|
||||||
#include <AggregateFunctions/AggregateFunctionCount.h>
|
#include <AggregateFunctions/AggregateFunctionCount.h>
|
||||||
|
#include <AggregateFunctions/AggregateFunctionState.h>
|
||||||
#include <AggregateFunctions/AggregateFunctionCombinatorFactory.h>
|
#include <AggregateFunctions/AggregateFunctionCombinatorFactory.h>
|
||||||
#include "registerAggregateFunctions.h"
|
#include "registerAggregateFunctions.h"
|
||||||
|
|
||||||
@ -36,6 +37,19 @@ public:
|
|||||||
const DataTypes & arguments,
|
const DataTypes & arguments,
|
||||||
const Array & params) const override
|
const Array & params) const override
|
||||||
{
|
{
|
||||||
|
/// If applied to aggregate function with -State combinator, we apply -Null combinator to it's nested_function instead of itself.
|
||||||
|
/// Because Nullable AggregateFunctionState does not make sense and ruins the logic of managing aggregate function states.
|
||||||
|
|
||||||
|
if (const AggregateFunctionState * function_state = typeid_cast<const AggregateFunctionState *>(nested_function.get()))
|
||||||
|
{
|
||||||
|
auto transformed_nested_function = transformAggregateFunction(function_state->getNestedFunction(), properties, arguments, params);
|
||||||
|
|
||||||
|
return std::make_shared<AggregateFunctionState>(
|
||||||
|
transformed_nested_function,
|
||||||
|
transformed_nested_function->getArgumentTypes(),
|
||||||
|
transformed_nested_function->getParameters());
|
||||||
|
}
|
||||||
|
|
||||||
bool has_nullable_types = false;
|
bool has_nullable_types = false;
|
||||||
bool has_null_types = false;
|
bool has_null_types = false;
|
||||||
for (const auto & arg_type : arguments)
|
for (const auto & arg_type : arguments)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#include <Functions/FunctionFactory.h>
|
#include <Functions/FunctionFactory.h>
|
||||||
|
|
||||||
// TODO include this last because of a broken roaring header. See the comment
|
// TODO include this last because of a broken roaring header. See the comment inside.
|
||||||
// inside.
|
|
||||||
#include <Functions/FunctionsBitmap.h>
|
#include <Functions/FunctionsBitmap.h>
|
||||||
|
|
||||||
|
|
||||||
|
64
tests/queries/0_stateless/01380_nullable_state.reference
Normal file
64
tests/queries/0_stateless/01380_nullable_state.reference
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
0100012CCBC234
|
||||||
|
|
||||||
|
0100012CCBC234
|
||||||
|
---
|
||||||
|
0100012CCBC234
|
||||||
|
|
||||||
|
0100012CCBC234
|
||||||
|
---
|
||||||
|
0100012CCBC234
|
||||||
|
|
||||||
|
0100012CCBC234
|
||||||
|
---
|
||||||
|
0100012CCBC234
|
||||||
|
|
||||||
|
0100012CCBC234
|
||||||
|
---
|
||||||
|
0100012CCBC234
|
||||||
|
|
||||||
|
0100012CCBC234
|
||||||
|
---
|
||||||
|
0100012CCBC234
|
||||||
|
|
||||||
|
0100012CCBC234
|
||||||
|
---
|
||||||
|
1
|
||||||
|
|
||||||
|
1
|
||||||
|
---
|
||||||
|
0 1
|
||||||
|
1 1
|
||||||
|
2 1
|
||||||
|
3 1
|
||||||
|
4 1
|
||||||
|
|
||||||
|
0 1
|
||||||
|
---
|
||||||
|
0 1
|
||||||
|
1 1
|
||||||
|
2 1
|
||||||
|
3 1
|
||||||
|
4 1
|
||||||
|
|
||||||
|
0 1
|
||||||
|
---
|
||||||
|
0 [0]
|
||||||
|
1 [0]
|
||||||
|
2 [0]
|
||||||
|
3 [0]
|
||||||
|
4 [0]
|
||||||
|
|
||||||
|
0 [0]
|
||||||
|
---
|
||||||
|
0 [0]
|
||||||
|
1 [0]
|
||||||
|
2 [0]
|
||||||
|
3 [0]
|
||||||
|
4 [0]
|
||||||
|
|
||||||
|
\N [0]
|
||||||
|
---
|
||||||
|
0100012CCBC234
|
||||||
|
---
|
||||||
|
0100012CCBC234
|
||||||
|
---
|
26
tests/queries/0_stateless/01380_nullable_state.sql
Normal file
26
tests/queries/0_stateless/01380_nullable_state.sql
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
SELECT hex(toString(uniqState(toNullable(1)))) WITH TOTALS;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT hex(toString(uniqState(x))) FROM (SELECT toNullable(1) AS x) WITH TOTALS;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT DISTINCT hex(toString(uniqState(x))) FROM (SELECT materialize(1) AS k, toNullable(1) AS x FROM numbers(1)) GROUP BY k WITH TOTALS ORDER BY k;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT DISTINCT hex(toString(uniqState(x))) FROM (SELECT materialize(1) AS k, toNullable(1) AS x FROM numbers(10)) GROUP BY k WITH TOTALS ORDER BY k;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT DISTINCT hex(toString(uniqState(x))) FROM (SELECT intDiv(number, 3) AS k, toNullable(1) AS x FROM numbers(10)) GROUP BY k WITH TOTALS ORDER BY k;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT DISTINCT hex(toString(uniqState(x))) FROM (SELECT intDiv(number, 3) AS k, toNullable(1) AS x FROM system.numbers LIMIT 100000) GROUP BY k WITH TOTALS ORDER BY k;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT DISTINCT arrayUniq(finalizeAggregation(groupArrayState(x))) FROM (SELECT intDiv(number, 3) AS k, toNullable(1) AS x FROM system.numbers LIMIT 100000) GROUP BY k WITH TOTALS ORDER BY k;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT k, finalizeAggregation(uniqState(x)) FROM (SELECT intDiv(number, 3) AS k, toNullable(1) AS x FROM system.numbers LIMIT 100000) GROUP BY k WITH TOTALS ORDER BY k LIMIT 5;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT k, finalizeAggregation(uniqState(x)) FROM (WITH toNullable(number = 3 ? 3 : 1) AS d SELECT intDiv(number, 3) AS k, number % d AS x FROM system.numbers LIMIT 100000) GROUP BY k WITH TOTALS ORDER BY k LIMIT 5;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT k, finalizeAggregation(quantilesTimingState(0.5)(x)) FROM (WITH toNullable(number = 3 ? 3 : 1) AS d SELECT intDiv(number, 3) AS k, number % d AS x FROM system.numbers LIMIT 100000) GROUP BY k WITH TOTALS ORDER BY k LIMIT 5;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT k, finalizeAggregation(quantilesTimingState(0.5)(x)) FROM (SELECT intDiv(number, if(number = 9223372036854775807, -2, if(number = 3, number = if(number = 1, NULL, 3), 1)) AS d) AS k, number % d AS x FROM system.numbers LIMIT 100000) GROUP BY k WITH TOTALS ORDER BY k ASC LIMIT 5;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT DISTINCT hex(toString(uniqState(x))) FROM (SELECT materialize(1) AS k, toNullable(1) AS x FROM numbers(1)) GROUP BY k WITH ROLLUP ORDER BY k;
|
||||||
|
SELECT '---';
|
||||||
|
SELECT DISTINCT hex(toString(uniqState(x))) FROM (SELECT materialize(1) AS k, toNullable(1) AS x FROM numbers(1)) GROUP BY k WITH CUBE ORDER BY k;
|
||||||
|
SELECT '---';
|
Loading…
Reference in New Issue
Block a user