mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-21 09:10:48 +00:00
Fix functions execution over sparse columns
Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
This commit is contained in:
parent
70c3f31926
commit
ce7f0e5ae7
@ -38,6 +38,8 @@ public:
|
||||
}
|
||||
|
||||
bool equals(const IDataType & rhs) const override;
|
||||
|
||||
bool supportsSparseSerialization() const override { return false; }
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <Common/assert_cast.h>
|
||||
#include <Common/SipHash.h>
|
||||
#include <Core/Block.h>
|
||||
#include <Core/TypeId.h>
|
||||
#include <Columns/ColumnConst.h>
|
||||
#include <Columns/ColumnNullable.h>
|
||||
#include <Columns/ColumnTuple.h>
|
||||
@ -310,7 +311,10 @@ ColumnPtr IExecutableFunction::executeWithoutSparseColumns(const ColumnsWithType
|
||||
|
||||
ColumnPtr IExecutableFunction::execute(const ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, size_t input_rows_count, bool dry_run) const
|
||||
{
|
||||
if (useDefaultImplementationForSparseColumns())
|
||||
bool use_default_implementation_for_sparse_columns = useDefaultImplementationForSparseColumns();
|
||||
/// DataTypeFunction does not supports obtaining default (isDefaultAt())
|
||||
/// ColumnFunction does not uspport getting specific values
|
||||
if (result_type->getTypeId() != TypeIndex::Function && use_default_implementation_for_sparse_columns)
|
||||
{
|
||||
size_t num_sparse_columns = 0;
|
||||
size_t num_full_columns = 0;
|
||||
@ -373,8 +377,14 @@ ColumnPtr IExecutableFunction::execute(const ColumnsWithTypeAndName & arguments,
|
||||
convertSparseColumnsToFull(columns_without_sparse);
|
||||
return executeWithoutSparseColumns(columns_without_sparse, result_type, input_rows_count, dry_run);
|
||||
}
|
||||
|
||||
return executeWithoutSparseColumns(arguments, result_type, input_rows_count, dry_run);
|
||||
else if (use_default_implementation_for_sparse_columns)
|
||||
{
|
||||
auto columns_without_sparse = arguments;
|
||||
convertSparseColumnsToFull(columns_without_sparse);
|
||||
return executeWithoutSparseColumns(columns_without_sparse, result_type, input_rows_count, dry_run);
|
||||
}
|
||||
else
|
||||
return executeWithoutSparseColumns(arguments, result_type, input_rows_count, dry_run);
|
||||
}
|
||||
|
||||
void IFunctionOverloadResolver::checkNumberOfArguments(size_t number_of_arguments) const
|
||||
|
@ -0,0 +1,10 @@
|
||||
[0]
|
||||
[0]
|
||||
[0]
|
||||
[0]
|
||||
[0]
|
||||
[0]
|
||||
[0]
|
||||
[0]
|
||||
[0]
|
||||
[0]
|
@ -0,0 +1,4 @@
|
||||
drop table if exists test;
|
||||
create table test (key Int) engine=MergeTree() order by tuple() settings ratio_of_defaults_for_sparse_serialization=0.1;
|
||||
insert into test select 0 from numbers(10);
|
||||
select arrayMap(x -> (x <= key), [1]) from test;
|
Loading…
Reference in New Issue
Block a user