mkql_builtins_concat.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include "mkql_builtins_impl.h" // Y_IGNORE // Y_IGNORE
  2. #include <yql/essentials/minikql/mkql_string_util.h>
  3. namespace NKikimr {
  4. namespace NMiniKQL {
  5. namespace {
  6. template <typename TLeft, typename TRight, typename TOutput>
  7. struct TConcat {
  8. static NUdf::TUnboxedValuePod Execute(NUdf::TUnboxedValuePod left, NUdf::TUnboxedValuePod right)
  9. {
  10. return ConcatStrings(std::move(left), std::move(right));
  11. }
  12. #ifndef MKQL_DISABLE_CODEGEN
  13. static Value* Generate(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block)
  14. {
  15. return CallBinaryUnboxedValueFunction(&ConcatStrings, Type::getInt128Ty(ctx.Codegen.GetContext()), left, right, ctx.Codegen, block);
  16. }
  17. #endif
  18. };
  19. template<typename TType>
  20. using TAggrConcat = TConcat<TType, TType, TType>;
  21. }
  22. void RegisterConcat(IBuiltinFunctionRegistry& registry) {
  23. const auto name = "Concat";
  24. RegisterFunctionBinOpt<NUdf::TDataType<char*>, NUdf::TDataType<char*>, NUdf::TDataType<char*>, TConcat, TBinaryArgsOpt>(registry, name);
  25. RegisterFunctionBinOpt<NUdf::TDataType<char*>, NUdf::TDataType<NUdf::TUtf8>, NUdf::TDataType<char*>, TConcat, TBinaryArgsOpt>(registry, name);
  26. RegisterFunctionBinOpt<NUdf::TDataType<NUdf::TUtf8>, NUdf::TDataType<char*>, NUdf::TDataType<char*>, TConcat, TBinaryArgsOpt>(registry, name);
  27. RegisterFunctionBinOpt<NUdf::TDataType<NUdf::TUtf8>, NUdf::TDataType<NUdf::TUtf8>, NUdf::TDataType<NUdf::TUtf8>, TConcat, TBinaryArgsOpt>(registry, name);
  28. const auto aggrName = "AggrConcat";
  29. RegisterAggregateFunction<NUdf::TDataType<char*>, TAggrConcat, TBinaryArgsSameOpt>(registry, aggrName);
  30. RegisterAggregateFunction<NUdf::TDataType<NUdf::TUtf8>, TAggrConcat, TBinaryArgsSameOpt>(registry, aggrName);
  31. }
  32. } // namespace NMiniKQL
  33. } // namespace NKikimr