@@ -3040,6 +3040,7 @@ logic_operator_expr
30403040 | 'BETWEEN' | 'NOT BETWEEN'
30413041 | 'IS' | 'IS NOT'
30423042 | 'LIKE'
3043+ | 'REGEXP' | 'NOT REGEXP'
30433044 | '@>' | '<@' | OPERATOR_CONCATENATION | DOUBLE_WELL_ARROW | WELL_ARROW | '?' | '?|' | '?&' | '#-'
30443045 export interface binary_expr {
30453046 type: 'binary_expr',
@@ -3218,13 +3219,8 @@ like_op
32183219 }
32193220
32203221regex_op
3221- = "!~*" / "~*" / "~" / "!~"
3222-
3223- regex_op_right
3224- = op :regex_op __ right :(literal / comparison_expr ) {
3225- // => { op: regex_op; right: literal | comparison_expr}
3226- return { op: op, right: right };
3227- }
3222+ = nk :(KW_NOT __ KW_REGEXP ) { /* => 'REGEXP' */ return nk[0 ] + ' ' + nk[2 ]; }
3223+ / KW_REGEXP
32283224
32293225escape_op
32303226 = kw :'ESCAPE' i __ c :literal_string {
@@ -3266,6 +3262,14 @@ jsonb_op_right
32663262 }
32673263 }
32683264
3265+
3266+ regex_op_right
3267+ = op :regex_op __ right :(literal / comparison_expr ) __ es :escape_op ? {
3268+ // => { op: regex_op; right: (literal | comparison_expr) & { escape?: escape_op }; }
3269+ if (es) right .escape = es
3270+ return { op: op, right: right };
3271+ }
3272+
32693273additive_expr
32703274 = head :multiplicative_expr
32713275 tail :(__ additive_operator __ multiplicative_expr )* {
@@ -4209,6 +4213,7 @@ KW_IS = "IS"i !ident_start { return 'IS'; }
42094213KW_LIKE = "LIKE" i ! ident_start { return ' LIKE' ; }
42104214KW_ILIKE = "ILIKE" i ! ident_start { return ' ILIKE' ; }
42114215KW_EXISTS = "EXISTS" i ! ident_start { /* => 'EXISTS' */ return ' EXISTS' ; }
4216+ KW_REGEXP = "REGEXP" i ! ident_start { return ' REGEXP' ; }
42124217
42134218KW_NOT = "NOT" i ! ident_start { return ' NOT' ; }
42144219KW_AND = "AND" i ! ident_start { return ' AND' ; }
0 commit comments