@@ -1473,7 +1473,8 @@ impl<'a> Tokenizer<'a> {
1473
1473
1474
1474
chars. next ( ) ;
1475
1475
1476
- if let Some ( '$' ) = chars. peek ( ) {
1476
+ // If the dialect does not support dollar-quoted strings, then `$$` is rather a placeholder.
1477
+ if matches ! ( chars. peek( ) , Some ( '$' ) ) && !self . dialect . supports_dollar_placeholder ( ) {
1477
1478
chars. next ( ) ;
1478
1479
1479
1480
let mut is_terminated = false ;
@@ -1507,10 +1508,14 @@ impl<'a> Tokenizer<'a> {
1507
1508
} ;
1508
1509
} else {
1509
1510
value. push_str ( & peeking_take_while ( chars, |ch| {
1510
- ch. is_alphanumeric ( ) || ch == '_'
1511
+ ch. is_alphanumeric ( )
1512
+ || ch == '_'
1513
+ // Allow $ as a placeholder character if the dialect supports it
1514
+ || matches ! ( ch, '$' if self . dialect. supports_dollar_placeholder( ) )
1511
1515
} ) ) ;
1512
1516
1513
- if let Some ( '$' ) = chars. peek ( ) {
1517
+ // If the dialect does not support dollar-quoted strings, don't look for the end delimiter.
1518
+ if matches ! ( chars. peek( ) , Some ( '$' ) ) && !self . dialect . supports_dollar_placeholder ( ) {
1514
1519
chars. next ( ) ;
1515
1520
1516
1521
' searching_for_end: loop {
@@ -2080,7 +2085,7 @@ fn take_char_from_hex_digits(
2080
2085
mod tests {
2081
2086
use super :: * ;
2082
2087
use crate :: dialect:: {
2083
- BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect ,
2088
+ BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect , SQLiteDialect ,
2084
2089
} ;
2085
2090
use core:: fmt:: Debug ;
2086
2091
@@ -2516,6 +2521,30 @@ mod tests {
2516
2521
) ;
2517
2522
}
2518
2523
2524
+ #[ test]
2525
+ fn tokenize_dollar_placeholder ( ) {
2526
+ let sql = String :: from ( "SELECT $$, $$ABC$$, $ABC$, $ABC" ) ;
2527
+ let dialect = SQLiteDialect { } ;
2528
+ let tokens = Tokenizer :: new ( & dialect, & sql) . tokenize ( ) . unwrap ( ) ;
2529
+ assert_eq ! (
2530
+ tokens,
2531
+ vec![
2532
+ Token :: make_keyword( "SELECT" ) ,
2533
+ Token :: Whitespace ( Whitespace :: Space ) ,
2534
+ Token :: Placeholder ( "$$" . into( ) ) ,
2535
+ Token :: Comma ,
2536
+ Token :: Whitespace ( Whitespace :: Space ) ,
2537
+ Token :: Placeholder ( "$$ABC$$" . into( ) ) ,
2538
+ Token :: Comma ,
2539
+ Token :: Whitespace ( Whitespace :: Space ) ,
2540
+ Token :: Placeholder ( "$ABC$" . into( ) ) ,
2541
+ Token :: Comma ,
2542
+ Token :: Whitespace ( Whitespace :: Space ) ,
2543
+ Token :: Placeholder ( "$ABC" . into( ) ) ,
2544
+ ]
2545
+ ) ;
2546
+ }
2547
+
2519
2548
#[ test]
2520
2549
fn tokenize_dollar_quoted_string_untagged ( ) {
2521
2550
let sql =
0 commit comments