#include "mkql_builtins_impl.h" // Y_IGNORE // Y_IGNORE #include namespace NKikimr { namespace NMiniKQL { namespace { template struct TConcat { static NUdf::TUnboxedValuePod Execute(NUdf::TUnboxedValuePod left, NUdf::TUnboxedValuePod right) { return ConcatStrings(std::move(left), std::move(right)); } #ifndef MKQL_DISABLE_CODEGEN static Value* Generate(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block) { return CallBinaryUnboxedValueFunction(&ConcatStrings, Type::getInt128Ty(ctx.Codegen.GetContext()), left, right, ctx.Codegen, block); } #endif }; template using TAggrConcat = TConcat; } void RegisterConcat(IBuiltinFunctionRegistry& registry) { const auto name = "Concat"; RegisterFunctionBinOpt, NUdf::TDataType, NUdf::TDataType, TConcat, TBinaryArgsOpt>(registry, name); RegisterFunctionBinOpt, NUdf::TDataType, NUdf::TDataType, TConcat, TBinaryArgsOpt>(registry, name); RegisterFunctionBinOpt, NUdf::TDataType, NUdf::TDataType, TConcat, TBinaryArgsOpt>(registry, name); RegisterFunctionBinOpt, NUdf::TDataType, NUdf::TDataType, TConcat, TBinaryArgsOpt>(registry, name); const auto aggrName = "AggrConcat"; RegisterAggregateFunction, TAggrConcat, TBinaryArgsSameOpt>(registry, aggrName); RegisterAggregateFunction, TAggrConcat, TBinaryArgsSameOpt>(registry, aggrName); } } // namespace NMiniKQL } // namespace NKikimr