@@ -776,7 +776,10 @@ impl<'a> Tokenizer<'a> {
776776 match chars. peek ( ) {
777777 Some ( '\'' ) => {
778778 // 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) ?;
780783 Ok ( Some ( Token :: NationalStringLiteral ( s) ) )
781784 }
782785 _ => {
@@ -1890,6 +1893,7 @@ mod tests {
18901893 use crate :: dialect:: {
18911894 BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect , SQLiteDialect ,
18921895 } ;
1896+ use crate :: test_utils:: all_dialects_where;
18931897 use core:: fmt:: Debug ;
18941898
18951899 #[ test]
@@ -3214,4 +3218,30 @@ mod tests {
32143218 let expected = vec ! [ Token :: SingleQuotedString ( "''" . to_string( ) ) ] ;
32153219 compare ( expected, tokens) ;
32163220 }
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+ }
32173247}
0 commit comments