Skip to content

Commit 9c7c45b

Browse files
committed
자동 포멧팅 기능 개선
1 parent fceb6bf commit 9c7c45b

26 files changed

Lines changed: 2906 additions & 96 deletions

src/db/query/executor.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1749,6 +1749,17 @@ impl QueryExecutor {
17491749
let Some(prefix) = sql.get(..line_start) else {
17501750
return false;
17511751
};
1752+
if sql_text::mysql_compatibility_for_sql(sql, preferred_db_type)
1753+
&& trimmed_line.starts_with('@')
1754+
{
1755+
let statement_tail_start = prefix.rfind(';').map_or(0, |idx| idx.saturating_add(1));
1756+
if prefix
1757+
.get(statement_tail_start..)
1758+
.is_some_and(|tail| !Self::strip_comments(tail).trim().is_empty())
1759+
{
1760+
return true;
1761+
}
1762+
}
17521763
let follows_open_comma_list = prefix
17531764
.lines()
17541765
.rev()

src/db/query/query_tests.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9758,6 +9758,50 @@ fn test_statement_bounds_at_cursor_for_mysql_db_type_keeps_double_dash_arithmeti
97589758
);
97599759
}
97609760

9761+
#[test]
9762+
fn test_mysql_family_line_leading_select_into_variables_stay_in_the_open_statement() {
9763+
let sql = "WITH collapsed AS (SELECT 1 AS n)\n\
9764+
SELECT COUNT(*), SUM(n)\n\
9765+
INTO\n\
9766+
@row_count,\n\
9767+
@total\n\
9768+
FROM collapsed;\n\
9769+
SELECT 2;\n";
9770+
9771+
for db_type in [
9772+
crate::db::connection::DatabaseType::MySQL,
9773+
crate::db::connection::DatabaseType::MariaDB,
9774+
] {
9775+
let items = QueryExecutor::split_script_items_for_db_type(sql, Some(db_type));
9776+
let statements = get_statements(&items);
9777+
assert_eq!(
9778+
statements.len(),
9779+
2,
9780+
"{db_type:?} split line-leading user variables as SQL*Plus commands: {items:?}"
9781+
);
9782+
assert!(
9783+
statements[0].starts_with("WITH collapsed")
9784+
&& statements[0].contains("@row_count")
9785+
&& statements[0].contains("@total")
9786+
&& statements[0].contains("FROM collapsed"),
9787+
"{db_type:?} lost part of SELECT INTO: {}",
9788+
statements[0]
9789+
);
9790+
9791+
let cursor = sql.find("collapsed;").expect("collapsed source");
9792+
let bounds =
9793+
QueryExecutor::statement_bounds_at_cursor_for_db_type(sql, cursor, Some(db_type))
9794+
.expect("SELECT INTO statement bounds");
9795+
let statement = &sql[bounds.0..bounds.1];
9796+
assert!(
9797+
statement.trim_start().starts_with("WITH collapsed")
9798+
&& statement.contains("@row_count")
9799+
&& statement.contains("@total"),
9800+
"{db_type:?} statement bounds started after line-leading user variables: {statement:?}"
9801+
);
9802+
}
9803+
}
9804+
97619805
#[test]
97629806
fn test_parse_tool_command_mysql_show_tables_is_mysql_command() {
97639807
let command = QueryExecutor::parse_tool_command("SHOW TABLES")

src/db/query/script.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9282,6 +9282,8 @@ impl QueryExecutor {
92829282
// aliases such as `r`, which otherwise resembles SQL*Plus RUN.
92839283
let is_list_continuation_line =
92849284
!builder.current_is_empty() && builder.current_ends_with_list_continuation_comma();
9285+
let is_mysql_user_variable_line =
9286+
builder.mysql_mode() && !builder.current_is_empty() && trimmed.starts_with('@');
92859287
let is_mysql_diagnostics_item_line =
92869288
!builder.current_is_empty() && builder.starts_with_mysql_get_diagnostics_context();
92879289

@@ -9298,6 +9300,7 @@ impl QueryExecutor {
92989300
&& !is_ddl_element_continuation_line
92999301
&& !is_mysql_index_hint_line
93009302
&& !is_list_continuation_line
9303+
&& !is_mysql_user_variable_line
93019304
&& !is_mysql_diagnostics_item_line
93029305
&& Self::parse_tool_command_if_candidate(trimmed).is_some()
93039306
{
@@ -9320,6 +9323,7 @@ impl QueryExecutor {
93209323
&& !is_ddl_element_continuation_line
93219324
&& !is_mysql_index_hint_line
93229325
&& !is_list_continuation_line
9326+
&& !is_mysql_user_variable_line
93239327
&& !is_mysql_diagnostics_item_line
93249328
{
93259329
if let Some(command) = Self::parse_tool_command_if_candidate(trimmed) {

src/ui/sql_editor/format_sweep_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3751,7 +3751,7 @@ fn formatting_sweep_additional_non_parenthesized_child_lists_have_typed_frames()
37513751
),
37523752
(
37533753
DatabaseType::MariaDB,
3754-
"UPDATE t1, t2 SET t1.v = 1, t2.v = 2; ALTER TABLE t1 ADD a INT, ADD b INT; CHECK TABLE t1, t2; CHECKSUM TABLE t1, t2; REPAIR TABLE t1, t2; GRANT role_a, role_b TO user_a, user_b; CREATE PROCEDURE p() BEGIN DECLARE v_a, v_b INT; DO v_a, v_b; END;",
3754+
"UPDATE t1, t2 SET t1.v = 1, t2.v = 2; ALTER TABLE t1 ADD a INT, ADD b INT; CHECK TABLE t1, t2; CHECKSUM TABLE t1, t2; REPAIR TABLE t1, t2; CHECK VIEW v1, v2 FOR UPGRADE; REPAIR VIEW v1, v2 FROM MYSQL; CACHE INDEX t1 KEY (PRIMARY), t2 INDEX (PRIMARY) IN `default`; GRANT role_a, role_b TO user_a, user_b; CREATE PROCEDURE p() BEGIN DECLARE v_a, v_b INT; DO v_a, v_b; END;",
37553755
&[
37563756
ListOwnerKind::UpdateTargets,
37573757
ListOwnerKind::AlterActions,

src/ui/sql_editor/formatter.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16746,7 +16746,9 @@ impl SqlEditorWidget {
1674616746
(
1674716747
Some("ANALYZE" | "CHECK" | "CHECKSUM" | "OPTIMIZE" | "REPAIR"),
1674816748
"TABLE",
16749-
) => Some(ListOwnerKind::MaintenanceTables),
16749+
)
16750+
| (Some("CHECK" | "REPAIR"), "VIEW")
16751+
| (Some("CACHE"), "INDEX") => Some(ListOwnerKind::MaintenanceTables),
1675016752
(Some("CREATE" | "ALTER" | "DROP"), "USER" | "ROLE") => {
1675116753
Some(ListOwnerKind::AccountTargets)
1675216754
}

0 commit comments

Comments
 (0)