Skip to content

Commit 6e11f03

Browse files
author
Matveev Sergei
committed
added columnshard tests for bool
1 parent bc6d961 commit 6e11f03

File tree

3 files changed

+290
-0
lines changed

3 files changed

+290
-0
lines changed

.github/config/muted_ya.txt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,24 @@ ydb/core/kqp/ut/indexes KqpMultishardIndex.WriteIntoRenamingSyncIndex
3232
ydb/core/kqp/ut/olap KqpOlapJson.BrokenJsonWriting[2,true,1,10,1000000,0]
3333
ydb/core/kqp/ut/olap KqpOlapOptimizer.OptimizationAfterDeletion
3434
ydb/core/kqp/ut/olap KqpOlapSysView.StatsSysViewColumns
35+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestSimpleQueries+UseScanQuery
36+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestSimpleQueries-UseScanQuery
37+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestFilterEqual+UseScanQuery
38+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestFilterEqual-UseScanQuery
39+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestFilterNulls+UseScanQuery
40+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestFilterNulls-UseScanQuery
41+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestFilterCompare+UseScanQuery
42+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestFilterCompare-UseScanQuery
43+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestOrderByBool+UseScanQuery
44+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestOrderByBool-UseScanQuery
45+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestGroupByBool+UseScanQuery
46+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestGroupByBool-UseScanQuery
47+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestAggregation+UseScanQuery
48+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestAggregation-UseScanQuery
49+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestJoinById+UseScanQuery
50+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestJoinById-UseScanQuery
51+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestJoinByBool+UseScanQuery
52+
ydb/core/kqp/ut/olap KqpBoolColumnShard.TestJoinByBool-UseScanQuery
3553
ydb/core/kqp/ut/opt KqpKv.ReadRows_TimeoutCancelsReads
3654
ydb/core/kqp/ut/query KqpAnalyze.AnalyzeTable+ColumnStore
3755
ydb/core/kqp/ut/query KqpStats.DeferredEffects+UseSink

ydb/core/kqp/ut/olap/bool_ut.cpp

Lines changed: 271 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
1+
#include <ydb/core/formats/arrow/arrow_helpers.h>
2+
#include <ydb/core/kqp/ut/common/columnshard.h>
3+
#include <ydb/core/kqp/ut/common/kqp_ut_common.h>
4+
#include <ydb/core/testlib/common_helper.h>
5+
#include <ydb/core/testlib/cs_helper.h>
6+
#include <ydb/core/tx/columnshard/hooks/testing/controller.h>
7+
#include <ydb/core/tx/columnshard/test_helper/test_combinator.h>
8+
#include <ydb/core/tx/tx_proxy/proxy.h>
9+
10+
#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/draft/ydb_replication.h>
11+
#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/proto/accessor.h>
12+
#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/scheme/scheme.h>
13+
#include <ydb/public/sdk/cpp/include/ydb-cpp-sdk/client/topic/client.h>
14+
15+
#include <library/cpp/threading/local_executor/local_executor.h>
16+
#include <util/generic/serialized_enum.h>
17+
#include <util/string/printf.h>
18+
#include <yql/essentials/types/binary_json/write.h>
19+
#include <yql/essentials/types/uuid/uuid.h>
20+
21+
namespace NKikimr {
22+
namespace NKqp {
23+
24+
using namespace NYdb;
25+
using namespace NYdb::NTable;
26+
27+
enum class EQueryMode {
28+
SCAN_QUERY,
29+
EXECUTE_QUERY
30+
};
31+
32+
Y_UNIT_TEST_SUITE(KqpBoolColumnShard) {
33+
class TBoolTestCase {
34+
public:
35+
TBoolTestCase()
36+
: TestHelper(TKikimrSettings().SetWithSampleTables(false)) {
37+
}
38+
39+
TTestHelper::TUpdatesBuilder Inserter() {
40+
return TTestHelper::TUpdatesBuilder(TestTable.GetArrowSchema(Schema));
41+
}
42+
43+
void Upsert(TTestHelper::TUpdatesBuilder& inserter) {
44+
TestHelper.BulkUpsert(TestTable, inserter);
45+
}
46+
47+
void CheckQuery(const TString& query, const TString& expected, EQueryMode mode = EQueryMode::SCAN_QUERY) const {
48+
switch (mode) {
49+
case EQueryMode::SCAN_QUERY:
50+
TestHelper.ReadData(query, expected);
51+
break;
52+
case EQueryMode::EXECUTE_QUERY: {
53+
TestHelper.ExecuteQuery(query);
54+
break;
55+
}
56+
}
57+
}
58+
59+
void ExecuteDataQuery(const TString& query) const {
60+
TestHelper.ExecuteQuery(query);
61+
}
62+
63+
void PrepareTable1() {
64+
Schema = {
65+
TTestHelper::TColumnSchema().SetName("id").SetType(NScheme::NTypeIds::Int32).SetNullable(false),
66+
TTestHelper::TColumnSchema().SetName("int").SetType(NScheme::NTypeIds::Int64),
67+
TTestHelper::TColumnSchema().SetName("b").SetType(NScheme::NTypeIds::Bool),
68+
};
69+
70+
TestTable.SetName("/Root/Table1").SetPrimaryKey({ "id" }).SetSharding({ "id" }).SetSchema(Schema);
71+
TestHelper.CreateTable(TestTable);
72+
73+
{
74+
TTestHelper::TUpdatesBuilder inserter = Inserter();
75+
inserter.AddRow().Add(1).Add(4).Add(true);
76+
inserter.AddRow().Add(2).Add(3).Add(false);
77+
Upsert(inserter);
78+
}
79+
{
80+
TTestHelper::TUpdatesBuilder inserter = Inserter();
81+
inserter.AddRow().Add(4).Add(1).Add(true);
82+
inserter.AddRow().Add(3).Add(2).Add(true);
83+
84+
Upsert(inserter);
85+
}
86+
}
87+
88+
void PrepareTable2() {
89+
Schema = {
90+
TTestHelper::TColumnSchema().SetName("id").SetType(NScheme::NTypeIds::Int32).SetNullable(false),
91+
TTestHelper::TColumnSchema().SetName("table1_id").SetType(NScheme::NTypeIds::Int64),
92+
TTestHelper::TColumnSchema().SetName("b").SetType(NScheme::NTypeIds::Bool),
93+
};
94+
TestTable.SetName("/Root/Table2").SetPrimaryKey({ "id" }).SetSharding({ "id" }).SetSchema(Schema);
95+
TestHelper.CreateTable(TestTable);
96+
97+
{
98+
TTestHelper::TUpdatesBuilder inserter = Inserter();
99+
inserter.AddRow().Add(1).Add(1).Add(true);
100+
inserter.AddRow().Add(2).Add(1).Add(false);
101+
inserter.AddRow().Add(3).Add(2).Add(true);
102+
inserter.AddRow().Add(4).Add(2).Add(false);
103+
Upsert(inserter);
104+
}
105+
}
106+
107+
private:
108+
TTestHelper TestHelper;
109+
110+
TVector<TTestHelper::TColumnSchema> Schema;
111+
TTestHelper::TColumnTable TestTable;
112+
};
113+
114+
Y_UNIT_TEST_DUO(TestSimpleQueries, UseScanQuery) {
115+
TBoolTestCase tester;
116+
tester.PrepareTable1();
117+
118+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
119+
120+
auto check = [mode](const TBoolTestCase& t) {
121+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE id=1", "[[[%true];1;[4]]]", mode);
122+
123+
t.CheckQuery("SELECT * FROM `/Root/Table1` order by id", "[[[%true];1;[4]];[[%false];2;[3]];[[%true];3;[2]];[[%true];4;[1]]]", mode);
124+
};
125+
126+
check(tester);
127+
}
128+
129+
Y_UNIT_TEST_DUO(TestFilterEqual, UseScanQuery) {
130+
TBoolTestCase tester;
131+
tester.PrepareTable1();
132+
133+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
134+
135+
auto check = [mode](const TBoolTestCase& t) {
136+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE b == true", "[[[%true];1;[4]];[[%true];3;[2]];[[%true];4;[1]]]", mode);
137+
138+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE b != true order by id", "[[[%false];2;[3]]]", mode);
139+
};
140+
141+
check(tester);
142+
}
143+
144+
Y_UNIT_TEST_DUO(TestFilterNulls, UseScanQuery) {
145+
TBoolTestCase tester;
146+
tester.PrepareTable1();
147+
148+
auto insert = [](TBoolTestCase& t) {
149+
TTestHelper::TUpdatesBuilder inserter = t.Inserter();
150+
inserter.AddRow().Add(5).Add(5).AddNull();
151+
inserter.AddRow().Add(6).Add(6).AddNull();
152+
t.Upsert(inserter);
153+
};
154+
155+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
156+
157+
auto check = [mode](const TBoolTestCase& t) {
158+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE b is NULL order by id", "[[[#];5;[5]];[[#];6;[6]]]", mode);
159+
160+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE b is not NULL order by id",
161+
"[[[%true];1;[4]];[[%false];2;[3]];[[%true];3;[2]];[[%true];4;[1]]]", mode);
162+
};
163+
164+
insert(tester);
165+
check(tester);
166+
}
167+
168+
Y_UNIT_TEST_DUO(TestFilterCompare, UseScanQuery) {
169+
TBoolTestCase tester;
170+
tester.PrepareTable1();
171+
172+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
173+
174+
auto check = [mode](const TBoolTestCase& t) {
175+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE b < true order by id", "[[[%false];2;[3]]]", mode);
176+
177+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE b > false order by id", "[[[%true];1;[4]];[[%true];3;[2]];[[%true];4;[1]]]", mode);
178+
179+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE b <= true order by id",
180+
"[[[%true];1;[4]];[[%false];2;[3]];[[%true];3;[2]];[[%true];4;[1]]]", mode);
181+
182+
t.CheckQuery("SELECT * FROM `/Root/Table1` WHERE b >= true order by id", "[[[%true];1;[4]];[[%true];3;[2]];[[%true];4;[1]]]", mode);
183+
};
184+
185+
check(tester);
186+
}
187+
188+
Y_UNIT_TEST_DUO(TestOrderByBool, UseScanQuery) {
189+
TBoolTestCase tester;
190+
tester.PrepareTable1();
191+
192+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
193+
194+
auto check = [mode](const TBoolTestCase& t) {
195+
t.CheckQuery("SELECT * FROM `/Root/Table1` order by b", "[[[%false];2;[3]];[[%true];1;[4]];[[%true];3;[2]];[[%true];4;[1]]]", mode);
196+
};
197+
198+
check(tester);
199+
}
200+
201+
Y_UNIT_TEST_DUO(TestGroupByBool, UseScanQuery) {
202+
TBoolTestCase tester;
203+
tester.PrepareTable1();
204+
205+
auto insert = [](TBoolTestCase& t) {
206+
TTestHelper::TUpdatesBuilder inserter = t.Inserter();
207+
inserter.AddRow().Add(5).Add(12).Add(true);
208+
inserter.AddRow().Add(6).Add(30).Add(false);
209+
t.Upsert(inserter);
210+
};
211+
212+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
213+
214+
auto check = [mode](const TBoolTestCase& t) {
215+
t.CheckQuery("SELECT b, count(*) FROM `/Root/Table1` group by b order by b", "[[[%false];2u];[[%true];4u]]", mode);
216+
};
217+
218+
insert(tester);
219+
check(tester);
220+
}
221+
222+
Y_UNIT_TEST_DUO(TestAggregation, UseScanQuery) {
223+
TBoolTestCase tester;
224+
tester.PrepareTable1();
225+
226+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
227+
228+
auto check = [mode](const TBoolTestCase& t) {
229+
t.CheckQuery("SELECT min(b) FROM `/Root/Table1`", "[[[%false]]]", mode);
230+
t.CheckQuery("SELECT max(b) FROM `/Root/Table1`", "[[[%true]]]", mode);
231+
};
232+
233+
check(tester);
234+
}
235+
236+
Y_UNIT_TEST_DUO(TestJoinById, UseScanQuery) {
237+
TBoolTestCase tester;
238+
tester.PrepareTable1();
239+
tester.PrepareTable2();
240+
241+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
242+
243+
auto check = [mode](const TBoolTestCase& t) {
244+
t.CheckQuery(
245+
"SELECT t1.id, t1.b, t2.b FROM `/Root/Table1` as t1 join `/Root/Table2` as t2 on t1.id = t2.table1_id order by t1.id, t1.b, "
246+
"t2.b",
247+
R"([[1;[%true];[%false]];[1;[%true];[%true]];[2;[%false];[%false]];[2;[%false];[%true]]])", mode);
248+
};
249+
250+
check(tester);
251+
}
252+
253+
Y_UNIT_TEST_DUO(TestJoinByBool, UseScanQuery) {
254+
TBoolTestCase tester;
255+
tester.PrepareTable1();
256+
tester.PrepareTable2();
257+
258+
EQueryMode mode = UseScanQuery ? EQueryMode::SCAN_QUERY : EQueryMode::EXECUTE_QUERY;
259+
260+
auto check = [mode](const TBoolTestCase& t) {
261+
t.CheckQuery(
262+
"SELECT t1.id, t2.id, t1.b FROM `/Root/Table1` as t1 join `/Root/Table2` as t2 on t1.b = t2.b order by t1.id, t2.id, t1.b",
263+
R"([[1;1;[%true]];[1;3;[%true]];[2;2;[%false]];[2;4;[%false]];[3;1;[%true]];[3;3;[%true]];[4;1;[%true]];[4;3;[%true]]])", mode);
264+
};
265+
266+
check(tester);
267+
}
268+
}
269+
270+
} // namespace NKqp
271+
} // namespace NKikimr

ydb/core/kqp/ut/olap/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ SRCS(
1414
GLOBAL blobs_sharing_ut.cpp
1515
GLOBAL kqp_olap_ut.cpp
1616
aggregations_ut.cpp
17+
bool_ut.cpp
1718
clickbench_ut.cpp
1819
compaction_ut.cpp
1920
compression_ut.cpp

0 commit comments

Comments
 (0)