@@ -1621,11 +1621,17 @@ impl<'a> Tokenizer<'a> {
16211621
16221622 // Consume characters until newline
16231623 fn tokenize_single_line_comment ( & self , chars : & mut State ) -> String {
1624- let mut comment = peeking_take_while ( chars, |ch| ch != '\n' ) ;
1624+ let mut comment = peeking_take_while ( chars, |ch| match ch {
1625+ '\n' => false , // Always stop at \n
1626+ '\r' if dialect_of ! ( self is PostgreSqlDialect ) => false , // Stop at \r for Postgres
1627+ _ => true , // Keep consuming for other characters
1628+ } ) ;
1629+
16251630 if let Some ( ch) = chars. next ( ) {
1626- assert_eq ! ( ch, '\n' ) ;
1631+ assert ! ( ch == '\n' || ch == '\r ') ;
16271632 comment. push ( ch) ;
16281633 }
1634+
16291635 comment
16301636 }
16311637
@@ -2677,17 +2683,62 @@ mod tests {
26772683
26782684 #[ test]
26792685 fn tokenize_comment ( ) {
2680- let sql = String :: from ( "0--this is a comment\n 1" ) ;
2686+ let test_cases = vec ! [
2687+ (
2688+ String :: from( "0--this is a comment\n 1" ) ,
2689+ vec![
2690+ Token :: Number ( "0" . to_string( ) , false ) ,
2691+ Token :: Whitespace ( Whitespace :: SingleLineComment {
2692+ prefix: "--" . to_string( ) ,
2693+ comment: "this is a comment\n " . to_string( ) ,
2694+ } ) ,
2695+ Token :: Number ( "1" . to_string( ) , false ) ,
2696+ ] ,
2697+ ) ,
2698+ (
2699+ String :: from( "0--this is a comment\r 1" ) ,
2700+ vec![
2701+ Token :: Number ( "0" . to_string( ) , false ) ,
2702+ Token :: Whitespace ( Whitespace :: SingleLineComment {
2703+ prefix: "--" . to_string( ) ,
2704+ comment: "this is a comment\r 1" . to_string( ) ,
2705+ } ) ,
2706+ ] ,
2707+ ) ,
2708+ (
2709+ String :: from( "0--this is a comment\r \n 1" ) ,
2710+ vec![
2711+ Token :: Number ( "0" . to_string( ) , false ) ,
2712+ Token :: Whitespace ( Whitespace :: SingleLineComment {
2713+ prefix: "--" . to_string( ) ,
2714+ comment: "this is a comment\r \n " . to_string( ) ,
2715+ } ) ,
2716+ Token :: Number ( "1" . to_string( ) , false ) ,
2717+ ] ,
2718+ ) ,
2719+ ] ;
26812720
26822721 let dialect = GenericDialect { } ;
2722+
2723+ for ( sql, expected) in test_cases {
2724+ let tokens = Tokenizer :: new ( & dialect, & sql) . tokenize ( ) . unwrap ( ) ;
2725+ compare ( expected, tokens) ;
2726+ }
2727+ }
2728+
2729+ #[ test]
2730+ fn tokenize_comment_postgres ( ) {
2731+ let sql = String :: from ( "1--\r 0" ) ;
2732+
2733+ let dialect = PostgreSqlDialect { } ;
26832734 let tokens = Tokenizer :: new ( & dialect, & sql) . tokenize ( ) . unwrap ( ) ;
26842735 let expected = vec ! [
2685- Token :: Number ( "0 " . to_string( ) , false ) ,
2736+ Token :: Number ( "1 " . to_string( ) , false ) ,
26862737 Token :: Whitespace ( Whitespace :: SingleLineComment {
26872738 prefix: "--" . to_string( ) ,
2688- comment: "this is a comment \n " . to_string( ) ,
2739+ comment: "\r " . to_string( ) ,
26892740 } ) ,
2690- Token :: Number ( "1 " . to_string( ) , false ) ,
2741+ Token :: Number ( "0 " . to_string( ) , false ) ,
26912742 ] ;
26922743 compare ( expected, tokens) ;
26932744 }
0 commit comments