diff options
author | a-romanov <[email protected]> | 2023-11-29 10:53:26 +0300 |
---|---|---|
committer | a-romanov <[email protected]> | 2023-11-29 11:14:55 +0300 |
commit | 0db14d1168517ecacab106e7abfe7af663020829 (patch) | |
tree | 09b604f70d8d392e7e92a88b153909b5daded10d | |
parent | e7053b70e0c103b1ba692ec756747dd20adadb07 (diff) |
KIKIMR-19512 Split very large test on three.
-rw-r--r-- | ydb/core/kqp/ut/olap/kqp_olap_ut.cpp | 141 |
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() |