@@ -790,7 +790,7 @@ impl<'a> Tokenizer<'a> {
790790 }
791791 }
792792 // PostgreSQL accepts "escape" string constants, which are an extension to the SQL standard.
793- x @ 'e' | x @ 'E' => {
793+ x @ 'e' | x @ 'E' if self . dialect . supports_string_escape_constant ( ) => {
794794 let starting_loc = chars. location ( ) ;
795795 chars. next ( ) ; // consume, to check the next char
796796 match chars. peek ( ) {
@@ -3244,4 +3244,48 @@ mod tests {
32443244 ] ,
32453245 ) ;
32463246 }
3247+
3248+ #[ test]
3249+ fn test_string_escape_constant_not_supported ( ) {
3250+ all_dialects_where ( |dialect| !dialect. supports_string_escape_constant ( ) ) . tokenizes_to (
3251+ "select e'...'" ,
3252+ vec ! [
3253+ Token :: make_keyword( "select" ) ,
3254+ Token :: Whitespace ( Whitespace :: Space ) ,
3255+ Token :: make_word( "e" , None ) ,
3256+ Token :: SingleQuotedString ( "..." . to_string( ) ) ,
3257+ ] ,
3258+ ) ;
3259+
3260+ all_dialects_where ( |dialect| !dialect. supports_string_escape_constant ( ) ) . tokenizes_to (
3261+ "select E'...'" ,
3262+ vec ! [
3263+ Token :: make_keyword( "select" ) ,
3264+ Token :: Whitespace ( Whitespace :: Space ) ,
3265+ Token :: make_word( "E" , None ) ,
3266+ Token :: SingleQuotedString ( "..." . to_string( ) ) ,
3267+ ] ,
3268+ ) ;
3269+ }
3270+
3271+ #[ test]
3272+ fn test_string_escape_constant_supported ( ) {
3273+ all_dialects_where ( |dialect| dialect. supports_string_escape_constant ( ) ) . tokenizes_to (
3274+ "select e'\\ ''" ,
3275+ vec ! [
3276+ Token :: make_keyword( "select" ) ,
3277+ Token :: Whitespace ( Whitespace :: Space ) ,
3278+ Token :: EscapedStringLiteral ( "'" . to_string( ) ) ,
3279+ ] ,
3280+ ) ;
3281+
3282+ all_dialects_where ( |dialect| dialect. supports_string_escape_constant ( ) ) . tokenizes_to (
3283+ "select E'\\ ''" ,
3284+ vec ! [
3285+ Token :: make_keyword( "select" ) ,
3286+ Token :: Whitespace ( Whitespace :: Space ) ,
3287+ Token :: EscapedStringLiteral ( "'" . to_string( ) ) ,
3288+ ] ,
3289+ ) ;
3290+ }
32473291}
0 commit comments