Skip to content

Commit 182dc31

Browse files
Merge pull request #6 from AikidoSec/carriage-return
Start new line if `\r` and dialect is postgres
2 parents 91b78cc + f5f916b commit 182dc31

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
@@ -1390,11 +1390,17 @@ impl<'a> Tokenizer<'a> {
13901390

13911391
// Consume characters until newline
13921392
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+
13941399
if let Some(ch) = chars.next() {
1395-
assert_eq!(ch, '\n');
1400+
assert!(ch == '\n' || ch == '\r');
13961401
comment.push(ch);
13971402
}
1403+
13981404
comment
13991405
}
14001406

@@ -2425,17 +2431,62 @@ mod tests {
24252431

24262432
#[test]
24272433
fn tokenize_comment() {
2428-
let sql = String::from("0--this is a comment\n1");
2434+
let test_cases = vec![
2435+
(
2436+
String::from("0--this is a comment\n1"),
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\r1"),
2448+
vec![
2449+
Token::Number("0".to_string(), false),
2450+
Token::Whitespace(Whitespace::SingleLineComment {
2451+
prefix: "--".to_string(),
2452+
comment: "this is a comment\r1".to_string(),
2453+
}),
2454+
],
2455+
),
2456+
(
2457+
String::from("0--this is a comment\r\n1"),
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+
];
24292468

24302469
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--\r0");
2480+
2481+
let dialect = PostgreSqlDialect {};
24312482
let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
24322483
let expected = vec![
2433-
Token::Number("0".to_string(), false),
2484+
Token::Number("1".to_string(), false),
24342485
Token::Whitespace(Whitespace::SingleLineComment {
24352486
prefix: "--".to_string(),
2436-
comment: "this is a comment\n".to_string(),
2487+
comment: "\r".to_string(),
24372488
}),
2438-
Token::Number("1".to_string(), false),
2489+
Token::Number("0".to_string(), false),
24392490
];
24402491
compare(expected, tokens);
24412492
}

0 commit comments

Comments
 (0)