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 | |
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')
8 files changed, 176 insertions, 10 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)) } diff --git a/yql/essentials/udfs/common/math/test/canondata/result.json b/yql/essentials/udfs/common/math/test/canondata/result.json index 1471c26d599..1cc4139d903 100644 --- a/yql/essentials/udfs/common/math/test/canondata/result.json +++ b/yql/essentials/udfs/common/math/test/canondata/result.json @@ -31,5 +31,15 @@ { "uri": "file://test.test_NearbyInt_/results.txt" } + ], + "test.test[SwapBytes]": [ + { + "uri": "file://test.test_SwapBytes_/results.txt" + } + ], + "test.test[SwapBytes_2025_02]": [ + { + "uri": "file://test.test_SwapBytes_2025_02_/extracted" + } ] } diff --git a/yql/essentials/udfs/common/math/test/canondata/test.test_SwapBytes_/results.txt b/yql/essentials/udfs/common/math/test/canondata/test.test_SwapBytes_/results.txt new file mode 100644 index 00000000000..b2d545937d1 --- /dev/null +++ b/yql/essentials/udfs/common/math/test/canondata/test.test_SwapBytes_/results.txt @@ -0,0 +1,96 @@ +[ + { + "Write" = [ + { + "Type" = [ + "ListType"; + [ + "StructType"; + [ + [ + "column0"; + [ + "OptionalType"; + [ + "DataType"; + "Uint8" + ] + ] + ]; + [ + "column1"; + [ + "OptionalType"; + [ + "DataType"; + "Uint16" + ] + ] + ]; + [ + "column2"; + [ + "OptionalType"; + [ + "DataType"; + "Uint32" + ] + ] + ]; + [ + "column3"; + [ + "OptionalType"; + [ + "DataType"; + "Uint64" + ] + ] + ]; + [ + "column4"; + [ + "OptionalType"; + [ + "DataType"; + "Uint64" + ] + ] + ]; + [ + "column5"; + [ + "OptionalType"; + [ + "DataType"; + "Uint64" + ] + ] + ] + ] + ] + ]; + "Data" = [ + [ + [ + "128" + ]; + [ + "32768" + ]; + [ + "2147483648" + ]; + [ + "9223372036854775808" + ]; + #; + [ + "17279655982273016850" + ] + ] + ] + } + ] + } +]
\ No newline at end of file diff --git a/yql/essentials/udfs/common/math/test/canondata/test.test_SwapBytes_2025_02_/extracted b/yql/essentials/udfs/common/math/test/canondata/test.test_SwapBytes_2025_02_/extracted new file mode 100644 index 00000000000..7e9cda53a7a --- /dev/null +++ b/yql/essentials/udfs/common/math/test/canondata/test.test_SwapBytes_2025_02_/extracted @@ -0,0 +1,11 @@ +<tmp_path>/program.sql:<main>: Error: Type annotation + + <tmp_path>/program.sql:<main>:2:1: Error: At function: RemovePrefixMembers, At function: Unordered, At function: PersistableRepr, At function: OrderedSqlProject, At tuple, At function: SqlProjectItem, At lambda + SELECT + ^ + <tmp_path>/program.sql:<main>:4:11: Error: At function: Apply, At function: Udf + Math::SwapBytes(CAST(0x1234567890abcdef as Uint64)); + ^ + <tmp_path>/program.sql:<main>:4:11: Error: UDF 'Math.SwapBytes' is not available before version 2025.03 + Math::SwapBytes(CAST(0x1234567890abcdef as Uint64)); + ^
\ No newline at end of file diff --git a/yql/essentials/udfs/common/math/test/cases/SwapBytes.sql b/yql/essentials/udfs/common/math/test/cases/SwapBytes.sql new file mode 100644 index 00000000000..08557fac649 --- /dev/null +++ b/yql/essentials/udfs/common/math/test/cases/SwapBytes.sql @@ -0,0 +1,8 @@ +SELECT + Math::SwapBytes(CAST(128 as Uint8)), + Math::SwapBytes(CAST(128 as Uint16)), + Math::SwapBytes(CAST(128 as Uint32)), + Math::SwapBytes(CAST(128 as Uint64)), + + Math::SwapBytes(CAST(Null as Uint64?)), + Math::SwapBytes(CAST(0x1234567890abcdef as Uint64)); diff --git a/yql/essentials/udfs/common/math/test/cases/SwapBytes_2025_02.cfg b/yql/essentials/udfs/common/math/test/cases/SwapBytes_2025_02.cfg new file mode 100644 index 00000000000..989226cf3d4 --- /dev/null +++ b/yql/essentials/udfs/common/math/test/cases/SwapBytes_2025_02.cfg @@ -0,0 +1,2 @@ +xfail +langver 2025.02 diff --git a/yql/essentials/udfs/common/math/test/cases/SwapBytes_2025_02.sql b/yql/essentials/udfs/common/math/test/cases/SwapBytes_2025_02.sql new file mode 100644 index 00000000000..d0f1f1fbe0a --- /dev/null +++ b/yql/essentials/udfs/common/math/test/cases/SwapBytes_2025_02.sql @@ -0,0 +1,2 @@ +SELECT + Math::SwapBytes(CAST(0x1234567890abcdef as Uint64)); diff --git a/yql/essentials/udfs/common/math/ya.make b/yql/essentials/udfs/common/math/ya.make index f3028b6d2c4..dfb5fa7c994 100644 --- a/yql/essentials/udfs/common/math/ya.make +++ b/yql/essentials/udfs/common/math/ya.make @@ -1,11 +1,11 @@ YQL_UDF_CONTRIB(math_udf) - + YQL_ABI_VERSION( 2 - 28 + 43 0 ) - + SRCS( math_udf.cpp ) @@ -14,7 +14,7 @@ YQL_UDF_CONTRIB(math_udf) CFLAGS(-DDISABLE_IR) ELSE() USE_LLVM_BC16() - + LLVM_BC( math_ir.cpp lib/erfinv.cpp @@ -72,12 +72,11 @@ YQL_UDF_CONTRIB(math_udf) ) ENDIF() - - + PEERDIR( yql/essentials/udfs/common/math/lib ) - + END() RECURSE( @@ -87,5 +86,3 @@ RECURSE( RECURSE_FOR_TESTS( test ) - - |