Skip to content

Commit

Permalink
fix(parser): handle nested comments (#6526)
Browse files Browse the repository at this point in the history
handle nested comments

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
yang-han and mergify[bot] committed Nov 22, 2022
1 parent 9ebcac2 commit 83e97f0
Showing 1 changed file with 27 additions and 10 deletions.
37 changes: 27 additions & 10 deletions src/sqlparser/src/tokenizer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -661,22 +661,24 @@ impl<'a> Tokenizer<'a> {
chars: &mut Peekable<Chars<'_>>,
) -> Result<Option<Token>, TokenizerError> {
let mut s = String::new();
let mut maybe_closing_comment = false;
// TODO: deal with nested comments

let mut nested = 1;
let mut last_ch = ' ';

loop {
match chars.next() {
Some(ch) => {
if maybe_closing_comment {
if ch == '/' {
if last_ch == '/' && ch == '*' {
nested += 1;
} else if last_ch == '*' && ch == '/' {
nested -= 1;
if nested == 0 {
s.pop();
break Ok(Some(Token::Whitespace(Whitespace::MultiLineComment(s))));
} else {
s.push('*');
}
}
maybe_closing_comment = ch == '*';
if !maybe_closing_comment {
s.push(ch);
}
s.push(ch);
last_ch = ch;
}
None => break self.tokenizer_error("Unexpected EOF while in a multi-line comment"),
}
Expand Down Expand Up @@ -1149,6 +1151,21 @@ mod tests {
compare(expected, tokens);
}

#[test]
fn tokenize_nested_multiline_comment() {
let sql = String::from("0/*multi-line\n* \n/* comment \n /*comment*/*/ */ /comment*/1");
let mut tokenizer = Tokenizer::new(&sql);
let tokens = tokenizer.tokenize().unwrap();
let expected = vec![
Token::Number("0".to_string()),
Token::Whitespace(Whitespace::MultiLineComment(
"multi-line\n* \n/* comment \n /*comment*/*/ */ /comment".to_string(),
)),
Token::Number("1".to_string()),
];
compare(expected, tokens);
}

#[test]
fn tokenize_multiline_comment_with_even_asterisks() {
let sql = String::from("\n/** Comment **/\n");
Expand Down

0 comments on commit 83e97f0

Please sign in to comment.