fix streamed comment splitting

This commit is contained in:
SuLe 2026-05-02 04:29:10 +08:00
parent 733fc69e13
commit f862a27858
1 changed files with 37 additions and 1 deletions

View File

@ -36,6 +36,18 @@ impl SqlStatementSplitter {
}
if !self.in_single_quote && !self.in_double_quote && !self.in_backtick {
if self.previous == Some('-') && ch == '-' {
self.in_line_comment = true;
self.buffer.push(ch);
self.previous = Some(ch);
continue;
}
if self.previous == Some('/') && ch == '*' {
self.in_block_comment = true;
self.buffer.push(ch);
self.previous = Some(ch);
continue;
}
if ch == '-' && next == Some('-') {
self.in_line_comment = true;
self.buffer.push(ch);
@ -107,7 +119,7 @@ fn split_sql_script(sql: &str) -> Result<Vec<String>, String> {
#[cfg(test)]
mod tests {
use super::split_sql_script;
use super::{split_sql_script, SqlStatementSplitter};
#[test]
fn splits_semicolon_delimited_statements() {
@ -140,4 +152,28 @@ mod tests {
vec!["CREATE TABLE a(id int)", "INSERT INTO a VALUES (1)"]
);
}
#[test]
fn line_comment_openers_can_span_chunks() {
let mut splitter = SqlStatementSplitter::default();
assert_eq!(splitter.push_chunk("SELECT 1; -"), vec!["SELECT 1"]);
assert_eq!(
splitter.push_chunk("- comment ; ignored\nSELECT 2;"),
vec!["-- comment ; ignored\nSELECT 2"]
);
assert_eq!(splitter.finish(), Vec::<String>::new());
}
#[test]
fn block_comment_openers_can_span_chunks() {
let mut splitter = SqlStatementSplitter::default();
assert_eq!(splitter.push_chunk("SELECT 1; /"), vec!["SELECT 1"]);
assert_eq!(
splitter.push_chunk("* comment ; ignored */\nSELECT 2;"),
vec!["/* comment ; ignored */\nSELECT 2"]
);
assert_eq!(splitter.finish(), Vec::<String>::new());
}
}