summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2025-04-16 18:40:26 +0300
committerrobot-piglet <[email protected]>2025-04-16 18:52:23 +0300
commit0827896fdf780a434d0981d5fdb11e0d54441480 (patch)
tree2f1d0d19404bafeb3f900748ea0f1676f393d69e
parent0192d5ea8ae0e946f3c04fe10dde30601e65ec99 (diff)
Intermediate changes
commit_hash:4c0f36394464576b71ac609ff5cce5758d2323bb
-rw-r--r--yql/essentials/public/langver/ut/ya.make10
-rw-r--r--yql/essentials/public/langver/ut/yql_langver_ut.cpp56
-rw-r--r--yql/essentials/public/langver/ya.make14
-rw-r--r--yql/essentials/public/langver/yql_langver.cpp70
-rw-r--r--yql/essentials/public/langver/yql_langver.h58
-rw-r--r--yql/essentials/public/langver/yql_langver_list.inc2
-rw-r--r--yql/essentials/public/ya.make1
-rw-r--r--yql/essentials/tests/common/udf_test/test.py9
8 files changed, 217 insertions, 3 deletions
diff --git a/yql/essentials/public/langver/ut/ya.make b/yql/essentials/public/langver/ut/ya.make
new file mode 100644
index 00000000000..ab179a9c34a
--- /dev/null
+++ b/yql/essentials/public/langver/ut/ya.make
@@ -0,0 +1,10 @@
+UNITTEST_FOR(yql/essentials/public/langver)
+
+SRCS(
+ yql_langver_ut.cpp
+)
+
+PEERDIR(
+)
+
+END()
diff --git a/yql/essentials/public/langver/ut/yql_langver_ut.cpp b/yql/essentials/public/langver/ut/yql_langver_ut.cpp
new file mode 100644
index 00000000000..7467a7c5183
--- /dev/null
+++ b/yql/essentials/public/langver/ut/yql_langver_ut.cpp
@@ -0,0 +1,56 @@
+#include "yql_langver.h"
+
+#include <library/cpp/testing/unittest/registar.h>
+
+namespace NYql {
+
+Y_UNIT_TEST_SUITE(TLangVerTests) {
+ Y_UNIT_TEST(IsValidMin) {
+ UNIT_ASSERT(IsValidLangVersion(MinLangVersion));
+ }
+
+ Y_UNIT_TEST(Parse) {
+ TLangVersion v;
+ UNIT_ASSERT(!ParseLangVersion("",v));
+ UNIT_ASSERT(!ParseLangVersion("2025.01X",v));
+ UNIT_ASSERT(!ParseLangVersion("2025-01",v));
+ UNIT_ASSERT(!ParseLangVersion("99999.99",v));
+ UNIT_ASSERT(ParseLangVersion("2025.01",v));
+ UNIT_ASSERT_VALUES_EQUAL(v, MakeLangVersion(2025,1));
+ UNIT_ASSERT(ParseLangVersion("9999.99",v));
+ UNIT_ASSERT_VALUES_EQUAL(v, MakeLangVersion(9999,99));
+ }
+
+ Y_UNIT_TEST(Format) {
+ TLangVersionBuffer b;
+ TStringBuf s;
+ UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(99999, 1), b, s));
+ UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(999, 1), b, s));
+ UNIT_ASSERT(FormatLangVersion(MakeLangVersion(2025, 1), b, s));
+ UNIT_ASSERT_VALUES_EQUAL(s, "2025.01");
+ UNIT_ASSERT_VALUES_EQUAL(b[s.Size()], 0);
+ UNIT_ASSERT(FormatLangVersion(MakeLangVersion(2025, 12), b, s));
+ UNIT_ASSERT_VALUES_EQUAL(s, "2025.12");
+ UNIT_ASSERT_VALUES_EQUAL(b[s.Size()], 0);
+ }
+
+ Y_UNIT_TEST(Deprecated) {
+ UNIT_ASSERT(IsDeprecatedLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2027,1)));
+ UNIT_ASSERT(!IsDeprecatedLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2025,1)));
+ UNIT_ASSERT(!IsDeprecatedLangVersion(MakeLangVersion(2025,4),MakeLangVersion(2028,1)));
+ }
+
+ Y_UNIT_TEST(Unsupported) {
+ UNIT_ASSERT(!IsUnsupportedLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2025,1)));
+ UNIT_ASSERT(!IsUnsupportedLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2027,1)));
+ UNIT_ASSERT(IsUnsupportedLangVersion(MakeLangVersion(2025,4),MakeLangVersion(2028,1)));
+ UNIT_ASSERT(IsUnsupportedLangVersion(MakeLangVersion(2025,5),MakeLangVersion(2029,1)));
+ }
+
+ Y_UNIT_TEST(Available) {
+ UNIT_ASSERT(IsAvalableLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2025,2)));
+ UNIT_ASSERT(!IsAvalableLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2025,2)));
+ }
+}
+
+}
diff --git a/yql/essentials/public/langver/ya.make b/yql/essentials/public/langver/ya.make
new file mode 100644
index 00000000000..ab1e88c5173
--- /dev/null
+++ b/yql/essentials/public/langver/ya.make
@@ -0,0 +1,14 @@
+LIBRARY()
+
+SRCS(
+ yql_langver.cpp
+)
+
+PEERDIR(
+)
+
+END()
+
+RECURSE_FOR_TESTS(
+ ut
+)
diff --git a/yql/essentials/public/langver/yql_langver.cpp b/yql/essentials/public/langver/yql_langver.cpp
new file mode 100644
index 00000000000..02584e81b6a
--- /dev/null
+++ b/yql/essentials/public/langver/yql_langver.cpp
@@ -0,0 +1,70 @@
+#include "yql_langver.h"
+
+#include <util/string/cast.h>
+
+#include <vector>
+#include <utility>
+
+namespace NYql {
+
+namespace {
+
+const std::pair<ui32,ui32> Versions[] = {
+#include "yql_langver_list.inc"
+};
+
+}
+
+bool IsValidLangVersion(TLangVersion ver) {
+ for (size_t i = 0; i < Y_ARRAY_SIZE(Versions); ++i) {
+ if (ver == MakeLangVersion(Versions[i].first, Versions[i].second)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool ParseLangVersion(TStringBuf str, TLangVersion& result) {
+ result = UnknownLangVersion;
+ if (str.size() != 7 || str[4] != '.') {
+ return false;
+ }
+
+ ui32 year, minor;
+ if (!TryFromString(str.SubString(0, 4), year)) {
+ return false;
+ }
+
+ if (!TryFromString(str.SubString(5, 2), minor)) {
+ return false;
+ }
+
+ result = MakeLangVersion(year, minor);
+ return true;
+}
+
+bool FormatLangVersion(TLangVersion ver, TLangVersionBuffer& buffer, TStringBuf& result) {
+ ui32 year = GetYearFromLangVersion(ver);
+ if (year > 9999) {
+ return false;
+ }
+
+ ui32 minor = GetMinorFromLangVersion(ver);
+ Y_ASSERT(minor < 100);
+ if (ToString(year, buffer.data() + 0, 4) != 4) {
+ return false;
+ }
+
+ buffer[4] = '.';
+ if (ToString(minor, buffer.data() + 5, 2) == 1) {
+ buffer[6] = buffer[5];
+ buffer[5] = '0';
+ }
+
+ buffer[7] = 0;
+ result = TStringBuf(buffer.data(), buffer.size() - 1);
+ return true;
+}
+
+}
diff --git a/yql/essentials/public/langver/yql_langver.h b/yql/essentials/public/langver/yql_langver.h
new file mode 100644
index 00000000000..e14d5c91b12
--- /dev/null
+++ b/yql/essentials/public/langver/yql_langver.h
@@ -0,0 +1,58 @@
+#pragma once
+#include <util/generic/strbuf.h>
+#include <util/system/types.h>
+
+#include <array>
+
+namespace NYql {
+
+using TLangVersion = ui32;
+
+constexpr TLangVersion UnknownLangVersion = 0;
+
+constexpr inline TLangVersion MakeLangVersion(ui32 year, ui32 minor) {
+ return year * 100u + minor;
+}
+
+constexpr inline ui32 GetYearFromLangVersion(TLangVersion ver) {
+ return ver / 100u;
+}
+
+constexpr inline ui32 GetMinorFromLangVersion(TLangVersion ver) {
+ return ver % 100u;
+}
+
+constexpr inline bool IsAvalableLangVersion(TLangVersion ver, TLangVersion max) {
+ if (ver == UnknownLangVersion || max == UnknownLangVersion) {
+ return true;
+ }
+
+ return ver <= max;
+}
+
+constexpr inline bool IsDeprecatedLangVersion(TLangVersion ver, TLangVersion max) {
+ if (ver == UnknownLangVersion || max == UnknownLangVersion) {
+ return false;
+ }
+
+ return GetYearFromLangVersion(ver) == GetYearFromLangVersion(max) - 2;
+}
+
+constexpr inline bool IsUnsupportedLangVersion(TLangVersion ver, TLangVersion max) {
+ if (ver == UnknownLangVersion || max == UnknownLangVersion) {
+ return false;
+ }
+
+ return GetYearFromLangVersion(ver) <= GetYearFromLangVersion(max) - 3;
+}
+
+constexpr TLangVersion MinLangVersion = MakeLangVersion(2025, 1);
+
+constexpr ui32 LangVersionBufferSize = 4 + 1 + 2 + 1; // year.minor\0
+using TLangVersionBuffer = std::array<char, LangVersionBufferSize>;
+
+bool IsValidLangVersion(TLangVersion ver);
+bool ParseLangVersion(TStringBuf str, TLangVersion& result);
+bool FormatLangVersion(TLangVersion ver, TLangVersionBuffer& buffer, TStringBuf& result);
+
+}
diff --git a/yql/essentials/public/langver/yql_langver_list.inc b/yql/essentials/public/langver/yql_langver_list.inc
new file mode 100644
index 00000000000..c2ef4658128
--- /dev/null
+++ b/yql/essentials/public/langver/yql_langver_list.inc
@@ -0,0 +1,2 @@
+{2025,1},
+{2025,2},
diff --git a/yql/essentials/public/ya.make b/yql/essentials/public/ya.make
index cc6bef29309..d53fabdd192 100644
--- a/yql/essentials/public/ya.make
+++ b/yql/essentials/public/ya.make
@@ -2,6 +2,7 @@ RECURSE(
decimal
fastcheck
issue
+ langver
purecalc
result_format
sql_format
diff --git a/yql/essentials/tests/common/udf_test/test.py b/yql/essentials/tests/common/udf_test/test.py
index 218b05b4bde..95b8cf1e18a 100644
--- a/yql/essentials/tests/common/udf_test/test.py
+++ b/yql/essentials/tests/common/udf_test/test.py
@@ -67,9 +67,12 @@ def test(case):
in_tables = yql_utils.get_input_tables(None, cfg, DATA_PATH, def_attr=yql_utils.KSV_ATTR)
- udfs_dir = yql_utils.get_udfs_path([
- yatest.common.build_path(os.path.join(yatest.common.context.project_path, ".."))
- ])
+ udfs_list = [yatest.common.build_path(os.path.join(yatest.common.context.project_path, ".."))]
+ env_udfs_list = yql_utils.get_param("EXTRA_UDF_DIRS")
+ if env_udfs_list:
+ for udf_path in env_udfs_list.strip().split(":"):
+ udfs_list.append(yatest.common.build_path(udf_path))
+ udfs_dir = yql_utils.get_udfs_path(udfs_list)
xfail = yql_utils.is_xfail(cfg)
if yql_utils.get_param('TARGET_PLATFORM') and xfail: