@@ -149,6 +149,14 @@ pub enum Token {
149
149
ExclamationMarkTilde ,
150
150
/// `!~*` , a case insensitive not match regular expression operator in PostgreSQL
151
151
ExclamationMarkTildeAsterisk ,
152
+ /// `~~`, a case sensitive match pattern operator in PostgreSQL
153
+ DoubleTilde ,
154
+ /// `~~*`, a case insensitive match pattern operator in PostgreSQL
155
+ DoubleTildeAsterisk ,
156
+ /// `!~~`, a case sensitive not match pattern operator in PostgreSQL
157
+ ExclamationMarkDoubleTilde ,
158
+ /// `!~~*`, a case insensitive not match pattern operator in PostgreSQL
159
+ ExclamationMarkDoubleTildeAsterisk ,
152
160
/// `<<`, a bitwise shift left operator in PostgreSQL
153
161
ShiftLeft ,
154
162
/// `>>`, a bitwise shift right operator in PostgreSQL
@@ -249,6 +257,10 @@ impl fmt::Display for Token {
249
257
Token :: TildeAsterisk => f. write_str ( "~*" ) ,
250
258
Token :: ExclamationMarkTilde => f. write_str ( "!~" ) ,
251
259
Token :: ExclamationMarkTildeAsterisk => f. write_str ( "!~*" ) ,
260
+ Token :: DoubleTilde => f. write_str ( "~~" ) ,
261
+ Token :: DoubleTildeAsterisk => f. write_str ( "~~*" ) ,
262
+ Token :: ExclamationMarkDoubleTilde => f. write_str ( "!~~" ) ,
263
+ Token :: ExclamationMarkDoubleTildeAsterisk => f. write_str ( "!~~*" ) ,
252
264
Token :: AtSign => f. write_str ( "@" ) ,
253
265
Token :: CaretAt => f. write_str ( "^@" ) ,
254
266
Token :: ShiftLeft => f. write_str ( "<<" ) ,
@@ -894,6 +906,16 @@ impl<'a> Tokenizer<'a> {
894
906
match chars. peek ( ) {
895
907
Some ( '*' ) => self
896
908
. consume_and_return ( chars, Token :: ExclamationMarkTildeAsterisk ) ,
909
+ Some ( '~' ) => {
910
+ chars. next ( ) ;
911
+ match chars. peek ( ) {
912
+ Some ( '*' ) => self . consume_and_return (
913
+ chars,
914
+ Token :: ExclamationMarkDoubleTildeAsterisk ,
915
+ ) ,
916
+ _ => Ok ( Some ( Token :: ExclamationMarkDoubleTilde ) ) ,
917
+ }
918
+ }
897
919
_ => Ok ( Some ( Token :: ExclamationMarkTilde ) ) ,
898
920
}
899
921
}
@@ -965,6 +987,15 @@ impl<'a> Tokenizer<'a> {
965
987
chars. next ( ) ; // consume
966
988
match chars. peek ( ) {
967
989
Some ( '*' ) => self . consume_and_return ( chars, Token :: TildeAsterisk ) ,
990
+ Some ( '~' ) => {
991
+ chars. next ( ) ;
992
+ match chars. peek ( ) {
993
+ Some ( '*' ) => {
994
+ self . consume_and_return ( chars, Token :: DoubleTildeAsterisk )
995
+ }
996
+ _ => Ok ( Some ( Token :: DoubleTilde ) ) ,
997
+ }
998
+ }
968
999
_ => Ok ( Some ( Token :: Tilde ) ) ,
969
1000
}
970
1001
}
@@ -1985,6 +2016,44 @@ mod tests {
1985
2016
compare ( expected, tokens) ;
1986
2017
}
1987
2018
2019
+ #[ test]
2020
+ fn tokenize_pg_like_match ( ) {
2021
+ let sql = "SELECT col ~~ '_a%', col ~~* '_a%', col !~~ '_a%', col !~~* '_a%'" ;
2022
+ let dialect = GenericDialect { } ;
2023
+ let tokens = Tokenizer :: new ( & dialect, sql) . tokenize ( ) . unwrap ( ) ;
2024
+ let expected = vec ! [
2025
+ Token :: make_keyword( "SELECT" ) ,
2026
+ Token :: Whitespace ( Whitespace :: Space ) ,
2027
+ Token :: make_word( "col" , None ) ,
2028
+ Token :: Whitespace ( Whitespace :: Space ) ,
2029
+ Token :: DoubleTilde ,
2030
+ Token :: Whitespace ( Whitespace :: Space ) ,
2031
+ Token :: SingleQuotedString ( "_a%" . into( ) ) ,
2032
+ Token :: Comma ,
2033
+ Token :: Whitespace ( Whitespace :: Space ) ,
2034
+ Token :: make_word( "col" , None ) ,
2035
+ Token :: Whitespace ( Whitespace :: Space ) ,
2036
+ Token :: DoubleTildeAsterisk ,
2037
+ Token :: Whitespace ( Whitespace :: Space ) ,
2038
+ Token :: SingleQuotedString ( "_a%" . into( ) ) ,
2039
+ Token :: Comma ,
2040
+ Token :: Whitespace ( Whitespace :: Space ) ,
2041
+ Token :: make_word( "col" , None ) ,
2042
+ Token :: Whitespace ( Whitespace :: Space ) ,
2043
+ Token :: ExclamationMarkDoubleTilde ,
2044
+ Token :: Whitespace ( Whitespace :: Space ) ,
2045
+ Token :: SingleQuotedString ( "_a%" . into( ) ) ,
2046
+ Token :: Comma ,
2047
+ Token :: Whitespace ( Whitespace :: Space ) ,
2048
+ Token :: make_word( "col" , None ) ,
2049
+ Token :: Whitespace ( Whitespace :: Space ) ,
2050
+ Token :: ExclamationMarkDoubleTildeAsterisk ,
2051
+ Token :: Whitespace ( Whitespace :: Space ) ,
2052
+ Token :: SingleQuotedString ( "_a%" . into( ) ) ,
2053
+ ] ;
2054
+ compare ( expected, tokens) ;
2055
+ }
2056
+
1988
2057
#[ test]
1989
2058
fn tokenize_quoted_identifier ( ) {
1990
2059
let sql = r#" "a "" b" "a """ "c """"" "# ;
0 commit comments