@@ -43,7 +43,7 @@ use sqlparser_derive::{Visit, VisitMut};
43
43
use crate :: ast:: DollarQuotedString ;
44
44
use crate :: dialect:: Dialect ;
45
45
use crate :: dialect:: {
46
- BigQueryDialect , DuckDbDialect , GenericDialect , MySqlDialect , PostgreSqlDialect , SQLiteDialect ,
46
+ BigQueryDialect , DuckDbDialect , GenericDialect , MySqlDialect , PostgreSqlDialect ,
47
47
SnowflakeDialect ,
48
48
} ;
49
49
use crate :: keywords:: { Keyword , ALL_KEYWORDS , ALL_KEYWORDS_INDEX } ;
@@ -1278,15 +1278,11 @@ impl<'a> Tokenizer<'a> {
1278
1278
1279
1279
chars. next ( ) ;
1280
1280
1281
- if let Some ( '$' ) = chars. peek ( ) {
1281
+ // Check if the second character is a dollar sign
1282
+ let next_is_dollar = matches ! ( chars. peek( ) , Some ( '$' ) ) ;
1283
+ if next_is_dollar && self . dialect . supports_dollar_quoted_string ( ) {
1282
1284
chars. next ( ) ;
1283
1285
1284
- // Treat `$$` as a placeholder for SQLite
1285
- // See https://www.sqlite.org/lang_expr.html#varparam
1286
- if self . dialect . is :: < SQLiteDialect > ( ) {
1287
- return Ok ( Token :: Placeholder ( "$$" . to_string ( ) ) ) ;
1288
- }
1289
-
1290
1286
let mut is_terminated = false ;
1291
1287
let mut prev: Option < char > = None ;
1292
1288
@@ -1318,10 +1314,13 @@ impl<'a> Tokenizer<'a> {
1318
1314
} ;
1319
1315
} else {
1320
1316
value. push_str ( & peeking_take_while ( chars, |ch| {
1321
- ch. is_alphanumeric ( ) || ch == '_'
1317
+ ch. is_alphanumeric ( )
1318
+ || ch == '_'
1319
+ || matches ! ( ch, '$' if !self . dialect. supports_dollar_quoted_string( ) )
1322
1320
} ) ) ;
1323
1321
1324
- if let Some ( '$' ) = chars. peek ( ) {
1322
+ let next_is_dollar = matches ! ( chars. peek( ) , Some ( '$' ) ) ;
1323
+ if next_is_dollar && self . dialect . supports_dollar_quoted_string ( ) {
1325
1324
chars. next ( ) ;
1326
1325
1327
1326
' searching_for_end: loop {
@@ -1891,7 +1890,7 @@ fn take_char_from_hex_digits(
1891
1890
mod tests {
1892
1891
use super :: * ;
1893
1892
use crate :: dialect:: {
1894
- BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect ,
1893
+ BigQueryDialect , ClickHouseDialect , HiveDialect , MsSqlDialect , MySqlDialect , SQLiteDialect ,
1895
1894
} ;
1896
1895
use core:: fmt:: Debug ;
1897
1896
@@ -2327,6 +2326,30 @@ mod tests {
2327
2326
) ;
2328
2327
}
2329
2328
2329
+ #[ test]
2330
+ fn tokenize_dollar_placeholder_sqlite ( ) {
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
+
2330
2353
#[ test]
2331
2354
fn tokenize_dollar_quoted_string_untagged ( ) {
2332
2355
let sql =
0 commit comments