ClickHouse/dbms/src/Functions/array/length.cpp

54 lines
1.3 KiB
C++
Raw Normal View History

2018-09-09 23:36:06 +00:00
#include <DataTypes/DataTypeString.h>
#include <Functions/FunctionFactory.h>
#include <Functions/FunctionStringOrArrayToT.h>
namespace DB
{
/** Calculates the length of a string in bytes.
*/
struct LengthImpl
{
static constexpr auto is_fixed_to_constant = true;
static void vector(const ColumnString::Chars & /*data*/, const ColumnString::Offsets & offsets, PaddedPODArray<UInt64> & res)
2018-09-09 23:36:06 +00:00
{
size_t size = offsets.size();
for (size_t i = 0; i < size; ++i)
res[i] = offsets[i] - 1 - offsets[i - 1];
2018-09-09 23:36:06 +00:00
}
static void vector_fixed_to_constant(const ColumnString::Chars & /*data*/, size_t n, UInt64 & res)
2018-09-09 23:36:06 +00:00
{
res = n;
}
static void vector_fixed_to_vector(const ColumnString::Chars & /*data*/, size_t /*n*/, PaddedPODArray<UInt64> & /*res*/)
2018-09-09 23:36:06 +00:00
{
}
static void array(const ColumnString::Offsets & offsets, PaddedPODArray<UInt64> & res)
{
size_t size = offsets.size();
for (size_t i = 0; i < size; ++i)
res[i] = offsets[i] - offsets[i - 1];
2018-09-09 23:36:06 +00:00
}
};
struct NameLength
{
static constexpr auto name = "length";
};
using FunctionLength = FunctionStringOrArrayToT<LengthImpl, NameLength, UInt64>;
void registerFunctionLength(FunctionFactory & factory)
{
factory.registerFunction<FunctionLength>(FunctionFactory::CaseInsensitive);
2018-09-09 23:36:06 +00:00
}
}