diff --git "a/source/_posts/2025/20250929a_Pure_Rust\343\201\247\347\224\237\343\201\276\343\202\214\345\244\211\343\202\217\343\201\243\343\201\237PostgreSQL\345\205\254\345\274\217\346\247\213\346\226\207\346\272\226\346\213\240SQL\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\202\277\343\203\274\343\200\214uroborosql-fmt\343\200\215\343\202\222\343\203\252\343\203\252\343\203\274\343\202\271\360\237\216\211.md" "b/source/_posts/2025/20250929a_Pure_Rust\343\201\247\347\224\237\343\201\276\343\202\214\345\244\211\343\202\217\343\201\243\343\201\237PostgreSQL\345\205\254\345\274\217\346\247\213\346\226\207\346\272\226\346\213\240SQL\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\202\277\343\203\274\343\200\214uroborosql-fmt\343\200\215\343\202\222\343\203\252\343\203\252\343\203\274\343\202\271\360\237\216\211.md" new file mode 100644 index 00000000000..65c1b21fda8 --- /dev/null +++ "b/source/_posts/2025/20250929a_Pure_Rust\343\201\247\347\224\237\343\201\276\343\202\214\345\244\211\343\202\217\343\201\243\343\201\237PostgreSQL\345\205\254\345\274\217\346\247\213\346\226\207\346\272\226\346\213\240SQL\343\203\225\343\202\251\343\203\274\343\203\236\343\203\203\343\202\277\343\203\274\343\200\214uroborosql-fmt\343\200\215\343\202\222\343\203\252\343\203\252\343\203\274\343\202\271\360\237\216\211.md" @@ -0,0 +1,156 @@ +--- +title: "Pure Rustで生まれ変わったPostgreSQL公式構文準拠SQLフォーマッター「uroborosql-fmt」をリリース🎉" +date: 2025/09/29 00:00:00 +postid: a +tag: + - フォーマッター + - uroboroSQL + - Rust + - WebAssembly +category: + - DB +thumbnail: /images/2025/20250929a/thumbnail.png +author: 川渕皓太 +lede: "roborosql-fmtの新バージョンv1.0.0をリリースしました。当社のSQLフォーマッター開発の歩みと課題の変遷について紹介します" +--- +# はじめに + + + +コアテクノロジーグループの川渕です。 + +先日、uroborosql-fmtの新バージョンv1.0.0をリリースしました 🎉 + +このツールは当社が公開している[PostgreSQL向けのSQLコーディング規約](https://future-architect.github.io/coding-standards/documents/forSQL/SQL%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84%EF%BC%88PostgreSQL%EF%BC%89.html)に基づき、SQL文をフォーマットするツールです。 + +現在、以下の3種類の方法でご利用いただけます。 + +- [ブラウザツール](https://future-architect.github.io/uroborosql-fmt/ja) +- [VSCode拡張](https://marketplace.visualstudio.com/items?itemName=Future.uroborosql-fmt) +- [CLIツール](https://github.com/future-architect/uroborosql-fmt/blob/main/crates/uroborosql-fmt-cli/README.md) + +詳しい利用方法は[利用方法の章](#利用方法)で説明しています。 + +※ uroborosql-fmtのライセンスはBUSLですが、競合会社含め開発環境での利用は自由ですのでお気軽にご使用ください + +また、今回のアップデートについては、以下のシリーズ記事でも詳しく解説しています。 + +- 新パーサーの技術詳細: (近日公開予定!) +- パーサーの置き換え戦略: (近日公開予定!) + +# 当社のSQLフォーマッター開発の歩みと課題の変遷 + +当社ではこれまでにもSQLフォーマッターを開発・公開してきました。 + +それらのフォーマッターにはそれぞれ課題がありましたが、今回の新バージョンではこれまでの課題を**全て克服**しています。 + +| 年 | 名前 | 特徴 | 課題 | 関連ブログ | +| :------- | :------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **2017** | **uroboroSQL formatter** | ・Pythonで開発
・トークンベースで解析(パースなし) | ・lexerベースのため複数RDB構文対応といった自由度は高い反面、複雑な構文はサポートが困難 (postgresql以外のRDBを使う方は未だお薦めできます)
・PythonのためVSCode拡張化やwasm化が難しい | ・[SQL開発者を幸せにする!? Sublime Text 3でも使える uroboroSQL Formatter を公開しました | フューチャー技術ブログ](/articles/20170228/) | +| **2020** | **ANTLR+TypeScript版SQLフォーマッター** | ・TypeScriptで開発(VSCode拡張化が容易)
・ANTLR4のパース結果を利用 | ・ANTLR4のパーサーが非常に低速なことにより、フォーマッター全体の動作が低速 | ・[Engineer Camp2020でSQLフォーマッターを開発しました | フューチャー技術ブログ](/articles/20200919/) | +| **2022** | **uroborosql-fmt v0.1.0** | ・Rustで開発(wasm化やVSCode拡張化が可能)
・`tree-sitter-sql`のパース結果を利用しており高速 | ・`tree-sitter-sql`の文法が不完全で、PostgreSQLの追従・修正コストがかかる
・文法を増やすとバイナリサイズが大きくなる
・`tree-sitter-sql`のC言語依存によりwasm化が複雑 | ・[新しいSQLフォーマッターであるuroboroSQL-fmtをリリースしました | フューチャー技術ブログ](/articles/20231120a/) | +| **2025** | **uroborosql-fmt v1.0.0** | ・Rustで開発(wasm化やVSCode拡張化が可能)
・公式PostgreSQL文法に準拠したパーサー([postgresql-cst-parser](https://github.com/future-architect/postgresql-cst-parser))のパース結果を利用しているため、**文法の追従コストが低い**
・postgresql-cst-parserは十分に高速であり、**パーサー自体も高速**
・Pure Rustであるため、**wasm化が容易** | | | + +# パーサー移行の背景とメリット + +uroborosql-fmt v0.1.0ではパーサーとして [tree-sitter-sql](https://github.com/future-architect/tree-sitter-sql)を利用していましたが、開発を進めるにつれて以下3点の課題が判明しました。 + +- サポートされている文法が少なく、grammarの改善に工数がかかる + - v0.1.0における新規構文サポートでは、フォーマットプロセスの改善に加えてパースプロセスの改善(grammarの改善)が必要であり、新規構文サポートに工数がかかっていた +- 対応文法を増やすとパーサーのサイズが大きくなり、結果的にフォーマッターのバイナリサイズも大きくなる + - フォーク元tree-sitter-sqlでは、PRを全てマージすると83MBになるらしい… ([参考issue](https://github.com/m-novikov/tree-sitter-sql/issues/59)) +- tree-sitterは内部的にC言語を利用しているため、wasmにコンパイルする際にwasm-bindgenが利用できず、wasmへのコンパイルが複雑化していた + - 関連ブログ: [C/C++を呼び出しているRustのWASM化 | フューチャー技術ブログ](https://future-architect.github.io/articles/20230605a/) + +これらの課題に対応するため、当社の山田がPostgreSQLの公式のパーサーをRustに移植した**postgresql-cst-parser**を作成しました。uroborosql-fmt v1.0.0ではそのパーサーを利用するようにしています。 + +- [future-architect/postgresql-cst-parser - GitHub](https://github.com/future-architect/postgresql-cst-parser) + +パーサーの変更により、v0.1.0でのパーサー起因の課題が全て解消されました。 + +- 公式パーサーから移植しているので、パーサー自体は全てのPostgreSQL文法に対応している +- 公式の構文定義ファイルからRust製パーサーを自動生成しているため、文法の追従が容易 +- 全てのPostgreSQL文法に対応しているにも関わらず、バイナリサイズが約6MBとコンパクト +- Pure Rust (C言語を含まない) であるため、wasm-bindgenを用いてwasmにコンパイルすることができる + +この変更によって、新規構文サポートのためのパースプロセスの改善工数は**ゼロ**になり、フォーマットプロセスの改善のみで新規構文をサポートできるようになりました :tada: + +image.png + +パーサーの動作は以下のデモページから確認することができます。 + +- [PostgreSQL CST Parser](https://tanzaku.github.io/postgresql-cst-parser/) + + +image.png + + +新パーサーの詳細については後日ブログで公開する予定です。 + +# 利用方法 + +現在以下の3種類の方法で利用することができます。 + +1. ブラウザツール +1. VSCode拡張 +1. CLIツール + +## 1. ブラウザツール + +[デモページ](https://future-architect.github.io/uroborosql-fmt/ja.html)からブラウザ上で試すことができます。使い方の詳細はデモページをご覧ください。 + + +image.png + + +## 2. VSCode拡張 + +1. [uroborosql-fmtの拡張機能](https://marketplace.visualstudio.com/items?itemName=Future.uroborosql-fmt)をインストールしてください +1. settings.jsonに以下の設定を入れてください + + ```json settings.json + { + "[sql]": { + "editor.defaultFormatter": "Future.uroborosql-fmt" + } + } + ``` + +1. SQLファイルを開き、コマンドパレットから`Format Document`か、`format sql`を実行してください +`format sql`では選択範囲のフォーマットをサポートしています + +image.png + +## 3. CLIツール + +1. Rustをインストールしてください。([インストール方法](https://www.rust-lang.org/ja/tools/install)) +1. 以下を実行してください + + ```sh + cargo install --git https://github.com/future-architect/uroborosql-fmt + ``` + +1. 以下のようなコマンドでuroborosql-fmtを実行できるようになります (オプションの詳細は[CLIツールのREADME](https://github.com/future-architect/uroborosql-fmt/blob/main/crates/uroborosql-fmt-cli/README.md)をご覧ください) + + ```sh + uroborosql-fmt-cli --write target.sql + ``` + +# 今後の展望 + +今後は対応構文の拡張とLinter機能の開発を行う予定です。 + +Linter機能は具体的に、以下のような警告・エラーをVSCode上で表示する機能を想定しています。 + +- 大きすぎるIN句はパフォーマンスに影響を与える可能性があるため警告 ([コーディング規約](https://future-architect.github.io/coding-standards/documents/forSQL/SQL%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84%EF%BC%88PostgreSQL%EF%BC%89.html#in-%E5%8F%A5-1)) +- 存在しないカラム・テーブルを参照している場合はエラー +- NullableなカラムをINNER JOINしている場合は警告 + +# 最後に + +まだまだ開発途上であり、フォーマットできない構文も多くあります。 +不具合や要望等ございましたらお気軽に以下リポジトリまでissueやPRを頂ければと思います。 + +- [future-architect/uroborosql-fmt - GitHub](https://github.com/future-architect/uroborosql-fmt) + +後日postgresql-cst-parser開発の話、パーサー移行に伴うフォーマッター移行作業の話の2本の記事を公開予定です。お楽しみに! diff --git a/source/images/2025/20250929a/image.png b/source/images/2025/20250929a/image.png new file mode 100644 index 00000000000..fbe8ac088e6 Binary files /dev/null and b/source/images/2025/20250929a/image.png differ diff --git a/source/images/2025/20250929a/image_2.png b/source/images/2025/20250929a/image_2.png new file mode 100644 index 00000000000..a1095fee22e Binary files /dev/null and b/source/images/2025/20250929a/image_2.png differ diff --git a/source/images/2025/20250929a/image_3.png b/source/images/2025/20250929a/image_3.png new file mode 100644 index 00000000000..dddf10127d7 Binary files /dev/null and b/source/images/2025/20250929a/image_3.png differ diff --git a/source/images/2025/20250929a/image_4.png b/source/images/2025/20250929a/image_4.png new file mode 100644 index 00000000000..e2aed719946 Binary files /dev/null and b/source/images/2025/20250929a/image_4.png differ diff --git a/source/images/2025/20250929a/thumbnail.png b/source/images/2025/20250929a/thumbnail.png new file mode 100644 index 00000000000..39f81af0158 Binary files /dev/null and b/source/images/2025/20250929a/thumbnail.png differ diff --git a/source/images/2025/20250929a/top.png b/source/images/2025/20250929a/top.png new file mode 100644 index 00000000000..76c790a2f75 Binary files /dev/null and b/source/images/2025/20250929a/top.png differ