Skip to content

Commit 0827896

Browse files
committed
Intermediate changes
commit_hash:4c0f36394464576b71ac609ff5cce5758d2323bb
1 parent 0192d5e commit 0827896

File tree

8 files changed

+217
-3
lines changed

8 files changed

+217
-3
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
UNITTEST_FOR(yql/essentials/public/langver)
2+
3+
SRCS(
4+
yql_langver_ut.cpp
5+
)
6+
7+
PEERDIR(
8+
)
9+
10+
END()
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include "yql_langver.h"
2+
3+
#include <library/cpp/testing/unittest/registar.h>
4+
5+
namespace NYql {
6+
7+
Y_UNIT_TEST_SUITE(TLangVerTests) {
8+
Y_UNIT_TEST(IsValidMin) {
9+
UNIT_ASSERT(IsValidLangVersion(MinLangVersion));
10+
}
11+
12+
Y_UNIT_TEST(Parse) {
13+
TLangVersion v;
14+
UNIT_ASSERT(!ParseLangVersion("",v));
15+
UNIT_ASSERT(!ParseLangVersion("2025.01X",v));
16+
UNIT_ASSERT(!ParseLangVersion("2025-01",v));
17+
UNIT_ASSERT(!ParseLangVersion("99999.99",v));
18+
UNIT_ASSERT(ParseLangVersion("2025.01",v));
19+
UNIT_ASSERT_VALUES_EQUAL(v, MakeLangVersion(2025,1));
20+
UNIT_ASSERT(ParseLangVersion("9999.99",v));
21+
UNIT_ASSERT_VALUES_EQUAL(v, MakeLangVersion(9999,99));
22+
}
23+
24+
Y_UNIT_TEST(Format) {
25+
TLangVersionBuffer b;
26+
TStringBuf s;
27+
UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(99999, 1), b, s));
28+
UNIT_ASSERT(!FormatLangVersion(MakeLangVersion(999, 1), b, s));
29+
UNIT_ASSERT(FormatLangVersion(MakeLangVersion(2025, 1), b, s));
30+
UNIT_ASSERT_VALUES_EQUAL(s, "2025.01");
31+
UNIT_ASSERT_VALUES_EQUAL(b[s.Size()], 0);
32+
UNIT_ASSERT(FormatLangVersion(MakeLangVersion(2025, 12), b, s));
33+
UNIT_ASSERT_VALUES_EQUAL(s, "2025.12");
34+
UNIT_ASSERT_VALUES_EQUAL(b[s.Size()], 0);
35+
}
36+
37+
Y_UNIT_TEST(Deprecated) {
38+
UNIT_ASSERT(IsDeprecatedLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2027,1)));
39+
UNIT_ASSERT(!IsDeprecatedLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2025,1)));
40+
UNIT_ASSERT(!IsDeprecatedLangVersion(MakeLangVersion(2025,4),MakeLangVersion(2028,1)));
41+
}
42+
43+
Y_UNIT_TEST(Unsupported) {
44+
UNIT_ASSERT(!IsUnsupportedLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2025,1)));
45+
UNIT_ASSERT(!IsUnsupportedLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2027,1)));
46+
UNIT_ASSERT(IsUnsupportedLangVersion(MakeLangVersion(2025,4),MakeLangVersion(2028,1)));
47+
UNIT_ASSERT(IsUnsupportedLangVersion(MakeLangVersion(2025,5),MakeLangVersion(2029,1)));
48+
}
49+
50+
Y_UNIT_TEST(Available) {
51+
UNIT_ASSERT(IsAvalableLangVersion(MakeLangVersion(2025,2),MakeLangVersion(2025,2)));
52+
UNIT_ASSERT(!IsAvalableLangVersion(MakeLangVersion(2025,3),MakeLangVersion(2025,2)));
53+
}
54+
}
55+
56+
}

yql/essentials/public/langver/ya.make

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
LIBRARY()
2+
3+
SRCS(
4+
yql_langver.cpp
5+
)
6+
7+
PEERDIR(
8+
)
9+
10+
END()
11+
12+
RECURSE_FOR_TESTS(
13+
ut
14+
)
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include "yql_langver.h"
2+
3+
#include <util/string/cast.h>
4+
5+
#include <vector>
6+
#include <utility>
7+
8+
namespace NYql {
9+
10+
namespace {
11+
12+
const std::pair<ui32,ui32> Versions[] = {
13+
#include "yql_langver_list.inc"
14+
};
15+
16+
}
17+
18+
bool IsValidLangVersion(TLangVersion ver) {
19+
for (size_t i = 0; i < Y_ARRAY_SIZE(Versions); ++i) {
20+
if (ver == MakeLangVersion(Versions[i].first, Versions[i].second)) {
21+
return true;
22+
}
23+
}
24+
25+
return false;
26+
}
27+
28+
bool ParseLangVersion(TStringBuf str, TLangVersion& result) {
29+
result = UnknownLangVersion;
30+
if (str.size() != 7 || str[4] != '.') {
31+
return false;
32+
}
33+
34+
ui32 year, minor;
35+
if (!TryFromString(str.SubString(0, 4), year)) {
36+
return false;
37+
}
38+
39+
if (!TryFromString(str.SubString(5, 2), minor)) {
40+
return false;
41+
}
42+
43+
result = MakeLangVersion(year, minor);
44+
return true;
45+
}
46+
47+
bool FormatLangVersion(TLangVersion ver, TLangVersionBuffer& buffer, TStringBuf& result) {
48+
ui32 year = GetYearFromLangVersion(ver);
49+
if (year > 9999) {
50+
return false;
51+
}
52+
53+
ui32 minor = GetMinorFromLangVersion(ver);
54+
Y_ASSERT(minor < 100);
55+
if (ToString(year, buffer.data() + 0, 4) != 4) {
56+
return false;
57+
}
58+
59+
buffer[4] = '.';
60+
if (ToString(minor, buffer.data() + 5, 2) == 1) {
61+
buffer[6] = buffer[5];
62+
buffer[5] = '0';
63+
}
64+
65+
buffer[7] = 0;
66+
result = TStringBuf(buffer.data(), buffer.size() - 1);
67+
return true;
68+
}
69+
70+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#pragma once
2+
#include <util/generic/strbuf.h>
3+
#include <util/system/types.h>
4+
5+
#include <array>
6+
7+
namespace NYql {
8+
9+
using TLangVersion = ui32;
10+
11+
constexpr TLangVersion UnknownLangVersion = 0;
12+
13+
constexpr inline TLangVersion MakeLangVersion(ui32 year, ui32 minor) {
14+
return year * 100u + minor;
15+
}
16+
17+
constexpr inline ui32 GetYearFromLangVersion(TLangVersion ver) {
18+
return ver / 100u;
19+
}
20+
21+
constexpr inline ui32 GetMinorFromLangVersion(TLangVersion ver) {
22+
return ver % 100u;
23+
}
24+
25+
constexpr inline bool IsAvalableLangVersion(TLangVersion ver, TLangVersion max) {
26+
if (ver == UnknownLangVersion || max == UnknownLangVersion) {
27+
return true;
28+
}
29+
30+
return ver <= max;
31+
}
32+
33+
constexpr inline bool IsDeprecatedLangVersion(TLangVersion ver, TLangVersion max) {
34+
if (ver == UnknownLangVersion || max == UnknownLangVersion) {
35+
return false;
36+
}
37+
38+
return GetYearFromLangVersion(ver) == GetYearFromLangVersion(max) - 2;
39+
}
40+
41+
constexpr inline bool IsUnsupportedLangVersion(TLangVersion ver, TLangVersion max) {
42+
if (ver == UnknownLangVersion || max == UnknownLangVersion) {
43+
return false;
44+
}
45+
46+
return GetYearFromLangVersion(ver) <= GetYearFromLangVersion(max) - 3;
47+
}
48+
49+
constexpr TLangVersion MinLangVersion = MakeLangVersion(2025, 1);
50+
51+
constexpr ui32 LangVersionBufferSize = 4 + 1 + 2 + 1; // year.minor\0
52+
using TLangVersionBuffer = std::array<char, LangVersionBufferSize>;
53+
54+
bool IsValidLangVersion(TLangVersion ver);
55+
bool ParseLangVersion(TStringBuf str, TLangVersion& result);
56+
bool FormatLangVersion(TLangVersion ver, TLangVersionBuffer& buffer, TStringBuf& result);
57+
58+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{2025,1},
2+
{2025,2},

yql/essentials/public/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ RECURSE(
22
decimal
33
fastcheck
44
issue
5+
langver
56
purecalc
67
result_format
78
sql_format

yql/essentials/tests/common/udf_test/test.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,12 @@ def test(case):
6767

6868
in_tables = yql_utils.get_input_tables(None, cfg, DATA_PATH, def_attr=yql_utils.KSV_ATTR)
6969

70-
udfs_dir = yql_utils.get_udfs_path([
71-
yatest.common.build_path(os.path.join(yatest.common.context.project_path, ".."))
72-
])
70+
udfs_list = [yatest.common.build_path(os.path.join(yatest.common.context.project_path, ".."))]
71+
env_udfs_list = yql_utils.get_param("EXTRA_UDF_DIRS")
72+
if env_udfs_list:
73+
for udf_path in env_udfs_list.strip().split(":"):
74+
udfs_list.append(yatest.common.build_path(udf_path))
75+
udfs_dir = yql_utils.get_udfs_path(udfs_list)
7376

7477
xfail = yql_utils.is_xfail(cfg)
7578
if yql_utils.get_param('TARGET_PLATFORM') and xfail:

0 commit comments

Comments
 (0)