@@ -1509,7 +1509,8 @@ impl<'a> Tokenizer<'a> {
1509
1509
1510
1510
chars. next ( ) ;
1511
1511
1512
- if let Some ( '$' ) = chars. peek ( ) {
1512
+ // If the dialect does not support dollar-quoted strings, then `$$` is rather a placeholder.
1513
+ if matches ! ( chars. peek( ) , Some ( '$' ) ) && !self . dialect . supports_dollar_placeholder ( ) {
1513
1514
chars. next ( ) ;
1514
1515
1515
1516
let mut is_terminated = false ;
@@ -1543,10 +1544,14 @@ impl<'a> Tokenizer<'a> {
1543
1544
} ;
1544
1545
} else {
1545
1546
value. push_str ( & peeking_take_while ( chars, |ch| {
1546
- ch. is_alphanumeric ( ) || ch == '_'
1547
+ ch. is_alphanumeric ( )
1548
+ || ch == '_'
1549
+ // Allow $ as a placeholder character if the dialect supports it
1550
+ || matches ! ( ch, '$' if self . dialect. supports_dollar_placeholder( ) )
1547
1551
} ) ) ;
1548
1552
1549
- if let Some ( '$' ) = chars. peek ( ) {
1553
+ // If the dialect does not support dollar-quoted strings, don't look for the end delimiter.
1554
+ if matches ! ( chars. peek( ) , Some ( '$' ) ) && !self . dialect . supports_dollar_placeholder ( ) {
1550
1555
chars. next ( ) ;
1551
1556
1552
1557
' searching_for_end: loop {
@@ -2137,7 +2142,7 @@ fn take_char_from_hex_digits(
2137
2142
mod tests {
2138
2143
use super :: * ;
2139
2144
use crate :: dialect:: {
2140
- BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect ,
2145
+ BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect , SQLiteDialect ,
2141
2146
} ;
2142
2147
use core:: fmt:: Debug ;
2143
2148
@@ -2573,6 +2578,30 @@ mod tests {
2573
2578
) ;
2574
2579
}
2575
2580
2581
+ #[ test]
2582
+ fn tokenize_dollar_placeholder ( ) {
2583
+ let sql = String :: from ( "SELECT $$, $$ABC$$, $ABC$, $ABC" ) ;
2584
+ let dialect = SQLiteDialect { } ;
2585
+ let tokens = Tokenizer :: new ( & dialect, & sql) . tokenize ( ) . unwrap ( ) ;
2586
+ assert_eq ! (
2587
+ tokens,
2588
+ vec![
2589
+ Token :: make_keyword( "SELECT" ) ,
2590
+ Token :: Whitespace ( Whitespace :: Space ) ,
2591
+ Token :: Placeholder ( "$$" . into( ) ) ,
2592
+ Token :: Comma ,
2593
+ Token :: Whitespace ( Whitespace :: Space ) ,
2594
+ Token :: Placeholder ( "$$ABC$$" . into( ) ) ,
2595
+ Token :: Comma ,
2596
+ Token :: Whitespace ( Whitespace :: Space ) ,
2597
+ Token :: Placeholder ( "$ABC$" . into( ) ) ,
2598
+ Token :: Comma ,
2599
+ Token :: Whitespace ( Whitespace :: Space ) ,
2600
+ Token :: Placeholder ( "$ABC" . into( ) ) ,
2601
+ ]
2602
+ ) ;
2603
+ }
2604
+
2576
2605
#[ test]
2577
2606
fn tokenize_dollar_quoted_string_untagged ( ) {
2578
2607
let sql =
0 commit comments