@@ -985,7 +985,7 @@ impl<'a> Tokenizer<'a> {
985985 }
986986 }
987987 // PostgreSQL accepts "escape" string constants, which are an extension to the SQL standard.
988- x @ 'e' | x @ 'E' => {
988+ x @ 'e' | x @ 'E' if self . dialect . supports_string_escape_constant ( ) => {
989989 let starting_loc = chars. location ( ) ;
990990 chars. next ( ) ; // consume, to check the next char
991991 match chars. peek ( ) {
@@ -3573,4 +3573,48 @@ mod tests {
35733573 ] ,
35743574 ) ;
35753575 }
3576+
3577+ #[ test]
3578+ fn test_string_escape_constant_not_supported ( ) {
3579+ all_dialects_where ( |dialect| !dialect. supports_string_escape_constant ( ) ) . tokenizes_to (
3580+ "select e'...'" ,
3581+ vec ! [
3582+ Token :: make_keyword( "select" ) ,
3583+ Token :: Whitespace ( Whitespace :: Space ) ,
3584+ Token :: make_word( "e" , None ) ,
3585+ Token :: SingleQuotedString ( "..." . to_string( ) ) ,
3586+ ] ,
3587+ ) ;
3588+
3589+ all_dialects_where ( |dialect| !dialect. supports_string_escape_constant ( ) ) . tokenizes_to (
3590+ "select E'...'" ,
3591+ vec ! [
3592+ Token :: make_keyword( "select" ) ,
3593+ Token :: Whitespace ( Whitespace :: Space ) ,
3594+ Token :: make_word( "E" , None ) ,
3595+ Token :: SingleQuotedString ( "..." . to_string( ) ) ,
3596+ ] ,
3597+ ) ;
3598+ }
3599+
3600+ #[ test]
3601+ fn test_string_escape_constant_supported ( ) {
3602+ all_dialects_where ( |dialect| dialect. supports_string_escape_constant ( ) ) . tokenizes_to (
3603+ "select e'\\ ''" ,
3604+ vec ! [
3605+ Token :: make_keyword( "select" ) ,
3606+ Token :: Whitespace ( Whitespace :: Space ) ,
3607+ Token :: EscapedStringLiteral ( "'" . to_string( ) ) ,
3608+ ] ,
3609+ ) ;
3610+
3611+ all_dialects_where ( |dialect| dialect. supports_string_escape_constant ( ) ) . tokenizes_to (
3612+ "select E'\\ ''" ,
3613+ vec ! [
3614+ Token :: make_keyword( "select" ) ,
3615+ Token :: Whitespace ( Whitespace :: Space ) ,
3616+ Token :: EscapedStringLiteral ( "'" . to_string( ) ) ,
3617+ ] ,
3618+ ) ;
3619+ }
35763620}
0 commit comments