summaryrefslogtreecommitdiffstats
path: root/yql/essentials/udfs/common
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
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')
-rw-r--r--yql/essentials/udfs/common/math/math_udf.cpp42
-rw-r--r--yql/essentials/udfs/common/math/test/canondata/result.json10
-rw-r--r--yql/essentials/udfs/common/math/test/canondata/test.test_SwapBytes_/results.txt96
-rw-r--r--yql/essentials/udfs/common/math/test/canondata/test.test_SwapBytes_2025_02_/extracted11
-rw-r--r--yql/essentials/udfs/common/math/test/cases/SwapBytes.sql8
-rw-r--r--yql/essentials/udfs/common/math/test/cases/SwapBytes_2025_02.cfg2
-rw-r--r--yql/essentials/udfs/common/math/test/cases/SwapBytes_2025_02.sql2
-rw-r--r--yql/essentials/udfs/common/math/ya.make15
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
)
-
-