MySQL Parameters で SQL 構文の差分を確認できるようにした

MySQLのバージョン間のいろんな差分を見れる MySQL Parameters というのがあるんだけど、SQL 構文の差分を見れるようにしてみた。

たとえば、8.0 の最初のリリースの 8.0.11 と最後のリリースの 8.0.37 の構文の差分はここから見れる。 https://mysql-params.tmtms.net/statement/?vers=8.0.11,8.0.37

ソースは help コマンドの結果(実際には mysql.help_topic テーブルから取得)。

たとえば ALTER EVENT はこんな感じ:

mysql> help alter event;
Name: 'ALTER EVENT'
Description:
Syntax:
ALTER
    [DEFINER = user]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name]
    [ENABLE | DISABLE | DISABLE ON {REPLICA | SLAVE}]
    [COMMENT 'string']
    [DO event_body]

The ALTER EVENT statement changes one or more of the characteristics of
an existing event without the need to drop and recreate it. The syntax
for each of the DEFINER, ON SCHEDULE, ON COMPLETION, COMMENT, ENABLE /
DISABLE, and DO clauses is exactly the same as when used with CREATE
...

かなりフリーフォーマットなんだけど、ここから構文っぽいのを抽出してる。

SHOW GRANTS はこんな感じで、see ってなんやねん。抽出失敗してるんか? って思いますよね?

SHOW GRANTS
    [FOR user_or_role
        [USING role [, role] ...]]

user_or_role: {
    user (see )
  | role (see .
}

でも help show grants 見るともともとこんな感じなんですよ。なんだこれ。

mysql> help show grants;
Name: 'SHOW GRANTS'
Description:
Syntax:
SHOW GRANTS
    [FOR user_or_role
        [USING role [, role] ...]]

user_or_role: {
    user (see )
  | role (see .
}

This statement displays the privileges and roles that are assigned to a
MySQL user account or role, in the form of GRANT statements that must
be executed to duplicate the privilege and role assignments.
...

まあいいや。

差分がある場合は右のセルの背景を黄色で表示してたんだけど、他のと違って文字が多いんで、パッと見何が異なるのかわかりにくい。

なので、複数行の文字列に差分がある場合は違いがある行を赤と緑で表示するようにした。少しはわかりやすくなった。


MySQL Parameters は静的ページで、処理は全部フロントエンドで ruby.wasm で書いてる。 こんな感じ→ https://mysql-params.tmtms.net/lib/mysql_params.rb いやー、Ruby でフロントエンド書けるの楽だなー。

行の差分表示は diff-lcs を使った。

gem は普通には ruby.wasm では使えないので、最初はgem 内の複数の .rb ファイルをひとつに連結して、HTML から

<script type="text/ruby" src="lib/diff-lcs/diff.rb"></script>

みたいにして使ってたんだけど、新しい ruby.wasm だと require_relative が使えるようになったので、diff-lcs 配下の .rb ファイルの requirerequire_relative に書き換えただけで使えるようになった。便利!