こんにちは。
本投稿では、Aurora MySQL 2 の EOS 対策として Aurora MySQL 3 へのバージョンアップ(MySQL 5.7からMySQL 8へのバージョンアップ)を検証した際に、Aurora MySQL 2で実行できていたSQLが3で実行できなくなるという情報をいただいたので、実際にそのSQLをSQLテストツール(Insight SQL Testing)を使って確認してみた例を紹介します。
はじめに
Auoroa MySQL 2から3 (MySQL 5.7から8) へのバージョンアップを考えた際、以下の変更点などのMySQLのドキュメントを参照することの多いのではないでしょうか?
ここに書いてある変更がどんなものか、自分たちのサービスやアプリケーションで使用していないか、それらを探すのは骨の折れる作業だと思います。また、ここに書かれている内容以外にも何か影響にあるものがあるとしたら、考えるのも嫌になりますね!
今回ご紹介するSQLは、まさにそういった「変更点」としては含まれていないSQLの挙動の変更になります。
対象のSQL
対象のSQLは以下のようなSQLです。
select
*
from
emp
where
hiredate >= '1981-05'
Web検索で調べてみたところ、以下のように問題に直面している例もありました。なかなかこういった非互換を検出するのはとても難しいと思います。この挙動変更はバグフィクスという扱いにされていたため、バージョンアップに伴い発生する非互換とは認知されていないようです。
それではさっそく Insight SQL Testing で確認してみましょう。
Aurora MySQL 2での実行
実際にAurora MySQL 2では以下のに実行されるので、正しく実行されていると思ってしまうケースが多いでしょう。
ただし、実際は警告が出ていたようです。
とはいえ、なかなかこのような警告にも気づきづらいでしょうし、Aurora MySQL 3になっても同様に動作すると期待してしまいますよね?
Insight SQL Testingを使った検出
Insight SQL Testingを使うと、実際にAurora MySQL 2とAurora MySQL 3に対してSQLを実行し、以下のように挙動の違いが検出されます。現在使用されているSQLをテストケースとし、そのSQLでテスト実行を行った結果です。
参考
今回のMySQL 8におけるSQLの非互換問題については、以下のサイトなどを参考にしました。
おわりに
Insight SQL TestingはこのようにSQLの挙動の違いを検出することのできるツールです。
詳細について確認されたいときは、以下の記事等もご参照ください。
おまけ
投稿のタイトルを「~(2)」としているのは他のSQLを既に別記事で紹介したからです。
- GROUP BYの暗黙ソートがなくなる挙動変更
- https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-sql-changes の最初に出てくる挙動の変更で、あるあるの挙動変更なのでご存じの方も多いと思います。
そのほか、予約語もたくさん追加されてますのでご注意ください。
更新情報
- 2024/4/1: Insight Database Testingの製品名がInsight SQL Testingへ変更になったのでそれにあわせて更新しました