diff options
| author | lambda-delta <[email protected]> | 2025-08-04 17:34:24 +0300 |
|---|---|---|
| committer | lambda-delta <[email protected]> | 2025-08-04 17:50:46 +0300 |
| commit | 31222d1a11563c9dd9bbb13e0962752831d5fc0c (patch) | |
| tree | 81a8d2b26474132ac5a65a19df69aedf42a0e63a /yql/essentials/udfs/common/math/math_udf.cpp | |
| parent | 4b0d6028ebeef4311e7692e01e0ea87089beafba (diff) | |
YQL-19784: Implement Math::SwapBytes polymorphic UDF function
Implement Math::SwapBytes polymorphic UDF function
commit_hash:b9e5d9dbca398436f307a6cc38046c7ed46b5f21
Diffstat (limited to 'yql/essentials/udfs/common/math/math_udf.cpp')
| -rw-r--r-- | yql/essentials/udfs/common/math/math_udf.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/yql/essentials/udfs/common/math/math_udf.cpp b/yql/essentials/udfs/common/math/math_udf.cpp index 56e86de6288..e769ed3bee9 100644 --- a/yql/essentials/udfs/common/math/math_udf.cpp +++ b/yql/essentials/udfs/common/math/math_udf.cpp @@ -1,6 +1,7 @@ #include "math_ir.h" - +#include <util/system/byteorder.h> +#include <yql/essentials/public/langver/yql_langver.h> #include <yql/essentials/public/udf/udf_helpers.h> extern const char TagRoundingMode[] = "MathRoundingMode"; @@ -90,6 +91,44 @@ using namespace NKikimr; using namespace NUdf; namespace { + const char SwapBytesUDF[] = "SwapBytes"; + template <class TUserType> + class TSwapBytesFunc: public TBoxedValue { + private: + TSourcePosition Pos_; + + TSwapBytesFunc(TSourcePosition pos) + : Pos_(pos) + { + } + + TUnboxedValue Run(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const override { + Y_UNUSED(valueBuilder); + if constexpr (sizeof(TUserType) == 1) { + return args[0]; + } + return TUnboxedValuePod(SwapBytes(args[0].Get<TUserType>())); + } + + public: + static void DeclareSignature( + TStringRef name, + TType* userType, + IFunctionTypeInfoBuilder& builder, + bool typesOnly) + { + Y_UNUSED(name); + Y_UNUSED(userType); + + builder.SimpleSignature<TUserType(TAutoMap<TUserType>)>() + .IsStrict() + .SetMinLangVer(NYql::MakeLangVersion(2025, 3)); + if (!typesOnly) { + builder.Implementation(new TSwapBytesFunc<TUserType>(builder.GetSourcePosition())); + } + } + }; + extern const char epsilon[] = "Epsilon"; using TEpsilon = TNamedArg<double, epsilon>; @@ -102,6 +141,7 @@ namespace { SIMPLE_MODULE(TMathModule, MATH_UDF_MAP_WITHOUT_IR(REGISTER_MATH_UDF) + TUserDataTypeFuncFactory<true, false, SwapBytesUDF, TSwapBytesFunc, ui8, ui16, ui32, ui64>, MATH_UDF_MAP(REGISTER_MATH_UDF, REGISTER_MATH_UDF_LAST)) } |
