================================================================
  SQLBeauty  -  SQL 整形ツール
================================================================

  Version : 2.1.0
  Author  : totosasa
  Contact : freeware@totosasa.jp
  URL     : https://www.totosasa.jp/profile/freeware/index.html

  ストアドプロシージャ・ファンクションを含む 5 大主要 DBMS
  (T-SQL / MySQL / PostgreSQL / SQLite / Oracle) の SQL コードを
  日本語UI・シンタックスハイライト付きで整形できる Windows
  デスクトップツールです。オフライン動作。SQL は端末外に一切出ません。


----------------------------------------------------------------
  特徴
----------------------------------------------------------------

  ・ストアドプロシージャ・ファンクションも整形
      SELECT 文だけでなく CREATE PROCEDURE / FUNCTION /
      TRIGGER / TRY-CATCH / MERGE / PIVOT / CTE / ウィンドウ
      関数なども整形できます。

  ・日本語UI
      メニュー・設定項目・エラーメッセージはすべて日本語。
      パースエラー時は行・列番号で位置を表示します。

  ・シンタックスハイライト
      入力・出力エディタ両方で SQL のキーワード・関数名・
      コメント・文字列・数値を色分け表示します。

  ・整形に失敗してもクラッシュしない
      パースエラー時は元の SQL をそのまま出力に表示し、
      ステータスバーにエラー位置を表示します。
      ユーザーの入力 SQL は絶対に失われません。

  ・オフライン完結
      ネットワーク通信は一切行いません。テレメトリ・
      クラッシュレポート送信・自動アップデートも無し。
      機密 SQL を扱う業務でも安心して使えます。

  ・ポータブル動作
      設定 (settings.json) は実行ファイルと同じフォルダに
      保存されます。レジストリも %AppData% も汚しません。
      USB 起動・社内共有フォルダからの起動も可能です。

  ・整形オプションのカスタマイズ
      キーワード大文字／小文字、インデント幅、JOIN を改行、
      AS を改行、IN リストを複数行展開などを画面で切替。

  ・ファイルの自動エンコーディング判定
      UTF-8 (BOM 有/無) / Shift_JIS / EUC-JP を自動で判別
      して読み込みます。保存は読み込んだときの文字コードで行い、
      その文字コードで表せない文字 (Shift_JIS での絵文字・
      韓国語など) があるときは、UTF-8 で保存するか、「?」に
      置き換えて保存するかを確認します。
      日本語コメント (-- これはコメント) の文字を化けさせません。
      (T-SQL の整形ではコメント自体が残りません。
       「既知の制限・注意事項」を参照)

  ・ウィンドウ状態の自動保存
      ウィンドウのサイズ・位置・最大化状態・スプリッタ位置は
      終了時に保存され、次回起動時に復元されます。


----------------------------------------------------------------
  こんなときに便利
----------------------------------------------------------------

  ・他人が書いたインデントのバラバラな T-SQL を整える
  ・大きなストアドプロシージャの保守時に可読性を上げる
  ・コードレビュー前に整形して差分を見やすくする
  ・運用 DB から取り出した小文字 SQL を大文字に統一する
  ・オンライン整形ツールが使えない閉域網の業務環境


----------------------------------------------------------------
  動作環境
----------------------------------------------------------------

  項目              内容
  ----------------  --------------------------------------------
  OS                Windows 10 (1903 以降) / Windows 11
  必須ランタイム    .NET Framework 4.8
                    （Windows 10/11 には標準で同梱）
  対応 DBMS         T-SQL (SQL Server 2008 〜 2022)
                    MySQL 5.7 / 8.0 / MariaDB 10.x
                    PostgreSQL 12 / 13 / 14 / 15 / 16
                    SQLite 3.x
                    Oracle 11g / 12c / 19c / 21c
  メモリ            128 MB 以上
  ディスク          20 MB 以上


----------------------------------------------------------------
  インストール
----------------------------------------------------------------

  1. 配布された zip ファイルを任意のフォルダに展開してください。
  2. 展開先フォルダ内の SQLBeauty.exe をダブルクリックすると
     起動します。

  アンインストールは展開したフォルダごと削除するだけです。


----------------------------------------------------------------
  使い方（基本フロー）
----------------------------------------------------------------

  [1] 整形対象の SQL を貼り付ける
      左側の入力エディタに SQL を貼り付けます。
      または「ファイル」→「開く...」(Ctrl+O) で .sql ファイル
      を読み込めます。

  [2] 整形を実行
      ツールバーの「整形 (F5)」を押します。
      F5 キーでも実行できます。
      右側に整形結果が表示されます。

  [3] 結果を保存
      整形結果を右側エディタからコピーする、または
      左側に貼り戻して「ファイル」→「上書き保存」(Ctrl+S) /
      「名前を付けて保存...」(Ctrl+Shift+S) で書き出します。

  [4] 整形ルールを変更したい場合
      「編集」→「整形オプション...」で各種ルールを切替。
      設定は settings.json に保存され、次回起動時に復元されます。


----------------------------------------------------------------
  画面説明
----------------------------------------------------------------

  ◆ メニュー

      ファイル(F)
        ・開く(O)...                Ctrl+O
        ・上書き保存(S)             Ctrl+S
        ・名前を付けて保存(A)...    Ctrl+Shift+S
        ・一括整形(B)...            Ctrl+B
        ・終了(X)                   Alt+F4

      編集(E)
        ・整形を実行(F)             F5
        ・1行化(L)                  Ctrl+L
        ・結果をコピー(C)           Ctrl+Shift+C
        ・結果を保存(R)...
        ・整形オプション(O)...

      表示(V)
        ・差分表示モード(D)         Ctrl+D

      ヘルプ(H)
        ・SQLBeauty について(A)...

  ◆ ツールバー

      DBMS:        対応 DBMS を選択 (T-SQL / MySQL / PostgreSQL / SQLite / Oracle)
                   全 5 方言が V2.0 で本実装になりました。
      整形 (F5):   入力 SQL を整形して右側に表示
      クリア:      入出力エディタを空にする

  ◆ ステータスバー

      左:    状態メッセージ ("整形完了 (12ms)" 等)
      中央:  現在のエンコーディング
             (UTF-8 / UTF-8 (BOM) / Shift_JIS / EUC-JP)
      右:    入力エディタの文字数

  ◆ 整形オプションダイアログ

      ・インデント        スペース幅 1〜16
      ・キーワード        大文字 / 小文字 / 原型保持
      ・関数名            大文字 / 小文字 / 原型保持 (Phase 1: 無視)
      ・カンマ位置        行末 / 行頭 (Phase 1: 行末固定)
      ・AND / OR 位置     行末 / 行頭
      ・改行・展開        AS / JOIN / IN リスト 等の改行設定
      ・最大行幅          (Phase 1: ScriptDOM 制約により無視)

      Phase 1 (T-SQL) では Microsoft.SqlServer.TransactSql.ScriptDom
      の機能範囲で動作します。一部オプションは表示のみで Phase 2 以降
      で対応予定です。


----------------------------------------------------------------
  保存データの場所
----------------------------------------------------------------

  SQLBeauty.exe と同じフォルダ配下に自動生成されます。

  SQLBeauty.exe があるフォルダ/
    ├─ settings.json              ← 整形ルール・配色・
    │                                ウィンドウ位置などの設定
    └─ logs/                      ← 動作ログ
        └─ sqlbeauty-yyyy-MM-dd.log ← 日次ローテーション (14日で削除)

  レジストリへの書き込みは一切行いません。

  ※ 動作ログには、開いた・保存したファイルのパスや、パースエラーの
     メッセージ (エラー付近の SQL の字句を含みます) が記録されます。
     ログは端末の外には送信しませんが、共有フォルダに置いて使う
     場合などは logs フォルダの扱いにご注意ください。

  ※ settings.json が壊れていたときは既定の設定で起動し、壊れた
     ファイルは settings.json.broken として残します。


----------------------------------------------------------------
  既知の制限・注意事項
----------------------------------------------------------------

  ・Windows 専用です（macOS / Linux 非対応）。

  ・V2.0 では T-SQL (SQL Server) / MySQL / PostgreSQL / SQLite /
    Oracle の全 5 方言に対応しています。

  ・T-SQL: Microsoft.SqlServer.TransactSql.ScriptDom 170.x の
    制約により、以下のオプションは UI 上に表示されますが
    反映されません:
      - インデント文字をタブにする
      - カンマを行頭に配置する
      - 関数名のみ大文字／小文字に変換する
      - 最大行幅で折り返す
      - BETWEEN / CASE を複数行に展開する

  ・T-SQL: 整形・1行化の結果には、元の SQL のコメント
    (-- や /* */) が残りません。SQL Server のパーサー
    (ScriptDOM) で構文を読み取って作り直すためです。
    コメントがあるときは、ステータスバーに「⚠ コメント N 件は
    T-SQL の整形で削除されます」と表示します。コメントだけの
    SQL は整形せず、元の SQL をそのまま表示します。
    一括整形では、コメントを含むファイルは書き出さずに飛ばし、
    完了報告にファイル名を表示します。

  ・一括整形で、出力先に同じ名前のファイルがあるときは、元の
    ファイルを「.bak」を付けた名前で残してから上書きします。

  ・T-SQL: 入れ子が極端に深い SQL や、条件が非常に多い SQL は、
    整形せずに元の SQL をそのまま表示します (パーサーが処理
    しきれずに落ちるのを防ぐため)。

  ・文字コードを判定できないファイル (UTF-8 / Shift_JIS / EUC-JP
    のどれとしても読めないファイル) を開くと警告します。読めない
    部分は別の文字に置き換わるため、上書き保存の前にも確認します。

  ・T-SQL: SQL Server 2000 時代の旧構文 ( "*=" / "=*" 形式の
    OUTER JOIN 等) はパースエラーになる場合があります。
    その場合は元の SQL がそのまま出力に表示されます。

  ・MySQL: 業務でよく使う DML (SELECT / INSERT / UPDATE / DELETE)、
    CREATE TABLE / ALTER TABLE のカラム定義リスト改行、
    DELIMITER ディレクティブ、CREATE PROCEDURE / FUNCTION /
    TRIGGER 本体の BEGIN/END ブロックインデントに対応しています。
    PL/pgSQL ほどの厳密整形はしませんが、業務 SQL のレビューに
    十分な品質です。CASE/IF/WHILE 等の制御構造はインライン保持
    (本格対応は V1.2.x 以降を予定)。

  ・PostgreSQL: 業務でよく使う DML、:: 型キャスト、JSON 演算子
    (-> ->> @>)、ダブルクォート識別子 ("..." 含む日本語識別子)、
    パラメータ ($1 $2)、配列型 (text[])、CTE (WITH)、
    CREATE TABLE / ALTER TABLE のカラム定義リスト改行、
    FILTER 句、ON CONFLICT 句に対応しています。
    一方、CREATE FUNCTION の本体 ($body$ ... $body$ で囲まれた
    PL/pgSQL ブロック) は dollar-quoted 文字列として
    そのまま保持され、内部は整形されません (V1.2 制限)。
    DO ブロックも同様です。

  ・SQLite: 業務でよく使う DML、CREATE TABLE / ALTER TABLE のカラム
    定義リスト改行、3 種すべての識別子 quoting ("..." / [...] /
    バックティック)、PRAGMA / ATTACH / DETACH 文、INSERT OR IGNORE /
    REPLACE、ON CONFLICT 句、CREATE TRIGGER の BEGIN/END に対応して
    います。仮想テーブル / FTS / R-Tree 等の拡張モジュール固有構文の
    特別整形は V1.3.x 以降で検討予定です。

  ・Oracle: 業務でよく使う DML、CREATE TABLE / ALTER TABLE のカラム
    定義リスト改行、Q-quote 文字列 (q'[...]')、ANSI ダブルクォート
    識別子 ("..." 含む日本語識別子)、バインド変数 (:p_id)、
    SQL*Plus 置換変数 (&var)、文字列連結 ||、(+) 旧形 OUTER JOIN、
    階層問い合わせ (CONNECT BY PRIOR / START WITH)、集合演算 MINUS、
    LISTAGG (...) WITHIN GROUP (...)、MERGE INTO に対応しています。
    一方、PL/SQL 本体 (CREATE PACKAGE / PACKAGE BODY の対応関係 /
    DECLARE / EXCEPTION / カーソル / ネストした BEGIN/END/IF/LOOP) は
    AST が無いためベストエフォート整形に留まります (基本的な BEGIN/END
    インデントは効きます)。本格整形は V2.0.x 以降で検討予定です。

  ・10万行超の巨大な SQL は整形に時間がかかる場合があります。


----------------------------------------------------------------
  ライセンス
----------------------------------------------------------------

  本ソフトウェアは「フリーソフトウェア」として提供されます。

    ○ 個人利用
        無料でご利用いただけます。

    ○ 業務利用
        無料でご利用いただけます。社内での利用に制限はありません。

    △ 再配布・社外への二次配布
        事前に作者へご連絡ください。

    × 本ソフトウェアの逆コンパイル・改変
        禁止します。

    × 本ソフトウェアの販売
        禁止します。

  本ソフトウェアは「現状有姿（AS IS）」で提供されます。
  本ソフトウェアの利用によって生じたいかなる損害についても、
  作者は責任を負いません。

  本ソフトウェアは複数のオープンソースソフトウェア
  (Microsoft.SqlServer.TransactSql.ScriptDom / Scintilla.NET /
   Newtonsoft.Json / NLog 等) を利用しています。
  各ソフトウェアの著作権・ライセンス条項は同梱の
  THIRD_PARTY_LICENSES.txt を参照してください。


----------------------------------------------------------------
  バージョン履歴
----------------------------------------------------------------

  Ver 2.1.0   2026-10-17
      ・文字コードの判定を改善:
        - Shift_JIS と EUC-JP を自動で見分けるようにしました
        - どの文字コードとしても読めないファイル (Windows-1252 など)
          を開くと警告し、上書き保存の前にも確認するようにしました
        - ASCII だけのファイルは、既定の保存文字コード (整形オプション)
          に従って保存するようにしました
        - 保存する文字コードで表せない文字があるときは、保存前に
          確認するようにしました
      ・T-SQL の整形を改善:
        - 入れ子が極端に深い SQL や条件が非常に多い SQL で
          アプリが落ちることがある問題を修正しました
          (以前より深い SQL も整形でき、さらに深いものは元の
           SQL をそのまま表示します)
        - 1行化で GO が文と同じ行に入る問題を修正しました
        - コメントだけの SQL が空の結果になる問題を修正しました
        - コメントが消えるときに警告を表示するようにしました
      ・MySQL の整形を改善:
        - user / event など予約語と同じ名前のテーブル名・列名・別名の
          大文字小文字を変えないようにしました (mysql.user 等)
        - STDDEV(x) などの関数名と「(」の間に空白が入り、実行エラーに
          なる問題を修正しました
        - ->> 演算子が 2 つに分かれる問題を修正しました
      ・PostgreSQL の整形を改善:
        - pg_dump の COPY ... FROM stdin のデータ行と、\connect などの
          psql コマンド行を変更せずに残すようにしました
        - <<= / @? / -|- などの演算子が分かれる問題を修正しました
        - 改行をはさんで続けた文字列が 1 行にまとめられ、構文エラーに
          なる問題を修正しました
        - psql 変数 (:id / :'name') が分かれる問題を修正しました
      ・Oracle の整形を改善:
        - 「/」の行と SQL*Plus コマンド行 (@ / SPOOL / SET / PROMPT /
          EXEC 等) を、次の文とまとめずにそのまま残すようにしました
        - => / ^= / %TYPE / %ROWCOUNT / <<ラベル>> が分かれる問題を
          修正しました
        - GRANT SELECT ... の SELECT の前で改行される問題を修正しました
      ・SQLite: == 演算子と ->> 演算子が分かれる問題を修正しました
      ・CRLF のファイルで行コメントの後ろの改行が崩れる問題、閉じて
        いない括弧の後の文で改行の規則が効かなくなる問題、同時に整形
        すると結果が壊れることがある問題を修正しました
      ・一括整形:
        - 選んでいる DBMS に関係なく T-SQL で整形していた問題を
          修正しました
        - 出力先に同じ名前のファイルがあるときは「.bak」に残して
          から上書きするようにしました
        - T-SQL でコメントを含むファイルと、文字コードを判定できない
          ファイルは、書き出さずに飛ばすようにしました
      ・Windows のシャットダウン・サインアウト時にも、保存していない
        編集があれば確認するようにしました
      ・settings.json が壊れていたときは settings.json.broken に残して
        既定の設定で起動するようにしました (設定が消えないように)
      ・LF のファイルを編集すると CRLF の改行が混ざる問題を修正しました
      ・オプション画面で OK を押すと差分表示モードの設定が戻る問題、
        ファイルを読み込んだ後に Ctrl+Z で前の内容に戻る問題を修正
        しました
      ・zip を展開せずに起動したときなど、起動できない場合に案内を
        表示するようにしました

  Ver 2.0.2   2026-05-09
      ・内部品質向上 (整形挙動の変更なし):
        - ParenKind / AddState の enum を共通化 (各 Formatter の重複削除)
        - AddListBlockers の共通部分を集約 (PRIMARY/FOREIGN/INDEX 等 7 語)
        - Phase 6+ の方言追加時の実装テンプレートを整理
      ・性能ベンチマークの全方言展開:
        - 1 万行 INSERT スクリプトの整形時間を継続検証
        - 自作トークナイザ路線は ScriptDom 比 13〜21 倍速を実証
          (MySQL 0.08 秒 / PostgreSQL 0.07 秒 / SQLite 0.05 秒 /
           Oracle 0.06 秒、対 ScriptDom 1.07 秒)

  Ver 2.0.1   2026-05-09
      ・Oracle MERGE 文の整形を改善:
        - WHEN MATCHED THEN UPDATE SET ... を 1 行に保つ
        - WHEN NOT MATCHED THEN INSERT (...) VALUES (...) も 1 行に保つ
        - WHEN 句の前で改行 + 1 段インデント
      ・通常の UPDATE / INSERT 文は従来通り改行 (回帰なし)

  Ver 2.0.0   2026-05-09  (5 方言全対応のメジャーリリース)
      ・Oracle / PL/SQL の整形に対応 (Phase 5)
        - DML (SELECT / INSERT / UPDATE / DELETE / MERGE / RETURNING)
        - 階層問い合わせ (CONNECT BY PRIOR / START WITH / LEVEL /
          ROWNUM / SYS_CONNECT_BY_PATH)
        - 集合演算 MINUS (= EXCEPT)
        - Oracle 固有: q'[...]' Q-quote 文字列 / :bind_var バインド変数 /
          &var SQL*Plus 置換変数 / || 文字列連結 / (+) 旧形 OUTER JOIN
        - LISTAGG (col, sep) WITHIN GROUP (ORDER BY ...)
        - MERGE INTO ... USING ... WHEN MATCHED THEN
        - ANSI ダブルクォート識別子 (日本語識別子も対応)
        - CREATE TABLE / ALTER TABLE のカラム定義リスト改行
        - PL/SQL の BEGIN/END ブロックインデント (ベストエフォート)
        - FETCH FIRST n ROWS ONLY (Oracle 12c+)
      ・自動整形・一括整形が Oracle でも動作
      ・Phase 1 〜 5 の自作トークナイザ路線で完結。新規 OSS 追加なし、
        配布物のサイズもほぼ据え置き。

  Ver 1.3.0   2026-05-09
      ・SQLite の整形に対応 (Phase 4)
        - DML (SELECT / INSERT / UPDATE / DELETE / RETURNING)
        - 3 種識別子 quoting ("..." ANSI / [...] T-SQL 互換 /
          バックティック MySQL 互換) すべて受け入れ
        - PRAGMA 文 / ATTACH / DETACH DATABASE
        - INSERT OR IGNORE / REPLACE / FAIL / ABORT 修飾
        - ON CONFLICT (...) DO UPDATE SET / DO NOTHING (UPSERT)
        - WITHOUT ROWID / AUTOINCREMENT / GENERATED ALWAYS
        - CREATE TRIGGER の BEGIN/END ブロックインデント
        - BLOB リテラル X'1A2B' / JSON1 関数 (json_extract 等)
      ・自動整形・一括整形が SQLite でも動作
      ・MySQL の修正:
        - ALTER TABLE ADD COLUMN c VARCHAR(50) の VARCHAR(50) が
          誤って改行展開される潜在バグの修正

  Ver 1.2.0   2026-05-09
      ・PostgreSQL の整形に対応 (Phase 3)
        - DML (SELECT / INSERT / UPDATE / DELETE / RETURNING)
        - JOIN / GROUP BY / ORDER BY / HAVING / UNION
        - CTE (WITH) / ウィンドウ関数
        - PostgreSQL 固有: :: 型キャスト / -> ->> @> JSON 演算子
        - ダブルクォート識別子 / $1 パラメータ / 配列型 (text[])
        - ON CONFLICT / FILTER 句 / E'...' エスケープ文字列
        - CREATE TABLE / ALTER TABLE のカラム定義リスト改行
      ・自動整形・一括整形が PostgreSQL でも動作
      ・CREATE FUNCTION の PL/pgSQL 本体 ($body$ ... $body$) と
        DO $$ ... $$ ブロックは原文保持 (内部整形は V1.2.x 以降)
      ・MySQL の修正 (ultrathink レビュー指摘):
        - ; 直後の DELIMITER 認識
        - ALTER TABLE 子句 (DROP/RENAME) のインライン保持
        - BEGIN 内行コメントのインデント

  Ver 1.1.0   2026-05-09
      ・MySQL / MariaDB の整形に対応 (Phase 2)
        - DML (SELECT / INSERT / UPDATE / DELETE / MERGE)
        - JOIN / GROUP BY / ORDER BY / HAVING / UNION
        - CREATE TABLE のカラム定義リストを改行展開
        - バックティック識別子・日本語識別子・コメント保持
        - MySQL 固有の関数・型キーワードを認識
      ・自動整形・一括整形が MySQL でも動作
      ・CREATE PROCEDURE 本体や DELIMITER 等は制限付き整形
        (詳細は「既知の制限・注意事項」を参照)

  Ver 1.0.0   2026-05-05
      ・初版リリース
      ・T-SQL (SQL Server 2008 〜 2022) 整形対応
      ・シンタックスハイライト付きエディタ (ScintillaNET)
      ・パースエラー時のフォールバック (元 SQL を保持)
      ・ファイル開く/保存 + UTF-8 / Shift_JIS / EUC-JP
        自動判定
      ・整形オプションダイアログ
      ・ウィンドウ状態・設定の自動保存 (settings.json)


----------------------------------------------------------------
  作者・連絡先
----------------------------------------------------------------

  作者     : totosasa
  連絡先   : freeware@totosasa.jp
  URL      : https://www.totosasa.jp/profile/freeware/index.html

  不具合のご報告、ご要望、再配布のご相談などはお気軽に
  メールをお送りください。

================================================================
