Skip to content

Commit 776b371

Browse files
authored
Fix CompareRanges (#12043)
1 parent 9b2bdb0 commit 776b371

File tree

4 files changed

+150
-2
lines changed

4 files changed

+150
-2
lines changed

ydb/core/kqp/ut/service/kqp_qs_queries_ut.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -5221,6 +5221,14 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
52215221
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
52225222
CompareYson(R"([[6u]])", FormatResultSetYson(result.GetResultSet(0)));
52235223
}
5224+
5225+
{
5226+
auto result = client.ExecuteQuery(R"(
5227+
SELECT COUNT(*) FROM `/Root/DataShard` WHERE Col1 = "y";
5228+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
5229+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
5230+
CompareYson(R"([[2u]])", FormatResultSetYson(result.GetResultSet(0)));
5231+
}
52245232
}
52255233

52265234
Y_UNIT_TEST(ReadManyShardsRange) {

ydb/core/scheme/scheme_ranges_ut.cpp

+139
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
#include <ydb/core/scheme/scheme_tabledefs.h>
2+
3+
#include <ydb/core/scheme_types/scheme_types.h>
4+
5+
#include <library/cpp/testing/unittest/registar.h>
6+
7+
#include <util/generic/vector.h>
8+
9+
namespace NKikimr {
10+
11+
Y_UNIT_TEST_SUITE(SchemeRanges) {
12+
13+
TVector<NScheme::TTypeInfo> MakeTypes(size_t keysCount) {
14+
TVector<NScheme::TTypeInfo> types;
15+
types.reserve(keysCount);
16+
for (size_t i = 0; i < keysCount; ++i) {
17+
types.push_back(NScheme::TTypeInfo(NScheme::NTypeIds::Uint32));
18+
}
19+
return types;
20+
}
21+
22+
TCell MakeUi32(ui32 key) {
23+
return TCell::Make(ui32(key));
24+
}
25+
26+
TCell MakeNull() {
27+
return TCell();
28+
}
29+
30+
Y_UNIT_TEST(RangesBorders) {
31+
auto types = MakeTypes(1);
32+
33+
for (ui32 flags = 0; flags < (1 << 4); ++flags) {
34+
TVector<TCell> firstLeft = {MakeUi32(1)};
35+
TVector<TCell> firstRight = {MakeUi32(10)};
36+
TVector<TCell> secondLeft = {MakeUi32(1)};
37+
TVector<TCell> sedondRight = {MakeUi32(10)};
38+
TTableRange first(firstLeft, ((flags >> 0) & 1), firstRight, ((flags >> 1) & 1));
39+
TTableRange second(secondLeft, ((flags >> 2) & 1), sedondRight, ((flags >> 3) & 1));
40+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), 0);
41+
}
42+
43+
TVector<TCell> firstLeft = {MakeUi32(1)};
44+
TVector<TCell> firstRight = {MakeUi32(10)};
45+
TVector<TCell> secondLeft = {MakeUi32(10)};
46+
TVector<TCell> sedondRight = {MakeUi32(100)};
47+
48+
{
49+
TTableRange first(firstLeft, true, firstRight, true);
50+
TTableRange second(secondLeft, true, sedondRight, true);
51+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), 0);
52+
UNIT_ASSERT_EQUAL(CompareRanges(second, first, types), 0);
53+
}
54+
55+
{
56+
TTableRange first(firstLeft, true, firstRight, false);
57+
TTableRange second(secondLeft, true, sedondRight, true);
58+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), -1);
59+
UNIT_ASSERT_EQUAL(CompareRanges(second, first, types), 1);
60+
}
61+
62+
{
63+
TTableRange first(firstLeft, true, firstRight, true);
64+
TTableRange second(secondLeft, false, sedondRight, true);
65+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), -1);
66+
UNIT_ASSERT_EQUAL(CompareRanges(second, first, types), 1);
67+
}
68+
69+
{
70+
TTableRange first(firstLeft, true, firstRight, false);
71+
TTableRange second(secondLeft, false, sedondRight, true);
72+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), -1);
73+
UNIT_ASSERT_EQUAL(CompareRanges(second, first, types), 1);
74+
}
75+
76+
{
77+
TTableRange first(firstLeft, false, firstRight, false);
78+
TTableRange second(secondLeft, false, sedondRight, false);
79+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), -1);
80+
UNIT_ASSERT_EQUAL(CompareRanges(second, first, types), 1);
81+
}
82+
83+
{
84+
TTableRange first(firstLeft, false, firstRight, true);
85+
TTableRange second(secondLeft, false, sedondRight, false);
86+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), -1);
87+
UNIT_ASSERT_EQUAL(CompareRanges(second, first, types), 1);
88+
}
89+
90+
{
91+
TTableRange first(firstLeft, false, firstRight, false);
92+
TTableRange second(secondLeft, true, sedondRight, false);
93+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), -1);
94+
UNIT_ASSERT_EQUAL(CompareRanges(second, first, types), 1);
95+
}
96+
97+
{
98+
TTableRange first(firstLeft, false, firstRight, true);
99+
TTableRange second(secondLeft, true, sedondRight, false);
100+
UNIT_ASSERT_EQUAL(CompareRanges(first, second, types), 0);
101+
UNIT_ASSERT_EQUAL(CompareRanges(second, first, types), 0);
102+
}
103+
}
104+
105+
Y_UNIT_TEST(CmpBorders) {
106+
auto types = MakeTypes(1);
107+
108+
TVector<TCell> b1 = {MakeUi32(1)};
109+
TVector<TCell> b10 = {MakeUi32(10)};
110+
TVector<TCell> b100 = {MakeUi32(100)};
111+
112+
for (ui32 flags = 0; flags < (1 << 2); ++flags) {
113+
UNIT_ASSERT_EQUAL((CompareBorders<false, true>(b1, b10, ((flags >> 0) & 1), ((flags >> 1) & 1), types)), -1);
114+
UNIT_ASSERT_EQUAL((CompareBorders<true, false>(b100, b10, ((flags >> 0) & 1), ((flags >> 1) & 1), types)), 1);
115+
}
116+
117+
UNIT_ASSERT_EQUAL((CompareBorders<true, true>(b10, b10, true, true, types)), 0);
118+
UNIT_ASSERT_EQUAL((CompareBorders<true, true>(b10, b10, false, true, types)), -1);
119+
UNIT_ASSERT_EQUAL((CompareBorders<true, true>(b10, b10, true, false, types)), 1);
120+
UNIT_ASSERT_EQUAL((CompareBorders<true, true>(b10, b10, false, false, types)), 0);
121+
122+
UNIT_ASSERT_EQUAL((CompareBorders<false, false>(b10, b10, true, true, types)), 0);
123+
UNIT_ASSERT_EQUAL((CompareBorders<false, false>(b10, b10, false, true, types)), 1);
124+
UNIT_ASSERT_EQUAL((CompareBorders<false, false>(b10, b10, true, false, types)), -1);
125+
UNIT_ASSERT_EQUAL((CompareBorders<false, false>(b10, b10, false, false, types)), 0);
126+
127+
UNIT_ASSERT_EQUAL((CompareBorders<true, false>(b10, b10, true, true, types)), 0);
128+
UNIT_ASSERT_EQUAL((CompareBorders<true, false>(b10, b10, false, true, types)), -1);
129+
UNIT_ASSERT_EQUAL((CompareBorders<true, false>(b10, b10, true, false, types)), -1);
130+
UNIT_ASSERT_EQUAL((CompareBorders<true, false>(b10, b10, false, false, types)), -1);
131+
132+
UNIT_ASSERT_EQUAL((CompareBorders<false, true>(b10, b10, true, true, types)), 0);
133+
UNIT_ASSERT_EQUAL((CompareBorders<false, true>(b10, b10, false, true, types)), 1);
134+
UNIT_ASSERT_EQUAL((CompareBorders<false, true>(b10, b10, true, false, types)), 1);
135+
UNIT_ASSERT_EQUAL((CompareBorders<false, true>(b10, b10, false, false, types)), 1);
136+
}
137+
}
138+
139+
}

ydb/core/scheme/scheme_tabledefs.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -374,12 +374,12 @@ inline int CompareRanges(const TTableRange& rangeX, const TTableRange& rangeY,
374374
Y_ABORT_UNLESS(!rangeX.Point);
375375
Y_ABORT_UNLESS(!rangeY.Point);
376376

377-
int xStart_yEnd = CompareBorders<true, false>(
377+
int xStart_yEnd = CompareBorders<false, true>(
378378
rangeX.From, rangeY.To, rangeX.InclusiveFrom, rangeY.InclusiveTo, types);
379379
if (xStart_yEnd > 0)
380380
return 1;
381381

382-
int xEnd_yStart = CompareBorders<false, true>(
382+
int xEnd_yStart = CompareBorders<true, false>(
383383
rangeX.To, rangeY.From, rangeX.InclusiveTo, rangeY.InclusiveFrom, types);
384384
if (xEnd_yStart < 0)
385385
return -1;

ydb/core/scheme/ut/ya.make

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ PEERDIR(
1212

1313
SRCS(
1414
scheme_borders_ut.cpp
15+
scheme_ranges_ut.cpp
1516
scheme_tablecell_ut.cpp
1617
)
1718

0 commit comments

Comments
 (0)