@@ -504,7 +504,7 @@ struct State<'a> {
504
504
pub col : u64 ,
505
505
}
506
506
507
- impl < ' a > State < ' a > {
507
+ impl State < ' _ > {
508
508
/// return the next character and advance the stream
509
509
pub fn next ( & mut self ) -> Option < char > {
510
510
match self . peekable . next ( ) {
@@ -1278,7 +1278,8 @@ impl<'a> Tokenizer<'a> {
1278
1278
1279
1279
chars. next ( ) ;
1280
1280
1281
- if let Some ( '$' ) = chars. peek ( ) {
1281
+ // If the dialect does not support dollar-quoted strings, then `$$` is rather a placeholder.
1282
+ if matches ! ( chars. peek( ) , Some ( '$' ) ) && !self . dialect . supports_dollar_placeholder ( ) {
1282
1283
chars. next ( ) ;
1283
1284
1284
1285
let mut is_terminated = false ;
@@ -1312,10 +1313,14 @@ impl<'a> Tokenizer<'a> {
1312
1313
} ;
1313
1314
} else {
1314
1315
value. push_str ( & peeking_take_while ( chars, |ch| {
1315
- ch. is_alphanumeric ( ) || ch == '_'
1316
+ ch. is_alphanumeric ( )
1317
+ || ch == '_'
1318
+ // Allow $ as a placeholder character if the dialect supports it
1319
+ || matches ! ( ch, '$' if self . dialect. supports_dollar_placeholder( ) )
1316
1320
} ) ) ;
1317
1321
1318
- if let Some ( '$' ) = chars. peek ( ) {
1322
+ // If the dialect does not support dollar-quoted strings, don't look for the end delimiter.
1323
+ if matches ! ( chars. peek( ) , Some ( '$' ) ) && !self . dialect . supports_dollar_placeholder ( ) {
1319
1324
chars. next ( ) ;
1320
1325
1321
1326
' searching_for_end: loop {
@@ -1885,7 +1890,7 @@ fn take_char_from_hex_digits(
1885
1890
mod tests {
1886
1891
use super :: * ;
1887
1892
use crate :: dialect:: {
1888
- BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect ,
1893
+ BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect , SQLiteDialect ,
1889
1894
} ;
1890
1895
use core:: fmt:: Debug ;
1891
1896
@@ -2321,6 +2326,30 @@ mod tests {
2321
2326
) ;
2322
2327
}
2323
2328
2329
+ #[ test]
2330
+ fn tokenize_dollar_placeholder ( ) {
2331
+ let sql = String :: from ( "SELECT $$, $$ABC$$, $ABC$, $ABC" ) ;
2332
+ let dialect = SQLiteDialect { } ;
2333
+ let tokens = Tokenizer :: new ( & dialect, & sql) . tokenize ( ) . unwrap ( ) ;
2334
+ assert_eq ! (
2335
+ tokens,
2336
+ vec![
2337
+ Token :: make_keyword( "SELECT" ) ,
2338
+ Token :: Whitespace ( Whitespace :: Space ) ,
2339
+ Token :: Placeholder ( "$$" . into( ) ) ,
2340
+ Token :: Comma ,
2341
+ Token :: Whitespace ( Whitespace :: Space ) ,
2342
+ Token :: Placeholder ( "$$ABC$$" . into( ) ) ,
2343
+ Token :: Comma ,
2344
+ Token :: Whitespace ( Whitespace :: Space ) ,
2345
+ Token :: Placeholder ( "$ABC$" . into( ) ) ,
2346
+ Token :: Comma ,
2347
+ Token :: Whitespace ( Whitespace :: Space ) ,
2348
+ Token :: Placeholder ( "$ABC" . into( ) ) ,
2349
+ ]
2350
+ ) ;
2351
+ }
2352
+
2324
2353
#[ test]
2325
2354
fn tokenize_dollar_quoted_string_untagged ( ) {
2326
2355
let sql =
0 commit comments