Fix functions execution over sparse columns

Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
This commit is contained in:
Azat Khuzhin 2023-10-06 15:50:50 +02:00
parent 70c3f31926
commit ce7f0e5ae7
4 changed files with 29 additions and 3 deletions

View File

@ -38,6 +38,8 @@ public:
}
bool equals(const IDataType & rhs) const override;
bool supportsSparseSerialization() const override { return false; }
};
}

View File

@ -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

View File

@ -0,0 +1,10 @@
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]

View File

@ -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;