Skip to content

Commit c1f682d

Browse files
authored
Merge pull request #357 from jeffbrennan/feat/add-rlike
feat: add support for rlike and regexp
2 parents f548094 + f400589 commit c1f682d

4 files changed

Lines changed: 65 additions & 0 deletions

File tree

grammar/expressions.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ export default {
262262
[$.is_not, 'binary_is'],
263263
[$.keyword_like, 'pattern_matching'],
264264
[$.not_like, 'pattern_matching'],
265+
[$.keyword_rlike, 'pattern_matching'],
266+
[$.not_rlike, 'pattern_matching'],
265267
[$.similar_to, 'pattern_matching'],
266268
[$.not_similar_to, 'pattern_matching'],
267269
// binary_is precedence disambiguates `(is not distinct from)` from an

grammar/keywords.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ export default {
177177
keyword_gin: _ => make_keyword("gin"),
178178
keyword_brin: _ => make_keyword("brin"),
179179
keyword_like: _ => choice(make_keyword("like"),make_keyword("ilike")),
180+
keyword_rlike: _ => choice(make_keyword("rlike"),make_keyword("regexp")),
180181
keyword_similar: _ => make_keyword("similar"),
181182
keyword_unsigned: _ => make_keyword("unsigned"),
182183
keyword_zerofill: _ => make_keyword("zerofill"),
@@ -325,6 +326,7 @@ export default {
325326
// Operators
326327
is_not: $ => prec.left(seq($.keyword_is, $.keyword_not)),
327328
not_like: $ => seq($.keyword_not, $.keyword_like),
329+
not_rlike: $ => seq($.keyword_not, $.keyword_rlike),
328330
similar_to: $ => seq($.keyword_similar, $.keyword_to),
329331
not_similar_to: $ => seq($.keyword_not, $.keyword_similar, $.keyword_to),
330332
distinct_from: $ => seq($.keyword_is, $.keyword_distinct, $.keyword_from),

queries/highlights.scm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@
183183
(keyword_transaction)
184184
(keyword_only)
185185
(keyword_like)
186+
(keyword_rlike)
186187
(keyword_similar)
187188
(keyword_over)
188189
(keyword_change)

test/corpus/expressions.txt

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,66 @@ WHERE
571571
(keyword_to))
572572
right: (literal)))))))
573573

574+
================================================================================
575+
Where with RLIKE pattern matching
576+
================================================================================
577+
578+
SELECT
579+
*
580+
FROM
581+
a
582+
WHERE
583+
a RLIKE '^pattern'
584+
AND a NOT RLIKE '^pattern'
585+
AND a rlike '^pattern'
586+
AND a REGEXP '^pattern';
587+
588+
589+
--------------------------------------------------------------------------------
590+
591+
(program
592+
(statement
593+
(select
594+
(keyword_select)
595+
(select_expression
596+
(term
597+
value: (all_fields))))
598+
(from
599+
(keyword_from)
600+
(relation
601+
(object_reference
602+
name: (identifier)))
603+
(where
604+
(keyword_where)
605+
predicate: (binary_expression
606+
left: (binary_expression
607+
left: (binary_expression
608+
left: (binary_expression
609+
left: (field
610+
name: (identifier))
611+
operator: (keyword_rlike)
612+
right: (literal))
613+
operator: (keyword_and)
614+
right: (binary_expression
615+
left: (field
616+
name: (identifier))
617+
operator: (not_rlike
618+
(keyword_not)
619+
(keyword_rlike))
620+
right: (literal)))
621+
operator: (keyword_and)
622+
right: (binary_expression
623+
left: (field
624+
name: (identifier))
625+
operator: (keyword_rlike)
626+
right: (literal)))
627+
operator: (keyword_and)
628+
right: (binary_expression
629+
left: (field
630+
name: (identifier))
631+
operator: (keyword_rlike)
632+
right: (literal)))))))
633+
574634
================================================================================
575635
NOT EQUAL <> OPERATOR
576636
================================================================================

0 commit comments

Comments
 (0)