1#include "duckdb/function/scalar/string_functions.hpp"
2
3#include "duckdb/common/exception.hpp"
4#include "duckdb/common/vector_operations/vector_operations.hpp"
5#include "utf8proc.hpp"
6
7using namespace std;
8
9namespace duckdb {
10
11// length returns the size in characters
12struct StringLengthOperator {
13 template <class TA, class TR> static inline TR Operation(TA input) {
14 return LengthFun::Length<TA, TR>(input);
15 }
16};
17
18// strlen returns the size in bytes
19struct StrLenOperator {
20 template <class TA, class TR> static inline TR Operation(TA input) {
21 return input.GetSize();
22 }
23};
24
25// bitlen returns the size in bits
26struct BitLenOperator {
27 template <class TA, class TR> static inline TR Operation(TA input) {
28 return 8 * input.GetSize();
29 }
30};
31
32void LengthFun::RegisterFunction(BuiltinFunctions &set) {
33 set.AddFunction({"length", "len"},
34 ScalarFunction({SQLType::VARCHAR}, SQLType::BIGINT,
35 ScalarFunction::UnaryFunction<string_t, int64_t, StringLengthOperator, true>));
36 set.AddFunction(ScalarFunction("strlen", {SQLType::VARCHAR}, SQLType::BIGINT,
37 ScalarFunction::UnaryFunction<string_t, int64_t, StrLenOperator, true>));
38 set.AddFunction(ScalarFunction("bit_length", {SQLType::VARCHAR}, SQLType::BIGINT,
39 ScalarFunction::UnaryFunction<string_t, int64_t, BitLenOperator, true>));
40 // length for BLOB type
41 set.AddFunction(ScalarFunction("octet_length", {SQLType::BLOB}, SQLType::BIGINT,
42 ScalarFunction::UnaryFunction<string_t, int64_t, StrLenOperator, true>));
43}
44
45struct UnicodeOperator {
46 template <class TA, class TR> static inline TR Operation(const TA &input) {
47 const auto str = reinterpret_cast<const utf8proc_uint8_t *>(input.GetData());
48 const auto len = input.GetSize();
49 utf8proc_int32_t codepoint;
50 (void)utf8proc_iterate(str, len, &codepoint);
51 return codepoint;
52 }
53};
54
55void UnicodeFun::RegisterFunction(BuiltinFunctions &set) {
56 set.AddFunction(ScalarFunction("unicode", {SQLType::VARCHAR}, SQLType::INTEGER,
57 ScalarFunction::UnaryFunction<string_t, int32_t, UnicodeOperator, true>));
58}
59
60} // namespace duckdb
61