Amazon RDS のデータベースプレビュー環境で MySQL 9.1 を評価出来るようになりました
いわさです。
MySQL 8.0 以降は、LTS リリースに加えて四半期ごとのイノベーションリリースというサポート期間の短いバージョンが提供されるようになっています。
現在は MySQL 8.4 が最新の LTS リリースですが、その後新しいイノベーションリリース MySQL 9.0 と MySQL 9.1 がリリースされています。
何度か記事にしていたりするのですが、これまでも定期的にイノベーションリリースが RDS プレビュー環境というオハイオリージョンのみで使えるプレビュー評価用の環境で使うことが出来ていました。
MySQL 9.0 がプレビュー環境でなかなかリリースされずおやおや?と思っていたのですが、先日 9.1 が RDS プレビュー環境で提供されるようになったというアナウンスがありました。
MySQL 9.1 のリリースノートはこちらになります。
MySQL 9.1 を使ってみる
オレゴンリージョンの RDS プレビュー環境をのぞいてみると、確かにエンジンバージョンで MySQL 9.1.0 が選択可能になっていました。
どうやら MySQL 9.0.0 はスキップされたようです。
というわけで MySQL 9.1.0 と MySQL 8.4.1 を用意し、いくつか追加・変更された機能を確認してみましょう。
CREATE VIEW ステートメントで IF NOT EXISTS
MySQL 9.1 では CREATE VIEW ステートメントでIF NOT EXISTS
が使えるようになったみたいです。
既にビューが存在している場合は従来はエラーが発生していましたが、IF NOT EXISTS
を使うとエラーを発生させずにステートメントの実行を成功させることが出来ます。
まずは 8.4 で。
mysql> use hogedb;
Database changed
mysql> create table t1 (c1 int, c2 int, c3 int);
Query OK, 0 rows affected (0.30 sec)
mysql> CREATE VIEW v1 AS SELECT c1, c3 FROM t1;
Query OK, 0 rows affected (0.19 sec)
mysql> CREATE VIEW v1 AS SELECT c2 FROM t1;
ERROR 1050 (42S01): Table 'v1' already exists
mysql> CREATE VIEW IF NOT EXISTS v1 AS SELECT c2 FROM t1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS v1 AS SELECT c2 FROM t1' at line 1
同名のビューを作成しようとするとエラーが発生しますし、IF NOT EXISTS
を試してみるとシンタックスエラーが発生しますね。
では同じことを 9.1 で試してみます。
mysql> use hogedb;
Database changed
mysql> create table t1 (c1 int, c2 int, c3 int);
Query OK, 0 rows affected (0.24 sec)
mysql> CREATE VIEW v1 AS SELECT c1, c3 FROM t1;
Query OK, 0 rows affected (0.18 sec)
mysql> CREATE VIEW v1 AS SELECT c2 FROM t1;
ERROR 1050 (42S01): Table 'v1' already exists
mysql> CREATE VIEW IF NOT EXISTS v1 AS SELECT c2 FROM t1;
Query OK, 0 rows affected, 1 warning (0.18 sec)
こちらもIF NOT EXISTS
なしだとエラーになりましたが、ありの場合は正常に終了しました。ただし警告が出ています。
mysql> show warnings;
+-------+------+---------------------------+
| Level | Code | Message |
+-------+------+---------------------------+
| Note | 1050 | Table 'v1' already exists |
+-------+------+---------------------------+
1 row in set (0.18 sec)
警告内容としてはビューが既に存在する旨が出力されていますね。
DISTINCT と SUM を併用して異なる結果が取得される
私これ知らなかったのですが、バイナリリテラルを使った時にそのまま SUM する場合と DISTICT と SUM を併用する場合で結果が異なる問題があったようです。次のバグです。
SUM() yielded a different result in some cases for the same value when DISTINCT was also used. For example:
こちらが 9.1 で修正されたらしいです。見てみますか。
まずは 8.4 から。
mysql> SELECT SUM(b'1100'), SUM(DISTINCT b'1100');
+--------------+-----------------------+
| SUM(b'1100') | SUM(DISTINCT b'1100') |
+--------------+-----------------------+
| 12 | 9 |
+--------------+-----------------------+
1 row in set (0.19 sec)
おー、そうだったのか。続いて 9.1 です。
mysql> SELECT SUM(b'1100'), SUM(DISTINCT b'1100');
+--------------+-----------------------+
| SUM(b'1100') | SUM(DISTINCT b'1100') |
+--------------+-----------------------+
| 12 | 12 |
+--------------+-----------------------+
1 row in set (0.19 sec)
こちらは期待どおりの結果が得られていますね。
さいごに
本日は Amazon RDS のデータベースプレビュー環境で MySQL 9.1 を評価出来るようになったので試してみました。
注意点ですが、このプレビュー環境は運用環境を想定した使用は出来ません。
一定期間で削除されるなど様々な制限事項が存在します。将来的に次の LTS バージョンに備えて新機能を早めに評価したい場合などに使ってください。