@@ -776,7 +776,10 @@ impl<'a> Tokenizer<'a> {
776
776
match chars. peek ( ) {
777
777
Some ( '\'' ) => {
778
778
// N'...' - a <national character string literal>
779
- let s = self . tokenize_single_quoted_string ( chars, '\'' , true ) ?;
779
+ let backslash_escape =
780
+ self . dialect . supports_string_literal_backslash_escape ( ) ;
781
+ let s =
782
+ self . tokenize_single_quoted_string ( chars, '\'' , backslash_escape) ?;
780
783
Ok ( Some ( Token :: NationalStringLiteral ( s) ) )
781
784
}
782
785
_ => {
@@ -1890,6 +1893,7 @@ mod tests {
1890
1893
use crate :: dialect:: {
1891
1894
BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect , SQLiteDialect ,
1892
1895
} ;
1896
+ use crate :: test_utils:: all_dialects_where;
1893
1897
use core:: fmt:: Debug ;
1894
1898
1895
1899
#[ test]
@@ -3214,4 +3218,30 @@ mod tests {
3214
3218
let expected = vec ! [ Token :: SingleQuotedString ( "''" . to_string( ) ) ] ;
3215
3219
compare ( expected, tokens) ;
3216
3220
}
3221
+
3222
+ #[ test]
3223
+ fn test_national_strings_backslash_escape_not_supported ( ) {
3224
+ all_dialects_where ( |dialect| !dialect. supports_string_literal_backslash_escape ( ) )
3225
+ . tokenizes_to (
3226
+ "select n'''''\\ '" ,
3227
+ vec ! [
3228
+ Token :: make_keyword( "select" ) ,
3229
+ Token :: Whitespace ( Whitespace :: Space ) ,
3230
+ Token :: NationalStringLiteral ( "''\\ " . to_string( ) ) ,
3231
+ ] ,
3232
+ ) ;
3233
+ }
3234
+
3235
+ #[ test]
3236
+ fn test_national_strings_backslash_escape_supported ( ) {
3237
+ all_dialects_where ( |dialect| dialect. supports_string_literal_backslash_escape ( ) )
3238
+ . tokenizes_to (
3239
+ "select n'''''\\ ''" ,
3240
+ vec ! [
3241
+ Token :: make_keyword( "select" ) ,
3242
+ Token :: Whitespace ( Whitespace :: Space ) ,
3243
+ Token :: NationalStringLiteral ( "'''" . to_string( ) ) ,
3244
+ ] ,
3245
+ ) ;
3246
+ }
3217
3247
}
0 commit comments