From f862a27858b5c22c70ee6deac69009bd2bce65e5 Mon Sep 17 00:00:00 2001 From: SuLe Date: Sat, 2 May 2026 04:29:10 +0800 Subject: [PATCH] fix streamed comment splitting --- src-tauri/src/commands/sql_file.rs | 38 +++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/commands/sql_file.rs b/src-tauri/src/commands/sql_file.rs index 9a7b043ba..12f5e7939 100644 --- a/src-tauri/src/commands/sql_file.rs +++ b/src-tauri/src/commands/sql_file.rs @@ -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, 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::::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::::new()); + } }