summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <[email protected]>2023-11-29 10:53:26 +0300
committera-romanov <[email protected]>2023-11-29 11:14:55 +0300
commit0db14d1168517ecacab106e7abfe7af663020829 (patch)
tree09b604f70d8d392e7e92a88b153909b5daded10d
parente7053b70e0c103b1ba692ec756747dd20adadb07 (diff)
KIKIMR-19512 Split very large test on three.
-rw-r--r--ydb/core/kqp/ut/olap/kqp_olap_ut.cpp141
1 files changed, 83 insertions, 58 deletions
diff --git a/ydb/core/kqp/ut/olap/kqp_olap_ut.cpp b/ydb/core/kqp/ut/olap/kqp_olap_ut.cpp
index 9986a39396f..e37866d71d0 100644
--- a/ydb/core/kqp/ut/olap/kqp_olap_ut.cpp
+++ b/ydb/core/kqp/ut/olap/kqp_olap_ut.cpp
@@ -134,7 +134,7 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
UNIT_ASSERT(NJson::ReadJsonFastTree(*plan, statInfo));
}
}
-
+
if (streamPart.HasDiagnostics()) {
TString diagnosticsString = streamPart.GetDiagnostics();
if (!diagnosticsString.empty() && diagnostics) {
@@ -1521,6 +1521,17 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
UNIT_ASSERT(rows.size() == expectedCount);
}
+ TString BuildQuery(const TString& predicate, bool pushEnabled) {
+ TStringBuilder qBuilder;
+ qBuilder << "--!syntax_v1" << Endl;
+ qBuilder << "PRAGMA Kikimr.OptEnableOlapPushdown = '" << (pushEnabled ? "true" : "false") << "';" << Endl;
+ qBuilder << "PRAGMA Kikimr.OptEnablePredicateExtract = 'false';" << Endl;
+ qBuilder << "SELECT `timestamp` FROM `/Root/olapStore/olapTable` WHERE ";
+ qBuilder << predicate;
+ qBuilder << " ORDER BY `timestamp`";
+ return qBuilder;
+ };
+
Y_UNIT_TEST(PredicatePushdown) {
constexpr bool logQueries = false;
auto settings = TKikimrSettings()
@@ -1594,60 +1605,9 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
#endif
};
- std::vector<TString> testDataNoPush = {
- R"(`level` != NULL)",
- R"(`level` > NULL)",
- R"(`timestamp` >= CAST(3000001 AS Timestamp))",
- R"(`level` >= CAST("2" As Uint32))",
- R"(`level` = NULL)",
- R"(`level` > NULL)",
- R"(LENGTH(`uid`) > 0 OR `resource_id` = "10001")",
- R"((LENGTH(`uid`) > 0 AND `resource_id` = "10001") OR `resource_id` = "10002")",
- R"((LENGTH(`uid`) > 0 OR `resource_id` = "10002") AND (LENGTH(`uid`) < 15 OR `resource_id` = "10001"))",
- R"(NOT(LENGTH(`uid`) > 0 AND `resource_id` = "10001"))",
- // Not strict function in the beginning causes to disable pushdown
- R"(Unwrap(`level`/1) = `level` AND `resource_id` = "10001")",
- // We can handle this case in future
- R"(NOT(LENGTH(`uid`) > 0 OR `resource_id` = "10001"))",
-#if SSA_RUNTIME_VERSION < 2U
- R"(`uid` LIKE "%30000%")",
- R"(`uid` LIKE "uid%")",
- R"(`uid` LIKE "%001")",
- R"(`uid` LIKE "uid%001")",
-#endif
- };
-
- std::vector<TString> testDataPartialPush = {
- R"(LENGTH(`uid`) > 0 AND `resource_id` = "10001")",
- R"(`resource_id` = "10001" AND `level` > 1 AND LENGTH(`uid`) > 0)",
- R"(`resource_id` >= "10001" AND LENGTH(`uid`) > 0 AND `level` >= 1 AND `level` < 3)",
- R"(LENGTH(`uid`) > 0 AND (`resource_id` >= "10001" OR `level`>= 1 AND `level` <= 3))",
- R"(NOT(`resource_id` = "10001" OR `level` >= 1) AND LENGTH(`uid`) > 0)",
- R"(NOT(`resource_id` = "10001" AND `level` != 1) AND LENGTH(`uid`) > 0)",
- R"(`resource_id` = "10001" AND Unwrap(`level`/1) = `level`)",
- R"(`resource_id` = "10001" AND Unwrap(`level`/1) = `level` AND `level` > 1)",
- };
-
- auto buildQuery = [](const TString& predicate, bool pushEnabled) {
- TStringBuilder qBuilder;
-
- qBuilder << "--!syntax_v1" << Endl;
-
- if (!pushEnabled) {
- qBuilder << R"(PRAGMA Kikimr.OptEnableOlapPushdown = "false";)" << Endl;
- }
-
- qBuilder << R"(PRAGMA Kikimr.OptEnablePredicateExtract = "false";)" << Endl;
- qBuilder << "SELECT `timestamp` FROM `/Root/olapStore/olapTable` WHERE ";
- qBuilder << predicate;
- qBuilder << " ORDER BY `timestamp`";
-
- return TString(qBuilder);
- };
-
for (const auto& predicate: testData) {
- auto normalQuery = buildQuery(predicate, false);
- auto pushQuery = buildQuery(predicate, true);
+ auto normalQuery = BuildQuery(predicate, false);
+ auto pushQuery = BuildQuery(predicate, true);
Cerr << "--- Run normal query ---\n";
Cerr << normalQuery << Endl;
@@ -1678,9 +1638,48 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
UNIT_ASSERT_C(ast.find("KqpOlapFilter") != std::string::npos,
TStringBuilder() << "Predicate not pushed down. Query: " << pushQuery);
}
+ }
+
+ Y_UNIT_TEST(PredicateDoNotPushdown) {
+ constexpr bool logQueries = false;
+ auto settings = TKikimrSettings()
+ .SetWithSampleTables(false);
+ TKikimrRunner kikimr(settings);
+
+ TStreamExecScanQuerySettings scanSettings;
+ scanSettings.Explain(true);
+
+ TLocalHelper(kikimr).CreateTestOlapTable();
+ WriteTestData(kikimr, "/Root/olapStore/olapTable", 10000, 3000000, 5);
+ Tests::NCommon::TLoggerInit(kikimr).Initialize();
+
+ auto tableClient = kikimr.GetTableClient();
+
+ std::vector<TString> testDataNoPush = {
+ R"(`level` != NULL)",
+ R"(`level` > NULL)",
+ R"(`timestamp` >= CAST(3000001 AS Timestamp))",
+ R"(`level` >= CAST("2" As Uint32))",
+ R"(`level` = NULL)",
+ R"(`level` > NULL)",
+ R"(LENGTH(`uid`) > 0 OR `resource_id` = "10001")",
+ R"((LENGTH(`uid`) > 0 AND `resource_id` = "10001") OR `resource_id` = "10002")",
+ R"((LENGTH(`uid`) > 0 OR `resource_id` = "10002") AND (LENGTH(`uid`) < 15 OR `resource_id` = "10001"))",
+ R"(NOT(LENGTH(`uid`) > 0 AND `resource_id` = "10001"))",
+ // Not strict function in the beginning causes to disable pushdown
+ R"(Unwrap(`level`/1) = `level` AND `resource_id` = "10001")",
+ // We can handle this case in future
+ R"(NOT(LENGTH(`uid`) > 0 OR `resource_id` = "10001"))",
+#if SSA_RUNTIME_VERSION < 2U
+ R"(`uid` LIKE "%30000%")",
+ R"(`uid` LIKE "uid%")",
+ R"(`uid` LIKE "%001")",
+ R"(`uid` LIKE "uid%001")",
+#endif
+ };
for (const auto& predicate: testDataNoPush) {
- auto pushQuery = buildQuery(predicate, true);
+ auto pushQuery = BuildQuery(predicate, true);
if (logQueries) {
Cerr << "Query: " << pushQuery << Endl;
@@ -1695,10 +1694,37 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
UNIT_ASSERT_C(ast.find("KqpOlapFilter") == std::string::npos,
TStringBuilder() << "Predicate pushed down. Query: " << pushQuery);
}
+ }
+
+ Y_UNIT_TEST(PredicatePushdownPartial) {
+ constexpr bool logQueries = false;
+ auto settings = TKikimrSettings()
+ .SetWithSampleTables(false);
+ TKikimrRunner kikimr(settings);
+
+ TStreamExecScanQuerySettings scanSettings;
+ scanSettings.Explain(true);
+
+ TLocalHelper(kikimr).CreateTestOlapTable();
+ WriteTestData(kikimr, "/Root/olapStore/olapTable", 10000, 3000000, 5);
+ Tests::NCommon::TLoggerInit(kikimr).Initialize();
+
+ auto tableClient = kikimr.GetTableClient();
+
+ std::vector<TString> testDataPartialPush = {
+ R"(LENGTH(`uid`) > 0 AND `resource_id` = "10001")",
+ R"(`resource_id` = "10001" AND `level` > 1 AND LENGTH(`uid`) > 0)",
+ R"(`resource_id` >= "10001" AND LENGTH(`uid`) > 0 AND `level` >= 1 AND `level` < 3)",
+ R"(LENGTH(`uid`) > 0 AND (`resource_id` >= "10001" OR `level`>= 1 AND `level` <= 3))",
+ R"(NOT(`resource_id` = "10001" OR `level` >= 1) AND LENGTH(`uid`) > 0)",
+ R"(NOT(`resource_id` = "10001" AND `level` != 1) AND LENGTH(`uid`) > 0)",
+ R"(`resource_id` = "10001" AND Unwrap(`level`/1) = `level`)",
+ R"(`resource_id` = "10001" AND Unwrap(`level`/1) = `level` AND `level` > 1)",
+ };
for (const auto& predicate: testDataPartialPush) {
- auto normalQuery = buildQuery(predicate, false);
- auto pushQuery = buildQuery(predicate, true);
+ auto normalQuery = BuildQuery(predicate, false);
+ auto pushQuery = BuildQuery(predicate, true);
Cerr << "--- Run normal query ---\n";
Cerr << normalQuery << Endl;
@@ -1732,7 +1758,6 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
TStringBuilder() << "NarrowMap was removed. Query: " << pushQuery);
}
}
-
#if SSA_RUNTIME_VERSION >= 2U
Y_UNIT_TEST(PredicatePushdown_DifferentLvlOfFilters) {
auto settings = TKikimrSettings()