Skip to content

Commit 0cd49fb

Browse files
authored
Start new line if \r in Postgres dialect (#1647)
1 parent 8cfc462 commit 0cd49fb

File tree

1 file changed

+57
-6
lines changed

1 file changed

+57
-6
lines changed

src/tokenizer.rs

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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\n1");
2686+
let test_cases = vec![
2687+
(
2688+
String::from("0--this is a comment\n1"),
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\r1"),
2700+
vec![
2701+
Token::Number("0".to_string(), false),
2702+
Token::Whitespace(Whitespace::SingleLineComment {
2703+
prefix: "--".to_string(),
2704+
comment: "this is a comment\r1".to_string(),
2705+
}),
2706+
],
2707+
),
2708+
(
2709+
String::from("0--this is a comment\r\n1"),
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--\r0");
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

Comments
 (0)