From 357ea2b0e50d01986859e08a1fb7118e5ab96c9d Mon Sep 17 00:00:00 2001 From: Dimitri Vasdekis Date: Tue, 1 Sep 2026 04:34:28 +0000 Subject: [PATCH 1/2] fix(core): handle trailing MSSQL GO batches --- CHANGELOG.md | 6 +++ crates/flowscope-core/src/analyzer/input.rs | 47 ++++++++++++++++++-- crates/flowscope-wasm/tests/analysis.rs | 48 +++++++++++++++++++++ scripts/test_wasm_browser.mjs | 17 +++++++- 4 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 crates/flowscope-wasm/tests/analysis.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 5456b0dd..8e2e556c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Kept `@pondpilot/flowscope-react` as a private monorepo workspace and removed it from the npm release pipeline +### Fixed + +#### Core Engine (flowscope-core) + +- **MSSQL `GO` batch separators** - treat standalone SQL Server batch separators as statement boundaries during analysis and statement splitting, including trailing separators and CRLF input. + ## [0.9.0] - 2026-08-12 ### Added diff --git a/crates/flowscope-core/src/analyzer/input.rs b/crates/flowscope-core/src/analyzer/input.rs index e9d43c49..b7a2c581 100644 --- a/crates/flowscope-core/src/analyzer/input.rs +++ b/crates/flowscope-core/src/analyzer/input.rs @@ -653,13 +653,14 @@ fn split_ranges_on_mssql_go_separators(sql: &str, ranges: Vec>) -> for range in ranges { let mut cursor = range.start; for go_range in &go_line_ranges { - if go_range.start < range.start || go_range.end > range.end || go_range.start < cursor { + if go_range.end <= cursor || go_range.start >= range.end { continue; } - if let Some(chunk) = trim_statement_range(sql, cursor, go_range.start) { + let separator_start = go_range.start.max(cursor); + if let Some(chunk) = trim_statement_range(sql, cursor, separator_start) { out.push(chunk); } - cursor = go_range.end; + cursor = go_range.end.min(range.end); } if let Some(chunk) = trim_statement_range(sql, cursor, range.end) { @@ -1212,6 +1213,31 @@ mod tests { assert_eq!(&sql[ranges[1].clone()], "CREATE TABLE test (id INT)"); } + #[test] + fn mssql_statement_ranges_split_trailing_go_batch_separators() { + for sql in [ + "SELECT 1;\nGO\nSELECT 2;\nGO\n", + "SELECT 1;\r\n go \r\nSELECT 2;\r\nGO\r\n", + "SELECT 1\nGO\nGO\nSELECT 2\nGO\n", + ] { + let ranges = compute_statement_ranges_for_dialect(sql, Dialect::Mssql); + assert_eq!(ranges.len(), 2, "unexpected ranges for {sql:?}"); + assert_eq!(&sql[ranges[0].clone()], "SELECT 1"); + assert_eq!(&sql[ranges[1].clone()], "SELECT 2"); + } + } + + #[test] + fn mssql_statement_ranges_ignore_go_inside_strings_comments_and_identifiers() { + let sql = "SELECT 'GO' AS literal;\nSELECT [GO] FROM [source];\n-- GO\n/* GO */\nGO\nSELECT 'inside\nGO\nstring' AS literal;"; + let ranges = compute_statement_ranges_for_dialect(sql, Dialect::Mssql); + + assert_eq!(ranges.len(), 3); + assert_eq!(&sql[ranges[0].clone()], "SELECT 'GO' AS literal"); + assert_eq!(&sql[ranges[1].clone()], "SELECT [GO] FROM [source]"); + assert!(sql[ranges[2].clone()].contains("inside\nGO\nstring")); + } + #[test] fn collect_statements_mssql_go_batch_without_final_semicolon_parses_statements() { let mut request = base_request(); @@ -1226,6 +1252,21 @@ mod tests { assert_eq!(statements.len(), 2); } + #[test] + fn collect_statements_mssql_go_batch_with_trailing_separator_has_no_parse_error() { + let mut request = base_request(); + request.dialect = Dialect::Mssql; + request.sql = "SELECT 1;\nGO\nSELECT 2;\nGO\n".to_string(); + + let (statements, issues) = collect_statements(&request); + + assert_eq!(statements.len(), 2); + assert!( + issues.is_empty(), + "MSSQL trailing GO should not produce parse errors: {issues:?}" + ); + } + #[test] fn parses_procedure_with_inner_semicolons() { let mut request = base_request(); diff --git a/crates/flowscope-wasm/tests/analysis.rs b/crates/flowscope-wasm/tests/analysis.rs new file mode 100644 index 00000000..6877fa1b --- /dev/null +++ b/crates/flowscope-wasm/tests/analysis.rs @@ -0,0 +1,48 @@ +use flowscope_wasm::{analyze_sql_json, split_statements_json}; +use serde_json::Value; + +#[test] +fn analyze_sql_json_handles_mssql_go_batch_separators() { + let request = serde_json::json!({ + "sql": "SELECT 1;\nGO\nSELECT 2;\nGO\n", + "dialect": "mssql" + }); + + let result: Value = serde_json::from_str(&analyze_sql_json(&request.to_string())) + .expect("analysis result should be valid JSON"); + let statements = result + .get("statements") + .and_then(Value::as_array) + .expect("analysis result should contain statements"); + let issues = result + .get("issues") + .and_then(Value::as_array) + .expect("analysis result should contain issues"); + + assert_eq!(statements.len(), 2); + assert!(!issues + .iter() + .any(|issue| { issue.get("code") == Some(&Value::String("PARSE_ERROR".to_string())) })); +} + +#[test] +fn split_statements_json_handles_mssql_go_batch_separators() { + let sql = "SELECT 1;\nGO\nSELECT 2;\nGO\n"; + let request = serde_json::json!({ + "sql": sql, + "dialect": "mssql" + }); + + let result: Value = serde_json::from_str(&split_statements_json(&request.to_string())) + .expect("statement split result should be valid JSON"); + let statements = result + .get("statements") + .and_then(Value::as_array) + .expect("statement split result should contain statements"); + + assert_eq!(statements.len(), 2); + assert_eq!(statements[0]["start"], 0); + assert_eq!(statements[0]["end"], 8); + assert_eq!(statements[1]["start"], 13); + assert_eq!(statements[1]["end"], 21); +} diff --git a/scripts/test_wasm_browser.mjs b/scripts/test_wasm_browser.mjs index 80cd1d1c..55b235ed 100644 --- a/scripts/test_wasm_browser.mjs +++ b/scripts/test_wasm_browser.mjs @@ -43,6 +43,15 @@ const harness = ` .map((node) => node.label); const errors = result.issues.filter((issue) => issue.severity === 'error'); + const mssqlRequest = { + sql: 'SELECT 1;\nGO\nSELECT 2;\nGO\n', + dialect: 'mssql', + }; + const mssqlResult = JSON.parse(analyze_sql_json(JSON.stringify(mssqlRequest))); + const mssqlParseErrors = mssqlResult.issues.filter( + (issue) => issue.code === 'PARSE_ERROR' + ); + if (result.statements.length !== 1 || result.summary.statementCount !== 1) { throw new Error('Expected one analyzed statement'); } @@ -52,12 +61,18 @@ const harness = ` if (errors.length > 0) { throw new Error('Analysis returned errors: ' + JSON.stringify(errors)); } + if (mssqlResult.statements.length !== 2 || mssqlParseErrors.length > 0) { + throw new Error( + 'MSSQL GO batch analysis failed: ' + JSON.stringify(mssqlResult.issues) + ); + } body.dataset.status = 'passed'; body.textContent = JSON.stringify({ version: get_version(), statementCount: result.summary.statementCount, - tableLabels + tableLabels, + mssqlStatementCount: mssqlResult.summary.statementCount, }); } catch (error) { body.dataset.status = 'failed'; From b8b49d91656e12c30800b9a08c4cba9dd7249e9f Mon Sep 17 00:00:00 2001 From: Alex Mabe Date: Thu, 24 Sep 2026 12:49:18 -0400 Subject: [PATCH 2/2] fix(mssql): verify GO batches in CLI and WASM --- crates/flowscope-cli/tests/mssql_go_cli.rs | 44 ++++++++++++++++++++ crates/flowscope-core/src/analyzer/input.rs | 16 +++++++ packages/core/wasm/flowscope_wasm_bg.wasm | Bin 9048118 -> 9048105 bytes scripts/test_wasm_browser.mjs | 2 +- 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 crates/flowscope-cli/tests/mssql_go_cli.rs diff --git a/crates/flowscope-cli/tests/mssql_go_cli.rs b/crates/flowscope-cli/tests/mssql_go_cli.rs new file mode 100644 index 00000000..0b8cb09c --- /dev/null +++ b/crates/flowscope-cli/tests/mssql_go_cli.rs @@ -0,0 +1,44 @@ +use std::process::Command; + +use tempfile::tempdir; + +#[test] +fn analyzes_multiple_mssql_files_with_trailing_go() { + let dir = tempdir().expect("temp dir"); + let first = dir.path().join("first.sql"); + let second = dir.path().join("second.sql"); + let sql = "SELECT 1;\nGO\nSELECT 2;\nGO\n"; + std::fs::write(&first, sql).expect("write first SQL file"); + std::fs::write(&second, sql).expect("write second SQL file"); + + let output = Command::new(env!("CARGO_BIN_EXE_flowscope")) + .args(["-d", "mssql", "-f", "json"]) + .arg(&first) + .arg(&second) + .output() + .expect("run CLI"); + assert!( + output.status.success(), + "CLI failed: {}", + String::from_utf8_lossy(&output.stderr) + ); + + let result: serde_json::Value = + serde_json::from_slice(&output.stdout).expect("valid CLI JSON output"); + let statements = result["statements"].as_array().expect("statements array"); + assert_eq!(statements.len(), 4); + for (index, statement) in statements.iter().enumerate() { + assert_eq!(statement["statementIndex"], index); + let source = statement["sourceName"].as_str().expect("source name"); + let expected = if index < 2 { "first.sql" } else { "second.sql" }; + assert!(source.ends_with(expected), "unexpected source: {source}"); + let offset = if index % 2 == 0 { 0 } else { 13 }; + assert_eq!(statement["span"]["start"], offset); + assert_eq!(statement["span"]["end"], offset + 8); + } + assert!(!result["issues"] + .as_array() + .expect("issues array") + .iter() + .any(|issue| issue["code"] == "PARSE_ERROR")); +} diff --git a/crates/flowscope-core/src/analyzer/input.rs b/crates/flowscope-core/src/analyzer/input.rs index b7a2c581..dc612dc6 100644 --- a/crates/flowscope-core/src/analyzer/input.rs +++ b/crates/flowscope-core/src/analyzer/input.rs @@ -1219,6 +1219,7 @@ mod tests { "SELECT 1;\nGO\nSELECT 2;\nGO\n", "SELECT 1;\r\n go \r\nSELECT 2;\r\nGO\r\n", "SELECT 1\nGO\nGO\nSELECT 2\nGO\n", + "GO\nSELECT 1;\nGO\nSELECT 2;\nGO\n", ] { let ranges = compute_statement_ranges_for_dialect(sql, Dialect::Mssql); assert_eq!(ranges.len(), 2, "unexpected ranges for {sql:?}"); @@ -1267,6 +1268,21 @@ mod tests { ); } + #[test] + fn best_effort_mssql_go_batches_only_report_invalid_statement() { + let mut request = base_request(); + request.dialect = Dialect::Mssql; + request.sql = "SELECT 1;\nGO\nSELECT FROM;\nGO\nSELECT 2;\nGO\n".to_string(); + + let (statements, issues) = collect_statements(&request); + + assert_eq!(statements.len(), 2); + assert_eq!(issues.len(), 1, "only invalid SQL should fail: {issues:?}"); + assert_eq!(issues[0].code, issue_codes::PARSE_ERROR); + let span = issues[0].span.expect("invalid statement span"); + assert_eq!(&request.sql[span.start..span.end], "SELECT FROM"); + } + #[test] fn parses_procedure_with_inner_semicolons() { let mut request = base_request(); diff --git a/packages/core/wasm/flowscope_wasm_bg.wasm b/packages/core/wasm/flowscope_wasm_bg.wasm index 37dd90651f8c418cabd3ffa270f37ce3d82d9358..05da6b7d978c23953ed361875e5731bc7da8f0e5 100644 GIT binary patch delta 46761 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 delta 46726 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

Zo1Ol&c-MGxXktDME9mX64b# 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 Lv{}6`9l8GpNjQH4 diff --git a/scripts/test_wasm_browser.mjs b/scripts/test_wasm_browser.mjs index 55b235ed..ddc7e0fb 100644 --- a/scripts/test_wasm_browser.mjs +++ b/scripts/test_wasm_browser.mjs @@ -44,7 +44,7 @@ const harness = ` const errors = result.issues.filter((issue) => issue.severity === 'error'); const mssqlRequest = { - sql: 'SELECT 1;\nGO\nSELECT 2;\nGO\n', + sql: 'SELECT 1;\\nGO\\nSELECT 2;\\nGO\\n', dialect: 'mssql', }; const mssqlResult = JSON.parse(analyze_sql_json(JSON.stringify(mssqlRequest)));