@@ -971,7 +971,10 @@ impl<'a> Tokenizer<'a> {
971
971
match chars. peek ( ) {
972
972
Some ( '\'' ) => {
973
973
// N'...' - a <national character string literal>
974
- let s = self . tokenize_single_quoted_string ( chars, '\'' , true ) ?;
974
+ let backslash_escape =
975
+ self . dialect . supports_string_literal_backslash_escape ( ) ;
976
+ let s =
977
+ self . tokenize_single_quoted_string ( chars, '\'' , backslash_escape) ?;
975
978
Ok ( Some ( Token :: NationalStringLiteral ( s) ) )
976
979
}
977
980
_ => {
@@ -2155,6 +2158,7 @@ mod tests {
2155
2158
use crate :: dialect:: {
2156
2159
BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect , SQLiteDialect ,
2157
2160
} ;
2161
+ use crate :: test_utils:: all_dialects_where;
2158
2162
use core:: fmt:: Debug ;
2159
2163
2160
2164
#[ test]
@@ -3543,4 +3547,30 @@ mod tests {
3543
3547
] ;
3544
3548
compare ( expected, tokens) ;
3545
3549
}
3550
+
3551
+ #[ test]
3552
+ fn test_national_strings_backslash_escape_not_supported ( ) {
3553
+ all_dialects_where ( |dialect| !dialect. supports_string_literal_backslash_escape ( ) )
3554
+ . tokenizes_to (
3555
+ "select n'''''\\ '" ,
3556
+ vec ! [
3557
+ Token :: make_keyword( "select" ) ,
3558
+ Token :: Whitespace ( Whitespace :: Space ) ,
3559
+ Token :: NationalStringLiteral ( "''\\ " . to_string( ) ) ,
3560
+ ] ,
3561
+ ) ;
3562
+ }
3563
+
3564
+ #[ test]
3565
+ fn test_national_strings_backslash_escape_supported ( ) {
3566
+ all_dialects_where ( |dialect| dialect. supports_string_literal_backslash_escape ( ) )
3567
+ . tokenizes_to (
3568
+ "select n'''''\\ ''" ,
3569
+ vec ! [
3570
+ Token :: make_keyword( "select" ) ,
3571
+ Token :: Whitespace ( Whitespace :: Space ) ,
3572
+ Token :: NationalStringLiteral ( "'''" . to_string( ) ) ,
3573
+ ] ,
3574
+ ) ;
3575
+ }
3546
3576
}
0 commit comments