ClickHouse
58 строк · 1.7 Кб
1#include <Functions/IFunction.h>2#include <Functions/FunctionFactory.h>3#include <DataTypes/DataTypeLowCardinality.h>4#include <Columns/ColumnLowCardinality.h>5#include <Common/typeid_cast.h>6
7
8namespace DB9{
10namespace
11{
12
13class FunctionToLowCardinality: public IFunction14{
15public:16static constexpr auto name = "toLowCardinality";17static FunctionPtr create(ContextPtr) { return std::make_shared<FunctionToLowCardinality>(); }18
19String getName() const override { return name; }20
21size_t getNumberOfArguments() const override { return 1; }22
23bool useDefaultImplementationForNulls() const override { return false; }24bool useDefaultImplementationForConstants() const override { return true; }25bool useDefaultImplementationForLowCardinalityColumns() const override { return false; }26bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }27
28DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override29{30if (arguments[0]->lowCardinality())31return arguments[0];32
33return std::make_shared<DataTypeLowCardinality>(arguments[0]);34}35
36ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr & res_type, size_t /*input_rows_count*/) const override37{38const auto & arg = arguments[0];39
40if (arg.type->lowCardinality())41return arg.column;42else43{44auto column = res_type->createColumn();45typeid_cast<ColumnLowCardinality &>(*column).insertRangeFromFullColumn(*arg.column, 0, arg.column->size());46return column;47}48}49};50
51}
52
53REGISTER_FUNCTION(ToLowCardinality)54{
55factory.registerFunction<FunctionToLowCardinality>();56}
57
58}
59