@@ -1390,11 +1390,17 @@ impl<'a> Tokenizer<'a> {
1390
1390
1391
1391
// Consume characters until newline
1392
1392
fn tokenize_single_line_comment ( & self , chars : & mut State ) -> String {
1393
- let mut comment = peeking_take_while ( chars, |ch| ch != '\n' ) ;
1393
+ let mut comment = peeking_take_while ( chars, |ch| match ch {
1394
+ '\n' => false , // Always stop at \n
1395
+ '\r' if dialect_of ! ( self is PostgreSqlDialect ) => false , // Stop at \r for Postgres
1396
+ _ => true , // Keep consuming for other characters
1397
+ } ) ;
1398
+
1394
1399
if let Some ( ch) = chars. next ( ) {
1395
- assert_eq ! ( ch, '\n' ) ;
1400
+ assert ! ( ch == '\n' || ch == '\r ') ;
1396
1401
comment. push ( ch) ;
1397
1402
}
1403
+
1398
1404
comment
1399
1405
}
1400
1406
@@ -2425,17 +2431,62 @@ mod tests {
2425
2431
2426
2432
#[ test]
2427
2433
fn tokenize_comment ( ) {
2428
- let sql = String :: from ( "0--this is a comment\n 1" ) ;
2434
+ let test_cases = vec ! [
2435
+ (
2436
+ String :: from( "0--this is a comment\n 1" ) ,
2437
+ vec![
2438
+ Token :: Number ( "0" . to_string( ) , false ) ,
2439
+ Token :: Whitespace ( Whitespace :: SingleLineComment {
2440
+ prefix: "--" . to_string( ) ,
2441
+ comment: "this is a comment\n " . to_string( ) ,
2442
+ } ) ,
2443
+ Token :: Number ( "1" . to_string( ) , false ) ,
2444
+ ] ,
2445
+ ) ,
2446
+ (
2447
+ String :: from( "0--this is a comment\r 1" ) ,
2448
+ vec![
2449
+ Token :: Number ( "0" . to_string( ) , false ) ,
2450
+ Token :: Whitespace ( Whitespace :: SingleLineComment {
2451
+ prefix: "--" . to_string( ) ,
2452
+ comment: "this is a comment\r 1" . to_string( ) ,
2453
+ } ) ,
2454
+ ] ,
2455
+ ) ,
2456
+ (
2457
+ String :: from( "0--this is a comment\r \n 1" ) ,
2458
+ vec![
2459
+ Token :: Number ( "0" . to_string( ) , false ) ,
2460
+ Token :: Whitespace ( Whitespace :: SingleLineComment {
2461
+ prefix: "--" . to_string( ) ,
2462
+ comment: "this is a comment\r \n " . to_string( ) ,
2463
+ } ) ,
2464
+ Token :: Number ( "1" . to_string( ) , false ) ,
2465
+ ] ,
2466
+ ) ,
2467
+ ] ;
2429
2468
2430
2469
let dialect = GenericDialect { } ;
2470
+
2471
+ for ( sql, expected) in test_cases {
2472
+ let tokens = Tokenizer :: new ( & dialect, & sql) . tokenize ( ) . unwrap ( ) ;
2473
+ compare ( expected, tokens) ;
2474
+ }
2475
+ }
2476
+
2477
+ #[ test]
2478
+ fn tokenize_comment_postgres ( ) {
2479
+ let sql = String :: from ( "1--\r 0" ) ;
2480
+
2481
+ let dialect = PostgreSqlDialect { } ;
2431
2482
let tokens = Tokenizer :: new ( & dialect, & sql) . tokenize ( ) . unwrap ( ) ;
2432
2483
let expected = vec ! [
2433
- Token :: Number ( "0 " . to_string( ) , false ) ,
2484
+ Token :: Number ( "1 " . to_string( ) , false ) ,
2434
2485
Token :: Whitespace ( Whitespace :: SingleLineComment {
2435
2486
prefix: "--" . to_string( ) ,
2436
- comment: "this is a comment \n " . to_string( ) ,
2487
+ comment: "\r " . to_string( ) ,
2437
2488
} ) ,
2438
- Token :: Number ( "1 " . to_string( ) , false ) ,
2489
+ Token :: Number ( "0 " . to_string( ) , false ) ,
2439
2490
] ;
2440
2491
compare ( expected, tokens) ;
2441
2492
}
0 commit comments