From c2a3f491cdea77d1361208d92044f20362c334bd Mon Sep 17 00:00:00 2001 From: ptma Date: Thu, 25 Jun 2026 22:27:55 +0800 Subject: [PATCH] fix(sql): fix SQL keyword detection failure caused by leading parentheses --- crates/dbx-core/src/sql.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/dbx-core/src/sql.rs b/crates/dbx-core/src/sql.rs index f74dab8d73..defa17ce58 100644 --- a/crates/dbx-core/src/sql.rs +++ b/crates/dbx-core/src/sql.rs @@ -1596,7 +1596,7 @@ fn first_executable_sql_token_with_options(sql: &str, options: SqlParsingOptions let mut i = 0; while i < bytes.len() { - while i < bytes.len() && bytes[i].is_ascii_whitespace() { + while i < bytes.len() && (bytes[i].is_ascii_whitespace() || bytes[i] == b'(') { i += 1; } @@ -2123,6 +2123,16 @@ mod tests { assert!(starts_with_executable_sql_keyword("-- comment\nDESC users", &["DESCRIBE"])); } + #[test] + fn detects_keyword_after_parentheses() { + assert!(starts_with_executable_sql_keyword("(SELECT 1)", &["SELECT"])); + assert!(starts_with_executable_sql_keyword(" ( SELECT 1 )", &["SELECT"])); + assert!(starts_with_executable_sql_keyword("((SELECT 1))", &["SELECT"])); + assert!(starts_with_executable_sql_keyword("(SELECT * FROM users)", &["SELECT"])); + assert!(starts_with_executable_sql_keyword("(INSERT INTO users VALUES (1))", &["INSERT"])); + assert!(starts_with_executable_sql_keyword("/* comment */(UPDATE users SET name = 'test')", &["UPDATE"])); + } + #[test] fn mysql_hash_comments_are_ignored_for_keyword_detection() { assert!(starts_with_executable_sql_keyword_for_database(