Skip to content

Commit 26ed08b

Browse files
authored
YQ RD added brackets during pushdown (#11742)
1 parent 4652366 commit 26ed08b

File tree

2 files changed

+32
-28
lines changed

2 files changed

+32
-28
lines changed

ydb/library/yql/providers/generic/provider/yql_generic_predicate_pushdown.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ namespace NYql {
629629
auto left = FormatExpression(comparison.left_value());
630630
auto right = FormatExpression(comparison.right_value());
631631

632-
return left + operation + right;
632+
return TStringBuilder() << "(" << left << operation << right << ")";
633633
}
634634

635635
TString FormatIn(const TPredicate_TIn& in) {
@@ -639,7 +639,7 @@ namespace NYql {
639639
if (!list.empty()) {
640640
list << ", ";
641641
} else {
642-
list << value << " IN (";
642+
list << "(" << value << " IN (";
643643
}
644644
list << FormatExpression(expr);
645645
}
@@ -648,14 +648,14 @@ namespace NYql {
648648
throw yexception() << "failed to format IN statement, no operands";
649649
}
650650

651-
list << ")";
651+
list << "))";
652652
return list.Str();
653653
}
654654

655655
TString FormatRegexp(const TPredicate::TRegexp& regexp) {
656656
const auto& value = FormatExpression(regexp.value());
657657
const auto& pattern = FormatExpression(regexp.pattern());
658-
return TStringBuilder() << value << " REGEXP " << pattern;
658+
return TStringBuilder() << "(" << value << " REGEXP " << pattern << ")";
659659
}
660660

661661
TString FormatPredicate(const TPredicate& predicate) {

ydb/tests/fq/yds/test_row_dispatcher.py

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -314,21 +314,23 @@ def test_filters_non_optional_field(self, kikimr, client):
314314
'{"time": 102, "data": "hello2", "event": "event2"}']
315315
filter = "time > 101;"
316316
expected = ['102']
317-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `time` > 101')
317+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`time` > 101)')
318318
filter = 'data = "hello2"'
319-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `data` = \\"hello2\\"')
319+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`data` = \\"hello2\\")')
320320
filter = ' event IS NOT DISTINCT FROM "event2"'
321-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `event` IS NOT DISTINCT FROM \\"event2\\"')
321+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IS NOT DISTINCT FROM \\"event2\\")')
322322
filter = ' event IS DISTINCT FROM "event1"'
323-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `event` IS DISTINCT FROM \\"event1\\"')
323+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IS DISTINCT FROM \\"event1\\")')
324324
filter = 'event IN ("event2")'
325-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `event` IN (\\"event2\\")')
325+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IN (\\"event2\\"))')
326+
filter = 'event NOT IN ("event1", "event3")'
327+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (NOT (`event` IN (\\"event1\\", \\"event3\\")))')
326328
filter = 'event IN ("1", "2", "3", "4", "5", "6", "7", "event2")'
327-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `event` IN (\\"1\\"')
329+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IN (\\"1\\"')
328330
filter = ' event IS DISTINCT FROM data AND event IN ("1", "2", "3", "4", "5", "6", "7", "event2")'
329-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IS DISTINCT FROM `data` AND `event` IN (\\"1\\"')
331+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE ((`event` IS DISTINCT FROM `data`) AND (`event` IN (\\"1\\"')
330332
filter = ' IF(event = "event2", event IS DISTINCT FROM data, FALSE)'
331-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE IF(`event` = \\"event2\\", `event` IS DISTINCT FROM `data`, FALSE)')
333+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE IF((`event` = \\"event2\\"), (`event` IS DISTINCT FROM `data`), FALSE)')
332334

333335
@yq_v1
334336
def test_filters_optional_field(self, kikimr, client):
@@ -346,37 +348,39 @@ def test_filters_optional_field(self, kikimr, client):
346348
'{"time": 102, "data": "hello2", "event": "event2", "flag": true, "field1": 5, "field2": 1005}']
347349
expected = ['102']
348350
filter = 'data = "hello2"'
349-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `data` = \\"hello2\\"')
351+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`data` = \\"hello2\\")')
350352
filter = 'flag'
351353
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `flag`')
352354
filter = 'time * (field2 - field1) != 0'
353-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`time` * (`field2` - `field1`)) <> 0')
355+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE ((`time` * (`field2` - `field1`)) <> 0)')
354356
filter = '(field1 % field2) / 5 = 1'
355-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE ((`field1` % `field2`) / 5) = 1')
357+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (((`field1` % `field2`) / 5) = 1)')
356358
filter = ' event IS NOT DISTINCT FROM "event2"'
357-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `event` IS NOT DISTINCT FROM \\"event2\\"')
359+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IS NOT DISTINCT FROM \\"event2\\")')
358360
filter = ' event IS DISTINCT FROM "event1"'
359-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `event` IS DISTINCT FROM \\"event1\\"')
361+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IS DISTINCT FROM \\"event1\\")')
360362
filter = ' field1 IS DISTINCT FROM field2'
361-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `field1` IS DISTINCT FROM `field2`')
363+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`field1` IS DISTINCT FROM `field2`)')
362364
filter = 'time == 102 OR (field2 IS NOT DISTINCT FROM 1005 AND Random(field1) < 10.0)'
363-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`time` = 102 OR `field2` IS NOT DISTINCT FROM 1005)')
365+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE ((`time` = 102) OR (`field2` IS NOT DISTINCT FROM 1005))')
364366
filter = 'event IN ("event2")'
365-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `event` IN (\\"event2\\")')
367+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IN (\\"event2\\"))')
366368
filter = 'event IN ("1", "2", "3", "4", "5", "6", "7", "event2")'
367-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE `event` IN (\\"1\\"')
369+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IN (\\"1\\"')
368370
filter = ' event IS DISTINCT FROM data AND event IN ("1", "2", "3", "4", "5", "6", "7", "event2")'
369-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (`event` IS DISTINCT FROM `data` AND COALESCE(`event` IN (\\"1\\"')
371+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE ((`event` IS DISTINCT FROM `data`) AND COALESCE((`event` IN (\\"1\\"')
370372
filter = ' IF(event == "event2", event IS DISTINCT FROM data, FALSE)'
371-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE IF(COALESCE(`event` = \\"event2\\", FALSE), `event` IS DISTINCT FROM `data`, FALSE)')
373+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE IF(COALESCE((`event` = \\"event2\\"), FALSE), (`event` IS DISTINCT FROM `data`), FALSE)')
372374
filter = ' COALESCE(event = "event2", TRUE)'
373-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE COALESCE(`event` = \\"event2\\", TRUE)')
375+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE COALESCE((`event` = \\"event2\\"), TRUE)')
374376
filter = ' COALESCE(event = "event2", data = "hello2", TRUE)'
375-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE COALESCE(`event` = \\"event2\\", `data` = \\"hello2\\", TRUE)')
377+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE COALESCE((`event` = \\"event2\\"), (`data` = \\"hello2\\"), TRUE)')
376378
filter = " event ?? '' REGEXP @@e.*e.*t2@@"
377-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE COALESCE(`event`, \\"\\") REGEXP \\"e.*e.*t2\\"')
379+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (COALESCE(`event`, \\"\\") REGEXP \\"e.*e.*t2\\")')
380+
filter = " event ?? '' NOT REGEXP @@e.*e.*t1@@"
381+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (NOT (COALESCE(`event`, \\"\\") REGEXP \\"e.*e.*t1\\"))')
378382
filter = " event ?? '' REGEXP data ?? '' OR time = 102"
379-
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE (COALESCE(`event`, \\"\\") REGEXP COALESCE(`data`, \\"\\") OR `time` = 102)')
383+
self.run_and_check(kikimr, client, sql + filter, data, expected, 'predicate: WHERE ((COALESCE(`event`, \\"\\") REGEXP COALESCE(`data`, \\"\\")) OR (`time` = 102))')
380384

381385
@yq_v1
382386
def test_filter_missing_fields(self, kikimr, client):
@@ -487,7 +491,7 @@ def test_filter_with_mr(self, kikimr, client):
487491
stop_yds_query(client, query_id)
488492

489493
issues = str(client.describe_query(query_id).result.query.transient_issue)
490-
assert "Row dispatcher will use the predicate: WHERE `event_class` =" in issues, "Incorrect Issues: " + issues
494+
assert "Row dispatcher will use the predicate: WHERE (`event_class` =" in issues, "Incorrect Issues: " + issues
491495

492496
@yq_v1
493497
def test_start_new_query(self, kikimr, client):

0 commit comments

Comments
 (0)