mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 08:32:02 +00:00
fix arguments check
This commit is contained in:
parent
a784b828ce
commit
8fc1ddd646
@ -1152,12 +1152,17 @@ class FunctionBinaryArithmetic : public IFunction
|
||||
&& checkDataType<DataTypeAggregateFunction>(type1.get());
|
||||
}
|
||||
|
||||
/// Multiply aggregation state by integer constant: by merging it with itself specified number of times.
|
||||
void executeAggregateMultiply(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) const
|
||||
{
|
||||
ColumnNumbers new_arguments = arguments;
|
||||
if (checkDataType<DataTypeAggregateFunction>(block.getByPosition(new_arguments[1]).type.get()))
|
||||
std::swap(new_arguments[0], new_arguments[1]);
|
||||
|
||||
if (!block.getByPosition(new_arguments[1]).column->isColumnConst())
|
||||
throw Exception{"Illegal column " + block.getByPosition(new_arguments[1]).column->getName()
|
||||
+ " of argument of aggregation state multiply. Should be integer constant", ErrorCodes::ILLEGAL_COLUMN};
|
||||
|
||||
const ColumnAggregateFunction * column = typeid_cast<const ColumnAggregateFunction *>(block.getByPosition(new_arguments[0]).column.get());
|
||||
IAggregateFunction * function = column->getAggregateFunction().get();
|
||||
|
||||
@ -1201,14 +1206,14 @@ class FunctionBinaryArithmetic : public IFunction
|
||||
block.getByPosition(result).column = std::move(column_to);
|
||||
}
|
||||
|
||||
/// Merge two aggregation states together.
|
||||
void executeAggregateAddition(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) const
|
||||
{
|
||||
const ColumnAggregateFunction * columns[2];
|
||||
for (size_t i = 0; i < 2; ++i)
|
||||
columns[i] = typeid_cast<const ColumnAggregateFunction *>(block.getByPosition(arguments[i]).column.get());
|
||||
|
||||
auto arena = std::make_shared<Arena>();
|
||||
auto column_to = ColumnAggregateFunction::create(columns[0]->getAggregateFunction(), Arenas(1, arena));
|
||||
auto column_to = ColumnAggregateFunction::create(columns[0]->getAggregateFunction());
|
||||
column_to->reserve(input_rows_count);
|
||||
|
||||
for(size_t i = 0; i < input_rows_count; ++i)
|
||||
@ -1270,17 +1275,9 @@ public:
|
||||
/// Special case - addition of two aggregate functions states
|
||||
if (isAggregateAddition(arguments[0], arguments[1]))
|
||||
{
|
||||
const DataTypeAggregateFunction * new_arguments[2];
|
||||
for (size_t i = 0; i < 2; ++i)
|
||||
new_arguments[i] = typeid_cast<const DataTypeAggregateFunction *>(arguments[i].get());
|
||||
|
||||
if (!new_arguments[0]->equals(*new_arguments[1]))
|
||||
if (!arguments[0]->equals(*arguments[1]))
|
||||
throw Exception("Cannot add aggregate states of different functions: "
|
||||
+ new_arguments[0]->getFunctionName() + " and " + new_arguments[1]->getFunctionName(), ErrorCodes::CANNOT_ADD_DIFFERENT_AGGREGATE_STATES);
|
||||
|
||||
if (!new_arguments[0]->getReturnType()->equals(*new_arguments[1]->getReturnType().get()))
|
||||
throw Exception("Cannot add aggregate states with different return types: "
|
||||
+ new_arguments[0]->getReturnType()->getName() + " and " + new_arguments[1]->getReturnType()->getName(), ErrorCodes::CANNOT_ADD_DIFFERENT_AGGREGATE_STATES);
|
||||
+ arguments[0]->getName() + " and " + arguments[1]->getName(), ErrorCodes::CANNOT_ADD_DIFFERENT_AGGREGATE_STATES);
|
||||
|
||||
return arguments[0];
|
||||
}
|
||||
|
@ -19,4 +19,6 @@ SELECT groupArrayMerge(y * 5) FROM (SELECT groupArrayState(x) AS y FROM (SELECT
|
||||
SELECT groupArrayMerge(2)(y * 5) FROM (SELECT groupArrayState(2)(x) AS y FROM (SELECT 1 AS x));
|
||||
SELECT groupUniqArrayMerge(y * 5) FROM (SELECT groupUniqArrayState(x) AS y FROM (SELECT 1 AS x));
|
||||
|
||||
SELECT sumMerge(y * a) FROM (SELECT a, sumState(b) AS y FROM test.mult_aggregation GROUP BY a); -- { serverError 44}
|
||||
|
||||
DROP TABLE IF EXISTS test.mult_aggregation;
|
||||
|
@ -17,3 +17,5 @@ SELECT uniqMerge(x + y) FROM (SELECT uniqState(a) as x, uniqState(b) as y FROM a
|
||||
|
||||
SELECT arraySort(groupArrayMerge(x + y)) FROM (SELECT groupArrayState(a) AS x, groupArrayState(b) as y FROM add_aggregate);
|
||||
SELECT arraySort(groupUniqArrayMerge(x + y)) FROM (SELECT groupUniqArrayState(a) AS x, groupUniqArrayState(b) as y FROM add_aggregate);
|
||||
|
||||
DROP TABLE IF EXISTS add_aggregate
|
Loading…
Reference in New Issue
Block a user