Skip to content

Commit 8f9e5aa

Browse files
committed
자동 포멧팅 기능 개선
1 parent 2442cb5 commit 8f9e5aa

2 files changed

Lines changed: 112 additions & 6 deletions

File tree

change.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3856,3 +3856,99 @@ application-time, vector index, ROWS EXAMINED, UUID v7 문법/함수가 포함
38563856
| `cargo test --lib` | 6,575 통과·229 ignored·실패 0 |
38573857
| `cargo clippy --locked --all-targets -- -D warnings -W clippy::perf -W clippy::complexity` | 통과, 경고 0 |
38583858
| `cargo fmt --all -- --check` / `git diff --check` | 통과 |
3859+
3860+
# 28차: 전수 육안 재감사 + 품질 게이트 복구 (2026-07-16)
3861+
3862+
## 28-1. 검토 범위 (28차: 1차 sweep 후 전수 육안 재감사)
3863+
3864+
`formatting_sweep_all_files_generate_out_report` 1차 실행(PASS, failures=0) 후,
3865+
자동 검사 결과를 신뢰하지 않고 `target/format-sweep` 아래 61개 `.format.out`
3866+
전부(총 43,691줄)를 처음부터 끝까지 육안으로 재검토했다. 검토 기준은
3867+
`docs/auto_format_rule.md`의 10개 원칙(프레임 단일 깊이 원천, 문법 기반 부모 판정,
3868+
first-child-inline, `d+2` = 두 개의 live frame edge, closing은 owner 깊이,
3869+
주석/보존 텍스트의 구조 중립성, 구분자 문법성, 프레임 소유 전수성, canonical 출력)이다.
3870+
3871+
집중 검증한 패턴(각각 들여쓰기 숫자를 프레임 edge 수와 대조):
3872+
3873+
- Oracle: INSERT ALL/FIRST(WHEN 분기 포함), MERGE(ON 조건 d+2, UPDATE…DELETE WHERE),
3874+
MODEL(RULES/UPSERT/SEQUENTIAL ORDER, 2차원 CV), MATCH_RECOGNIZE(DEFINE 목록),
3875+
PIVOT/UNPIVOT, JSON_TABLE/XMLTABLE(NESTED PATH 2중), CURSOR 식, WITH FUNCTION/PROCEDURE,
3876+
SEARCH/CYCLE, $IF/$ELSE/$END, FORALL 본문 SET의 CASE 연속행, 할당값 프레임과
3877+
괄호-CASE 사다리(`v := a + (CASE … END)`), q-quote 다중행 보존, 주석 삽입 위치
3878+
(test_open_with.sql의 주석 60여 개 포함).
3879+
- MySQL/MariaDB: DELIMITER 루틴, handler/GET DIAGNOSTICS 목록, 명명 WINDOW 상속
3880+
(`w_order AS (w_base ORDER BY …)`), VALUES ROW, LATERAL, WITH ROLLUP/GROUPING,
3881+
CTE UPDATE/DELETE 다중 타깃, FOR PORTION OF, SYSTEM_TIME/PERIOD, CYCLE…RESTRICT,
3882+
BEGIN NOT ATOMIC, HANDLER 문, RETURNING, GROUP_CONCAT/JSON_ARRAYAGG의
3883+
ORDER BY…LIMIT 연속행, EXECUTE IMMEDIATE…USING.
3884+
3885+
## 28-2. 육안 재감사 결과: 프레임 위반 0건 (포맷터 수정 없음)
3886+
3887+
61개 파일 전부에서 frame depth 규칙 위반을 찾지 못했다. 이번 라운드에서
3888+
포맷터/스윕 로직 변경과 AS-IS/TO-BE 쿼리 변경은 없다.
3889+
3890+
규칙 위반이 아니어서 수정하지 않은 스타일 관찰 2건(기록만 남김):
3891+
3892+
- PL/SQL 선언/RETURNS/RECORD 문맥에서 타입 정밀도 쉼표도 일반 목록 규칙으로 분리됨
3893+
(`DECIMAL(12,\n 2)`). first-child-inline 규칙에 일관되며 회귀 기준선과 일치.
3894+
- MODEL 셀 참조 대괄호의 토큰 간격(`sum_sal [ CV () ]`). 깊이와 무관한 토큰 간격 스타일.
3895+
3896+
## 28-3. 품질 게이트에서 발견한 코드 회귀 1건 수정 (포맷팅과 무관)
3897+
3898+
`cargo test` 전체 실행에서 dispatch 가드 2건이 실패했다. 직전 커밋이
3899+
`src/ui/syntax_highlight.rs`의 DatabaseType 레지스트리 함수
3900+
`function_catalog_for_db_type`을 제거하고 직접 match로 대체하면서 발생한 회귀다.
3901+
MariaDB 하이라이트가 MySQL+MariaDB 함수 카탈로그 합집합을 쓰도록 한 기능 변화는
3902+
유지하면서, 합집합을 `MARIADB_HIGHLIGHT_FUNCTIONS_SET`으로 분리하고 레지스트리
3903+
함수를 복원했다.
3904+
3905+
AS-IS:
3906+
3907+
```rust
3908+
fn is_builtin_highlight_word(upper: &str, db_type: DatabaseType) -> bool {
3909+
match db_type {
3910+
DatabaseType::Oracle => ORACLE_FUNCTIONS_SET.contains(upper),
3911+
DatabaseType::MySQL => MYSQL_FUNCTIONS_SET.contains(upper),
3912+
DatabaseType::MariaDB => {
3913+
MYSQL_FUNCTIONS_SET.contains(upper) || MARIADB_FUNCTIONS_SET.contains(upper)
3914+
}
3915+
}
3916+
}
3917+
```
3918+
3919+
TO-BE:
3920+
3921+
```rust
3922+
static MARIADB_HIGHLIGHT_FUNCTIONS_SET: Lazy<HashSet<&'static str>> = Lazy::new(|| {
3923+
MYSQL_FUNCTIONS_SET
3924+
.iter()
3925+
.chain(MARIADB_FUNCTIONS_SET.iter())
3926+
.copied()
3927+
.collect()
3928+
});
3929+
3930+
fn function_catalog_for_db_type(db_type: DatabaseType) -> &'static HashSet<&'static str> {
3931+
match db_type {
3932+
DatabaseType::Oracle => &ORACLE_FUNCTIONS_SET,
3933+
DatabaseType::MySQL => &MYSQL_FUNCTIONS_SET,
3934+
DatabaseType::MariaDB => &MARIADB_HIGHLIGHT_FUNCTIONS_SET,
3935+
}
3936+
}
3937+
3938+
fn is_builtin_highlight_word(upper: &str, db_type: DatabaseType) -> bool {
3939+
function_catalog_for_db_type(db_type).contains(upper)
3940+
}
3941+
```
3942+
3943+
관련 가드: `backend_registry_functions_dispatch_on_concrete_database_type`,
3944+
`non_test_ui_source_uses_backend_specs_instead_of_direct_database_type_dispatch`
3945+
3946+
## 28-4. 최종 sweep 및 품질 게이트
3947+
3948+
| 검증 | 결과 |
3949+
| --- | --- |
3950+
| `formatting_sweep_all_files_generate_out_report` | 통과, 61개 파일 · frames 21,113 · boundaries 46,677 · depth symmetry 2,719 · body items 22,839 · closes 9,724 · failures 0 |
3951+
| 전수 육안 재감사 | 61개 파일 · 43,691줄 · 프레임 위반 0건 |
3952+
| `cargo test` | 전체 통과(lib 6,575 통과 · 229 ignored, 가드 71 통과 포함), 실패 0 |
3953+
| `cargo clippy --locked --all-targets -- -D warnings -W clippy::perf -W clippy::complexity` | 통과, 경고 0 |
3954+
| `cargo fmt --all -- --check` / `git diff --check` | 통과 |

src/ui/syntax_highlight.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,26 @@ static ORACLE_FUNCTIONS_SET: Lazy<HashSet<&'static str>> = Lazy::new(|| {
8585
.collect()
8686
});
8787

88-
fn is_builtin_highlight_word(upper: &str, db_type: DatabaseType) -> bool {
88+
static MARIADB_HIGHLIGHT_FUNCTIONS_SET: Lazy<HashSet<&'static str>> = Lazy::new(|| {
89+
MYSQL_FUNCTIONS_SET
90+
.iter()
91+
.chain(MARIADB_FUNCTIONS_SET.iter())
92+
.copied()
93+
.collect()
94+
});
95+
96+
fn function_catalog_for_db_type(db_type: DatabaseType) -> &'static HashSet<&'static str> {
8997
match db_type {
90-
DatabaseType::Oracle => ORACLE_FUNCTIONS_SET.contains(upper),
91-
DatabaseType::MySQL => MYSQL_FUNCTIONS_SET.contains(upper),
92-
DatabaseType::MariaDB => {
93-
MYSQL_FUNCTIONS_SET.contains(upper) || MARIADB_FUNCTIONS_SET.contains(upper)
94-
}
98+
DatabaseType::Oracle => &ORACLE_FUNCTIONS_SET,
99+
DatabaseType::MySQL => &MYSQL_FUNCTIONS_SET,
100+
DatabaseType::MariaDB => &MARIADB_HIGHLIGHT_FUNCTIONS_SET,
95101
}
96102
}
97103

104+
fn is_builtin_highlight_word(upper: &str, db_type: DatabaseType) -> bool {
105+
function_catalog_for_db_type(db_type).contains(upper)
106+
}
107+
98108
fn mysql_compatible_highlight_mode(db_type: DatabaseType) -> bool {
99109
match db_type {
100110
DatabaseType::Oracle => false,

0 commit comments

Comments
 (0)