# sql-dialect-fmt
[](https://github.com/hjosugi/sql-dialect-fmt/actions/workflows/ci.yml)
Snowflake SQL と Databricks SQL のフォーマッタ+シンタックスハイライタ(Rust 製)。`gofmt` / Prettier / Biome 流の opinionated・ほぼ設定なしの整形を目指します。
整形は **無破壊・べき等** を機械的に保証します(パースできない入力は無変更で素通し、整形しても有意トークンとコメントは保存、`format(format(x)) == format(x)`)。
## インストール
```sh
# このリポジトリから直接(`sql-dialect-fmt` バイナリが入る)
cargo install --git https://github.com/hjosugi/sql-dialect-fmt sql-dialect-fmt
# ローカルチェックアウトから
cargo install --path crates/sql-dialect-fmt-cli
# または: cargo build --release -p sql-dialect-fmt → target/release/sql-dialect-fmt
```
## 使い方
```sh
sql-dialect-fmt query.sql # 整形して stdout へ
sql-dialect-fmt --write *.sql # ファイルをその場で整形
sql-dialect-fmt --check src/**/*.sql # 未整形なら非ゼロ終了(CI 向け)
cat query.sql | sql-dialect-fmt # stdin → stdout
# オプション: --dialect snowflake|databricks / --line-width N(既定100) / --indent-width N(既定4) / --no-uppercase
```
## Snowsight / Chrome 拡張
Snowsight 上で使う Chrome 拡張を `extensions/chrome` に置いています。Rust formatter を
WebAssembly にして同梱するので、ローカルサーバは不要です。
```sh
./scripts/build-chrome-extension.sh
```
その後、Chrome の `chrome://extensions` で Developer mode を有効にし、`extensions/chrome`
を Load unpacked してください。Snowsight の worksheet editor にフォーカスして、右下の
`sql-dialect-fmt` ボタン、拡張アイコン、または `Alt+Shift+F` で整形できます。
## 開発
```sh
cargo test --workspace
cargo clippy --workspace --all-targets
cargo fmt --all --check
```
## 状態
Snowflake は SELECT 一式・DML(INSERT/UPDATE/DELETE/MERGE)・COPY・主要 DDL/object DDL・Semantic View・CREATE PROCEDURE/FUNCTION(SQL/JavaScript/Python/Java/Scala body)までパース+整形。Databricks は LATERAL VIEW、Delta DDL option、VERSION/TIMESTAMP AS OF、higher-order function lambda、backtick identifier を dialect mode でサポート。LSP/semantic tokens/hover、Tree-sitter grammar、CLI、Snowsight 用 Chrome/WASM 拡張も入っています。看板機能は **magic trailing comma**。詳細と計画は [ROADMAP.md](ROADMAP.md) を参照。
## クレート構成
| crate | 役割 |
| --- | --- |
| `sql-dialect-fmt-syntax` | `SyntaxKind`・キーワード認識・`rowan` 言語定義 |
| `sql-dialect-fmt-lexer` | 手書きロスレス Lexer |
| `sql-dialect-fmt-parser` | エラー回復で無停止のロスレス CST パーサ |
| `sql-dialect-fmt-formatter` | 汎用 Doc IR エンジン + SQL 整形規則 |
| `sql-dialect-fmt-highlight` | トークン分類(シンタックスハイライト) |
| `sql-dialect-fmt-hover` | 型・手続き・タスクの hover テキスト |
| `sql-dialect-fmt-tree-sitter` | 同梱 Tree-sitter grammar の Rust バインディング |
| `sql-dialect-fmt-lsp` | Language Server(formatting / semanticTokens / 診断、stdio) |
| `sql-dialect-fmt-wasm` | Snowsight/Chrome 拡張向けの WebAssembly bridge |
| `sql-dialect-fmt` | CLI エントリポイント(crate path は `crates/sql-dialect-fmt-cli`) |
## ライセンス
MIT OR Apache-2.0