This is an automated email from the ASF dual-hosted git repository.

github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new 0d638963 Improve accuracy of 
supports_string_literal_concatenation_with_newline (#2348)
0d638963 is described below

commit 0d638963fdcc1af73c2edeed2ae3a75b217bfbc4
Author: Yoav Cohen <[email protected]>
AuthorDate: Thu May 28 15:35:01 2026 +0200

    Improve accuracy of supports_string_literal_concatenation_with_newline 
(#2348)
---
 src/ast/comments.rs          |  4 ++--
 src/ast/mod.rs               |  3 ++-
 src/tokenizer.rs             | 31 +++++++++++++++----------------
 tests/sqlparser_comments.rs  |  4 ++--
 tests/sqlparser_common.rs    |  8 ++++++++
 tests/sqlparser_oracle.rs    |  7 ++-----
 tests/sqlparser_snowflake.rs |  6 ++++--
 7 files changed, 35 insertions(+), 28 deletions(-)

diff --git a/src/ast/comments.rs b/src/ast/comments.rs
index d48e4f5b..a0c25ad1 100644
--- a/src/ast/comments.rs
+++ b/src/ast/comments.rs
@@ -71,7 +71,7 @@ impl Comments {
     /// // all comments appearing before line seven, i.e. before the first 
statement itself
     /// assert_eq!(
     ///    &comments.find(..Location::new(7, 1)).map(|c| 
c.as_str()).collect::<Vec<_>>(),
-    ///    &["\n header comment ...\n ... spanning multiple lines\n", " first 
statement\n"]);
+    ///    &["\n header comment ...\n ... spanning multiple lines\n", " first 
statement"]);
     ///
     /// // all comments appearing within the first statement
     /// assert_eq!(
@@ -81,7 +81,7 @@ impl Comments {
     /// // all comments appearing within or after the first statement
     /// assert_eq!(
     ///    &comments.find(Location::new(7, 1)..).map(|c| 
c.as_str()).collect::<Vec<_>>(),
-    ///    &[" world ", " second statement\n", " trailing comment\n"]);
+    ///    &[" world ", " second statement", " trailing comment"]);
     /// ```
     ///
     /// The [Spanned](crate::ast::Spanned) trait allows you to access location
diff --git a/src/ast/mod.rs b/src/ast/mod.rs
index d737cdb3..e494553c 100644
--- a/src/ast/mod.rs
+++ b/src/ast/mod.rs
@@ -12085,7 +12085,8 @@ impl fmt::Display for OptimizerHint {
                 f.write_str(prefix)?;
                 f.write_str(&self.prefix)?;
                 f.write_str("+")?;
-                f.write_str(&self.text)
+                f.write_str(&self.text)?;
+                f.write_str("\n")
             }
             OptimizerHintStyle::MultiLine => {
                 f.write_str("/*")?;
diff --git a/src/tokenizer.rs b/src/tokenizer.rs
index d9f131f8..4c3668f8 100644
--- a/src/tokenizer.rs
+++ b/src/tokenizer.rs
@@ -521,7 +521,7 @@ impl fmt::Display for Whitespace {
             Whitespace::Space => f.write_str(" "),
             Whitespace::Newline => f.write_str("\n"),
             Whitespace::Tab => f.write_str("\t"),
-            Whitespace::SingleLineComment { prefix, comment } => write!(f, 
"{prefix}{comment}"),
+            Whitespace::SingleLineComment { prefix, comment } => writeln!(f, 
"{prefix}{comment}"),
             Whitespace::MultiLineComment(s) => write!(f, "/*{s}*/"),
         }
     }
@@ -2037,18 +2037,11 @@ impl<'a> Tokenizer<'a> {
 
     // Consume characters until newline
     fn tokenize_single_line_comment(&self, chars: &mut State) -> String {
-        let mut comment = peeking_take_while(chars, |ch| match ch {
+        peeking_take_while(chars, |ch| match ch {
             '\n' => false,                                           // Always 
stop at \n
             '\r' if dialect_of!(self is PostgreSqlDialect) => false, // Stop 
at \r for Postgres
             _ => true, // Keep consuming for other characters
-        });
-
-        if let Some(ch) = chars.next() {
-            assert!(ch == '\n' || ch == '\r');
-            comment.push(ch);
-        }
-
-        comment
+        })
     }
 
     /// Tokenize an identifier or keyword, after the first char is already 
consumed.
@@ -3346,8 +3339,9 @@ mod tests {
                     Token::Number("0".to_string(), false),
                     Token::Whitespace(Whitespace::SingleLineComment {
                         prefix: "--".to_string(),
-                        comment: "this is a comment\n".to_string(),
+                        comment: "this is a comment".to_string(),
                     }),
+                    Token::Whitespace(Whitespace::Newline),
                     Token::Number("1".to_string(), false),
                 ],
             ),
@@ -3367,8 +3361,9 @@ mod tests {
                     Token::Number("0".to_string(), false),
                     Token::Whitespace(Whitespace::SingleLineComment {
                         prefix: "--".to_string(),
-                        comment: "this is a comment\r\n".to_string(),
+                        comment: "this is a comment\r".to_string(),
                     }),
+                    Token::Whitespace(Whitespace::Newline),
                     Token::Number("1".to_string(), false),
                 ],
             ),
@@ -3392,8 +3387,9 @@ mod tests {
             Token::Number("1".to_string(), false),
             Token::Whitespace(Whitespace::SingleLineComment {
                 prefix: "--".to_string(),
-                comment: "\r".to_string(),
+                comment: "".to_string(),
             }),
+            Token::Whitespace(Whitespace::Newline), // Postgres treats \r as 
newline in single-line comments
             Token::Number("0".to_string(), false),
         ];
         compare(expected, tokens);
@@ -4220,16 +4216,19 @@ mod tests {
             vec![
                 Token::Whitespace(Whitespace::SingleLineComment {
                     prefix: "--".to_string(),
-                    comment: "\n".to_string(),
+                    comment: "".to_string(),
                 }),
+                Token::Whitespace(Whitespace::Newline),
                 Token::Whitespace(Whitespace::SingleLineComment {
                     prefix: "--".to_string(),
-                    comment: " Table structure for table...\n".to_string(),
+                    comment: " Table structure for table...".to_string(),
                 }),
+                Token::Whitespace(Whitespace::Newline),
                 Token::Whitespace(Whitespace::SingleLineComment {
                     prefix: "--".to_string(),
-                    comment: "\n".to_string(),
+                    comment: "".to_string(),
                 }),
+                Token::Whitespace(Whitespace::Newline),
             ],
         );
     }
diff --git a/tests/sqlparser_comments.rs b/tests/sqlparser_comments.rs
index 34442ca3..8b416438 100644
--- a/tests/sqlparser_comments.rs
+++ b/tests/sqlparser_comments.rs
@@ -50,10 +50,10 @@ more*/
         vec![
             CommentWithSpan {
                 comment: Comment::SingleLine {
-                    content: " second line comment\n".into(),
+                    content: " second line comment".into(),
                     prefix: "--".into()
                 },
-                span: Span::new((2, 1).into(), (3, 1).into()),
+                span: Span::new((2, 1).into(), (2, 23).into()),
             },
             CommentWithSpan {
                 comment: Comment::MultiLine(" inline comment after `from` 
".into()),
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index f470b93c..c2d298d0 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -18357,6 +18357,14 @@ fn parse_adjacent_string_literal_concatenation() {
         'd'
     )"#;
     dialects.one_statement_parses_to(sql, "SELECT 'abc' IN ('abc', 'd')");
+
+    let sql = r#"
+    SELECT 'abc' in ('a'
+        'b' -- COMMENT
+        'c',
+        'd'
+    )"#;
+    dialects.one_statement_parses_to(sql, "SELECT 'abc' IN ('abc', 'd')");
 }
 
 #[test]
diff --git a/tests/sqlparser_oracle.rs b/tests/sqlparser_oracle.rs
index 35f08311..888778e2 100644
--- a/tests/sqlparser_oracle.rs
+++ b/tests/sqlparser_oracle.rs
@@ -364,10 +364,7 @@ fn test_optimizer_hints() {
         "SELECT --+ one two three /* asdf */\n 1 FROM dual",
     );
     assert_eq!(select.optimizer_hints.len(), 1);
-    assert_eq!(
-        select.optimizer_hints[0].text,
-        " one two three /* asdf */\n"
-    );
+    assert_eq!(select.optimizer_hints[0].text, " one two three /* asdf */");
     assert_eq!(select.optimizer_hints[0].prefix, "");
 
     // inserts
@@ -396,7 +393,7 @@ fn test_optimizer_hints() {
     );
     assert_eq!(select.optimizer_hints.len(), 1);
     assert_eq!(select.optimizer_hints[0].prefix, "abc");
-    assert_eq!(select.optimizer_hints[0].text, " text\n");
+    assert_eq!(select.optimizer_hints[0].text, " text");
 }
 
 #[test]
diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs
index 8cd6a3fc..0000b0a3 100644
--- a/tests/sqlparser_snowflake.rs
+++ b/tests/sqlparser_snowflake.rs
@@ -596,8 +596,9 @@ fn test_snowflake_single_line_tokenize() {
         Token::make_keyword("TABLE"),
         Token::Whitespace(Whitespace::SingleLineComment {
             prefix: "#".to_string(),
-            comment: " this is a comment \n".to_string(),
+            comment: " this is a comment ".to_string(),
         }),
+        Token::Whitespace(Whitespace::Newline),
         Token::make_word("table_1", None),
     ];
 
@@ -613,8 +614,9 @@ fn test_snowflake_single_line_tokenize() {
         Token::Whitespace(Whitespace::Space),
         Token::Whitespace(Whitespace::SingleLineComment {
             prefix: "//".to_string(),
-            comment: " this is a comment \n".to_string(),
+            comment: " this is a comment ".to_string(),
         }),
+        Token::Whitespace(Whitespace::Newline),
         Token::make_word("table_1", None),
     ];
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to