summaryrefslogtreecommitdiffstats
path: root/yql/essentials/udfs/common/math/math_udf.cpp
diff options
context:
space:
mode:
authorlambda-delta <[email protected]>2025-08-04 17:34:24 +0300
committerlambda-delta <[email protected]>2025-08-04 17:50:46 +0300
commit31222d1a11563c9dd9bbb13e0962752831d5fc0c (patch)
tree81a8d2b26474132ac5a65a19df69aedf42a0e63a /yql/essentials/udfs/common/math/math_udf.cpp
parent4b0d6028ebeef4311e7692e01e0ea87089beafba (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.cpp42
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))
}