13 template<
class OPERAND_TYPE,
class RESULT_TYPE>
14 static inline void operation(OPERAND_TYPE& input, RESULT_TYPE& result,
void* udfFunc) {
15 typedef RESULT_TYPE (*unary_udf_func)(OPERAND_TYPE);
16 auto unaryUDFFunc = (unary_udf_func)udfFunc;
17 result = unaryUDFFunc(input);
22 template<
class LEFT_TYPE,
class RIGHT_TYPE,
class RESULT_TYPE>
23 static inline void operation(LEFT_TYPE& left, RIGHT_TYPE& right, RESULT_TYPE& result,
25 typedef RESULT_TYPE (*binary_udf_func)(LEFT_TYPE, RIGHT_TYPE);
26 auto binaryUDFFunc = (binary_udf_func)udfFunc;
27 result = binaryUDFFunc(left, right);
32 template<
class A_TYPE,
class B_TYPE,
class C_TYPE,
class RESULT_TYPE>
33 static inline void operation(A_TYPE& a, B_TYPE& b, C_TYPE& c, RESULT_TYPE& result,
35 typedef RESULT_TYPE (*ternary_udf_func)(A_TYPE, B_TYPE, C_TYPE);
36 auto ternaryUDFFunc = (ternary_udf_func)udfFunc;
37 result = ternaryUDFFunc(a, b, c);
47 []<
typename T1>(T1) {
return std::is_same<T, T1>::value; });
49 []<
typename T1>(T1) {
return std::is_same<T, T1>::value; });
50 return logicalTypeMatch || physicalTypeMatch;
57 "Incompatible udf parameter/return type and templated type."};
61 template<
typename RESULT_TYPE,
typename... Args>
63 const std::vector<common::LogicalTypeID>&) {
67 template<
typename RESULT_TYPE>
69 const std::vector<common::LogicalTypeID>&) {
72 [[maybe_unused]]
const std::vector<std::shared_ptr<common::ValueVector>>& params,
73 [[maybe_unused]]
const std::vector<common::SelectionVector*>& paramSelVectors,
75 void* =
nullptr) ->
void {
76 KU_ASSERT(params.empty() && paramSelVectors.empty());
77 for (
auto i = 0u; i < resultSelVector->getSelSize(); ++i) {
78 auto resultPos = (*resultSelVector)[i];
84 template<
typename RESULT_TYPE,
typename... Args>
86 const std::vector<common::LogicalTypeID>& ) {
90 template<
typename RESULT_TYPE,
typename OPERAND_TYPE>
92 const std::vector<common::LogicalTypeID>& parameterTypes) {
93 if (parameterTypes.size() != 1) {
95 "Expected exactly one parameter type for unary udf. Got: " +
96 std::to_string(parameterTypes.size()) +
"."};
100 [udfFunc](
const std::vector<std::shared_ptr<common::ValueVector>>& params,
101 const std::vector<common::SelectionVector*>& paramSelVectors,
103 void* =
nullptr) ->
void {
112 template<
typename RESULT_TYPE,
typename... Args>
114 const std::vector<common::LogicalTypeID>& ) {
118 template<
typename RESULT_TYPE,
typename LEFT_TYPE,
typename RIGHT_TYPE>
120 RESULT_TYPE (*udfFunc)(LEFT_TYPE, RIGHT_TYPE),
121 const std::vector<common::LogicalTypeID>& parameterTypes) {
122 if (parameterTypes.size() != 2) {
124 "Expected exactly two parameter types for binary udf. Got: " +
125 std::to_string(parameterTypes.size()) +
"."};
130 [udfFunc](
const std::vector<std::shared_ptr<common::ValueVector>>& params,
131 const std::vector<common::SelectionVector*>& paramSelVectors,
133 void* =
nullptr) ->
void {
137 *params[1], paramSelVectors[1], result, resultSelVector, (
void*)udfFunc);
142 template<
typename RESULT_TYPE,
typename... Args>
144 const std::vector<common::LogicalTypeID>& ) {
148 template<
typename RESULT_TYPE,
typename A_TYPE,
typename B_TYPE,
typename C_TYPE>
150 RESULT_TYPE (*udfFunc)(A_TYPE, B_TYPE, C_TYPE),
151 std::vector<common::LogicalTypeID> parameterTypes) {
152 if (parameterTypes.size() != 3) {
154 "Expected exactly three parameter types for ternary udf. Got: " +
155 std::to_string(parameterTypes.size()) +
"."};
161 [udfFunc](
const std::vector<std::shared_ptr<common::ValueVector>>& params,
162 const std::vector<common::SelectionVector*>& paramSelVectors,
164 void* =
nullptr) ->
void {
168 *params[1], paramSelVectors[1], *params[2], paramSelVectors[2], result,
169 resultSelVector, (
void*)udfFunc);
174 template<
typename TR,
typename... Args>
176 std::vector<common::LogicalTypeID> parameterTypes) {
177 constexpr auto numArgs =
sizeof...(Args);
194 if (std::is_same<T, bool>()) {
196 }
else if (std::is_same<T, int8_t>()) {
198 }
else if (std::is_same<T, int16_t>()) {
200 }
else if (std::is_same<T, int32_t>()) {
202 }
else if (std::is_same<T, int64_t>()) {
204 }
else if (std::is_same<T, common::int128_t>()) {
206 }
else if (std::is_same<T, uint8_t>()) {
208 }
else if (std::is_same<T, uint16_t>()) {
210 }
else if (std::is_same<T, uint32_t>()) {
212 }
else if (std::is_same<T, uint64_t>()) {
214 }
else if (std::is_same<T, float>()) {
216 }
else if (std::is_same<T, double>()) {
218 }
else if (std::is_same<T, common::ku_string_t>()) {
225 template<
typename TA>
230 template<
typename TA,
typename TB,
typename... Args>
236 template<
typename... Args>
238 std::vector<common::LogicalTypeID> parameterTypes;
239 if constexpr (
sizeof...(Args) > 0) {
242 return parameterTypes;
245 template<
typename TR,
typename... Args>
254 definitions.push_back(std::make_unique<function::ScalarFunction>(std::move(name),
255 std::move(parameterTypes), returnType, std::move(scalarExecFunc)));
259 template<
typename TR,
typename... Args>
265 template<
typename TR,
typename... Args>
268 definitions.push_back(std::make_unique<function::ScalarFunction>(std::move(name),
276 definitions.push_back(std::make_unique<function::ScalarFunction>(std::move(name),
277 std::move(parameterTypes), returnType, std::move(execFunc)));
#define KU_ASSERT(condition)
Definition assert.h:19
#define KU_UNUSED(expr)
Definition assert.h:31
#define KU_UNREACHABLE
Definition assert.h:28
KUZU_API PhysicalTypeID getPhysicalType() const
Definition types.h:283
Definition sel_vector.h:98
static auto visit(const LogicalType &dataType, Fs... funcs)
Definition type_utils.h:144
Definition value_vector.h:21
LogicalTypeID
Definition types.h:177
@ UINT32
Definition types.h:192
@ UINT16
Definition types.h:193
@ INT64
Definition types.h:187
@ INT16
Definition types.h:189
@ STRING
Definition types.h:208
@ INT32
Definition types.h:188
@ UINT64
Definition types.h:191
@ BOOL
Definition types.h:186
@ INT128
Definition types.h:195
@ FLOAT
Definition types.h:197
@ UINT8
Definition types.h:194
@ INT8
Definition types.h:190
@ DOUBLE
Definition types.h:196
Definition binary_function_executor.h:6
std::vector< std::unique_ptr< Function > > function_set
Definition function.h:44
std::function< void(const std::vector< std::shared_ptr< common::ValueVector > > &, const std::vector< common::SelectionVector * > &, common::ValueVector &, common::SelectionVector *, void *)> scalar_func_exec_t
Definition scalar_function.h:18
Definition array_utils.h:7
static void executeSwitch(common::ValueVector &left, common::SelectionVector *leftSelVector, common::ValueVector &right, common::SelectionVector *rightSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition binary_function_executor.h:152
Definition udf_function.h:21
static void operation(LEFT_TYPE &left, RIGHT_TYPE &right, RESULT_TYPE &result, void *udfFunc)
Definition udf_function.h:23
Definition binary_function_executor.h:69
static void executeSwitch(common::ValueVector &a, common::SelectionVector *aSelVector, common::ValueVector &b, common::SelectionVector *bSelVector, common::ValueVector &c, common::SelectionVector *cSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition ternary_function_executor.h:392
Definition udf_function.h:31
static void operation(A_TYPE &a, B_TYPE &b, C_TYPE &c, RESULT_TYPE &result, void *udfFunc)
Definition udf_function.h:33
Definition ternary_function_executor.h:41
Definition udf_function.h:41
static function_set getFunction(std::string name, TR(*udfFunc)(Args...))
Definition udf_function.h:260
static function::scalar_func_exec_t createTernaryExecFunc(RESULT_TYPE(*udfFunc)(A_TYPE, B_TYPE, C_TYPE), std::vector< common::LogicalTypeID > parameterTypes)
Definition udf_function.h:149
static function::scalar_func_exec_t createEmptyParameterExecFunc(RESULT_TYPE(*)(Args...), const std::vector< common::LogicalTypeID > &)
Definition udf_function.h:62
static function::scalar_func_exec_t createUnaryExecFunc(RESULT_TYPE(*udfFunc)(OPERAND_TYPE), const std::vector< common::LogicalTypeID > ¶meterTypes)
Definition udf_function.h:91
static scalar_func_exec_t getScalarExecFunc(TR(*udfFunc)(Args...), std::vector< common::LogicalTypeID > parameterTypes)
Definition udf_function.h:175
static void getParameterTypesRecursive(std::vector< common::LogicalTypeID > &arguments)
Definition udf_function.h:231
static function::scalar_func_exec_t createTernaryExecFunc(RESULT_TYPE(*)(Args...), const std::vector< common::LogicalTypeID > &)
Definition udf_function.h:143
static function::scalar_func_exec_t createUnaryExecFunc(RESULT_TYPE(*)(Args...), const std::vector< common::LogicalTypeID > &)
Definition udf_function.h:85
static void validateType(const common::LogicalTypeID &type)
Definition udf_function.h:54
static function_set getFunction(std::string name, TR(*udfFunc)(Args...), std::vector< common::LogicalTypeID > parameterTypes, common::LogicalTypeID returnType)
Definition udf_function.h:246
static void getParameterTypesRecursive(std::vector< common::LogicalTypeID > &arguments)
Definition udf_function.h:226
static function_set getVectorizedFunction(std::string name, scalar_func_exec_t execFunc, std::vector< common::LogicalTypeID > parameterTypes, common::LogicalTypeID returnType)
Definition udf_function.h:273
static function::scalar_func_exec_t createBinaryExecFunc(RESULT_TYPE(*)(Args...), const std::vector< common::LogicalTypeID > &)
Definition udf_function.h:113
static function::scalar_func_exec_t createEmptyParameterExecFunc(RESULT_TYPE(*udfFunc)(), const std::vector< common::LogicalTypeID > &)
Definition udf_function.h:68
static bool templateValidateType(const common::LogicalTypeID &type)
Definition udf_function.h:43
static std::vector< common::LogicalTypeID > getParameterTypes()
Definition udf_function.h:237
static function::scalar_func_exec_t createBinaryExecFunc(RESULT_TYPE(*udfFunc)(LEFT_TYPE, RIGHT_TYPE), const std::vector< common::LogicalTypeID > ¶meterTypes)
Definition udf_function.h:119
static common::LogicalTypeID getParameterType()
Definition udf_function.h:193
static function_set getVectorizedFunction(std::string name, scalar_func_exec_t execFunc)
Definition udf_function.h:266
static void executeSwitch(common::ValueVector &operand, common::SelectionVector *operandSelVector, common::ValueVector &result, common::SelectionVector *resultSelVector, void *dataPtr)
Definition unary_function_executor.h:148
Definition udf_function.h:12
static void operation(OPERAND_TYPE &input, RESULT_TYPE &result, void *udfFunc)
Definition udf_function.h:14
Definition unary_function_executor.h:91