Skip to content

Commit 19f5ca5

Browse files
nikvas0zinal
authored andcommitted
[24-3] Fix CompareRanges & acl for sink (ydb-platform#12275)
1 parent 89ab785 commit 19f5ca5

File tree

5 files changed

+247
-3
lines changed

5 files changed

+247
-3
lines changed

ydb/core/kqp/executer_actor/kqp_tasks_graph.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,11 @@ void FillKqpTasksGraphStages(TKqpTasksGraph& tasksGraph, const TVector<IKqpGatew
134134
YQL_ENSURE(stage.SinksSize() == 1);
135135
meta.TableId = MakeTableId(settings.GetTable());
136136
meta.TablePath = settings.GetTable().GetPath();
137-
meta.ShardOperations.insert(TKeyDesc::ERowOperation::Update);
137+
if (settings.GetType() == NKikimrKqp::TKqpTableSinkSettings::MODE_DELETE) {
138+
meta.ShardOperations.insert(TKeyDesc::ERowOperation::Erase);
139+
} else {
140+
meta.ShardOperations.insert(TKeyDesc::ERowOperation::Update);
141+
}
138142
meta.TableConstInfo = tx.Body->GetTableConstInfoById()->Map.at(meta.TableId);
139143
}
140144
}

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

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4817,6 +4817,106 @@ Y_UNIT_TEST_SUITE(KqpQueryService) {
48174817
R"([[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]];[["row"]]])");
48184818
}
48194819
}
4820+
4821+
Y_UNIT_TEST(ReadManyRanges) {
4822+
NKikimrConfig::TAppConfig appConfig;
4823+
auto settings = TKikimrSettings()
4824+
.SetAppConfig(appConfig)
4825+
.SetWithSampleTables(false);
4826+
4827+
TKikimrRunner kikimr(settings);
4828+
Tests::NCommon::TLoggerInit(kikimr).Initialize();
4829+
4830+
auto session = kikimr.GetTableClient().CreateSession().GetValueSync().GetSession();
4831+
4832+
const TString query = R"(
4833+
CREATE TABLE `/Root/DataShard` (
4834+
Col1 String,
4835+
Col2 String,
4836+
Col3 String,
4837+
PRIMARY KEY (Col1, Col2)
4838+
)
4839+
WITH (
4840+
STORE = ROW,
4841+
AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10,
4842+
PARTITION_AT_KEYS = (("a"), ("b"), ("c"), ("d"), ("e"), ("f"), ("g"), ("h"), ("k"), ("p"), ("q"), ("x"))
4843+
);
4844+
)";
4845+
4846+
auto result = session.ExecuteSchemeQuery(query).GetValueSync();
4847+
UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
4848+
4849+
auto client = kikimr.GetQueryClient();
4850+
4851+
{
4852+
auto prepareResult = client.ExecuteQuery(R"(
4853+
UPSERT INTO `/Root/DataShard` (Col1, Col2) VALUES ("y", "1") , ("y", "2"), ("d", "1"), ("b", "1"), ("k", "1"), ("q", "1"), ("p", "1");
4854+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4855+
UNIT_ASSERT_C(prepareResult.IsSuccess(), prepareResult.GetIssues().ToString());
4856+
}
4857+
4858+
{
4859+
auto result = client.ExecuteQuery(R"(
4860+
SELECT COUNT(*) FROM `/Root/DataShard` WHERE Col1 IN ("d", "b", "k", "q", "p") OR (Col1 = "y" AND Col2 = "2");
4861+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4862+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
4863+
CompareYson(R"([[6u]])", FormatResultSetYson(result.GetResultSet(0)));
4864+
}
4865+
4866+
{
4867+
auto result = client.ExecuteQuery(R"(
4868+
SELECT COUNT(*) FROM `/Root/DataShard` WHERE Col1 = "y";
4869+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4870+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
4871+
CompareYson(R"([[2u]])", FormatResultSetYson(result.GetResultSet(0)));
4872+
}
4873+
}
4874+
4875+
Y_UNIT_TEST(ReadManyShardsRange) {
4876+
NKikimrConfig::TAppConfig appConfig;
4877+
auto settings = TKikimrSettings()
4878+
.SetAppConfig(appConfig)
4879+
.SetWithSampleTables(false);
4880+
4881+
TKikimrRunner kikimr(settings);
4882+
Tests::NCommon::TLoggerInit(kikimr).Initialize();
4883+
4884+
auto session = kikimr.GetTableClient().CreateSession().GetValueSync().GetSession();
4885+
4886+
const TString query = R"(
4887+
CREATE TABLE `/Root/DataShard` (
4888+
Col1 String,
4889+
Col2 String,
4890+
Col3 String,
4891+
PRIMARY KEY (Col1, Col2)
4892+
)
4893+
WITH (
4894+
STORE = ROW,
4895+
AUTO_PARTITIONING_MIN_PARTITIONS_COUNT = 10,
4896+
PARTITION_AT_KEYS = (("a", "0"), ("b", "b"), ("c", "d"))
4897+
);
4898+
)";
4899+
4900+
auto result = session.ExecuteSchemeQuery(query).GetValueSync();
4901+
UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString());
4902+
4903+
auto client = kikimr.GetQueryClient();
4904+
4905+
{
4906+
auto prepareResult = client.ExecuteQuery(R"(
4907+
UPSERT INTO `/Root/DataShard` (Col1, Col2) VALUES ("a", "a") , ("c", "c"), ("d", "d");
4908+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4909+
UNIT_ASSERT_C(prepareResult.IsSuccess(), prepareResult.GetIssues().ToString());
4910+
}
4911+
4912+
{
4913+
auto result = client.ExecuteQuery(R"(
4914+
SELECT COUNT(*) FROM `/Root/DataShard` WHERE "a" <= Col1 AND Col1 <= "c";
4915+
)", NYdb::NQuery::TTxControl::BeginTx().CommitTx()).ExtractValueSync();
4916+
UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString());
4917+
CompareYson(R"([[2u]])", FormatResultSetYson(result.GetResultSet(0)));
4918+
}
4919+
}
48204920
}
48214921

48224922
} // namespace NKqp

ydb/core/scheme/scheme_ranges_ut.cpp

Lines changed: 139 additions & 0 deletions
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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,12 +356,12 @@ inline int CompareRanges(const TTableRange& rangeX, const TTableRange& rangeY,
356356
Y_ABORT_UNLESS(!rangeX.Point);
357357
Y_ABORT_UNLESS(!rangeY.Point);
358358

359-
int xStart_yEnd = CompareBorders<true, false>(
359+
int xStart_yEnd = CompareBorders<false, true>(
360360
rangeX.From, rangeY.To, rangeX.InclusiveFrom, rangeY.InclusiveTo, types);
361361
if (xStart_yEnd > 0)
362362
return 1;
363363

364-
int xEnd_yStart = CompareBorders<false, true>(
364+
int xEnd_yStart = CompareBorders<true, false>(
365365
rangeX.To, rangeY.From, rangeX.InclusiveTo, rangeY.InclusiveFrom, types);
366366
if (xEnd_yStart < 0)
367367
return -1;

ydb/core/scheme/ut/ya.make

Lines changed: 1 addition & 0 deletions
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)