@@ -1510,7 +1510,7 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
1510
1510
// This check is based on an assumpltion, that for pushed down predicates column names are preserved in AST
1511
1511
// But for non-pushed down predicates column names are (usually) replaced with a label, started with $. It' not a rule, but a heuristic
1512
1512
// So this check may require a correction when some ast optimization rules are changed
1513
- UNIT_ASSERT_C (ast.find (R"( (Unwrap (/ $)" ) != std::string::npos,
1513
+ UNIT_ASSERT_C (ast.find (R"( (Unwrap (/ $)" ) != std::string::npos,
1514
1514
TStringBuilder () << " Unsafe subpredicate is pushed down. Query: " << query);
1515
1515
1516
1516
UNIT_ASSERT_C (ast.find (" NarrowMap" ) != std::string::npos,
@@ -1828,6 +1828,87 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
1828
1828
UNIT_ASSERT_VALUES_EQUAL (result, insertRows);
1829
1829
}
1830
1830
1831
+ Y_UNIT_TEST (PredicatePushdownWithParametersILike) {
1832
+ constexpr bool logQueries = true ;
1833
+ auto settings = TKikimrSettings ()
1834
+ .SetWithSampleTables (false );
1835
+ TKikimrRunner kikimr (settings);
1836
+
1837
+ TStreamExecScanQuerySettings scanSettings;
1838
+ scanSettings.Explain (true );
1839
+
1840
+ TLocalHelper (kikimr.GetTestServer ()).CreateTestOlapTable ();
1841
+ WriteTestData (kikimr, " /Root/olapStore/olapTable" , 10000 , 3000000 , 1000 );
1842
+
1843
+ auto tableClient = kikimr.GetTableClient ();
1844
+
1845
+ auto buildQuery = [](bool pushEnabled) {
1846
+ TStringBuilder builder;
1847
+
1848
+ builder << " --!syntax_v1" << Endl;
1849
+
1850
+ if (!pushEnabled) {
1851
+ builder << " PRAGMA Kikimr.OptEnableOlapPushdown = \" false\" ;" << Endl;
1852
+ }
1853
+
1854
+ builder << R"(
1855
+ DECLARE $in_uid AS Utf8;
1856
+ DECLARE $in_level AS Int32;
1857
+
1858
+ SELECT `timestamp` FROM `/Root/olapStore/olapTable` WHERE
1859
+ uid ILIKE "uid_%" || $in_uid || "%" AND level > $in_level
1860
+ ORDER BY `timestamp`;
1861
+ )" << Endl;
1862
+
1863
+ return builder;
1864
+ };
1865
+
1866
+ auto normalQuery = buildQuery (false );
1867
+ auto pushQuery = buildQuery (true );
1868
+
1869
+ auto params = tableClient.GetParamsBuilder ()
1870
+ .AddParam (" $in_uid" )
1871
+ .Utf8 (" 3000" )
1872
+ .Build ()
1873
+ .AddParam (" $in_level" )
1874
+ .Int32 (2 )
1875
+ .Build ()
1876
+ .Build ();
1877
+
1878
+ auto it = tableClient.StreamExecuteScanQuery (normalQuery, params).GetValueSync ();
1879
+ UNIT_ASSERT_C (it.IsSuccess (), it.GetIssues ().ToString ());
1880
+ auto goodResult = CollectStreamResult (it);
1881
+
1882
+ it = tableClient.StreamExecuteScanQuery (pushQuery, params).GetValueSync ();
1883
+ UNIT_ASSERT_C (it.IsSuccess (), it.GetIssues ().ToString ());
1884
+ auto pushResult = CollectStreamResult (it);
1885
+
1886
+ if (logQueries) {
1887
+ Cerr << " Query: " << normalQuery << Endl;
1888
+ Cerr << " Expected: " << goodResult.ResultSetYson << Endl;
1889
+ Cerr << " Received: " << pushResult.ResultSetYson << Endl;
1890
+ }
1891
+
1892
+ CompareYson (goodResult.ResultSetYson , pushResult.ResultSetYson );
1893
+
1894
+ it = tableClient.StreamExecuteScanQuery (pushQuery, scanSettings).GetValueSync ();
1895
+ UNIT_ASSERT_C (it.IsSuccess (), it.GetIssues ().ToString ());
1896
+
1897
+ auto result = CollectStreamResult (it);
1898
+ auto ast = result.QueryStats ->Getquery_ast ();
1899
+
1900
+ UNIT_ASSERT_C (ast.find (" KqpOlapFilter" ) != std::string::npos,
1901
+ TStringBuilder () << " Predicate not pushed down. Query: " << pushQuery);
1902
+
1903
+ NJson::TJsonValue plan, readRange;
1904
+ NJson::ReadJsonTree (*result.PlanJson , &plan, true );
1905
+
1906
+ Cerr << result.PlanJson << Endl;
1907
+
1908
+ readRange = FindPlanNodeByKv (plan, " Name" , " TableFullScan" );
1909
+ UNIT_ASSERT (readRange.IsDefined ());
1910
+ }
1911
+
1831
1912
Y_UNIT_TEST (PredicatePushdownWithParameters) {
1832
1913
constexpr bool logQueries = true ;
1833
1914
auto settings = TKikimrSettings ()
@@ -3332,9 +3413,9 @@ Y_UNIT_TEST_SUITE(KqpOlap) {
3332
3413
3333
3414
)" , noTx).GetValueSync ();
3334
3415
UNIT_ASSERT_C (result.GetStatus () == NYdb::EStatus::SUCCESS, result.GetIssues ().ToString ());
3335
-
3416
+
3336
3417
result = queryClient.ExecuteQuery (R"(
3337
- UPSERT INTO Test (Id, Name, Comment) VALUES
3418
+ UPSERT INTO Test (Id, Name, Comment) VALUES
3338
3419
(10, "n1", "aa"),
3339
3420
(20, "n2", "bb"),
3340
3421
(30, "n3", "cc"),
0 commit comments