MySQLのバグをソースコードから解説 Bug36871927

MySQL 8.0
目次

初めに

MySQLなどのプログラムを使っていると、マニュアルなどのドキュメントに記述されている挙動と異なる挙動に遭遇して「マニュアルの読み方や使い方を誤ったのか?」や「なにか挙動が変だぞ?」と思うことは多々あります。

弊社がサポートさせていただいているお客様からの問い合わせの中には、MySQLのバグに起因するサポート依頼もあります。

お客様からの問い合わせ内容

お客様からの問い合わせの概要は、以下のような内容でした。

データベース名が34文字以上の場合、database関数の戻り値がUNIONなどをすると34文字に切り詰められる場合があるので、原因を調べてほしい

というわけで、MySQLのデータベース名の最大文字列長は64文字なので、database関数の戻り値が34文字に切り詰められるのは奇妙な挙動です。

手元でも再現を行うために、以下のようなクエリを実行してみます。

手元のMySQL serverで実行してみると、確かに34文字に切り詰められてしまって、お客様からの問い合わせ内容が再現できました。

ソースコード調査

問題のdatabase関数の挙動がわかったので、該当するソースコードを見てみると set_data_type_string で最大文字列長の大きさを MAX_FIELD_NAME に設定しているのが分かります。

MySQL8.0.39 sql/item_strfunc.h

なので、MAX_FIELD_NAME の値を定義しているヘッダーファイルの中身を見ると問題の34という値で定義されていることが分かりました。

MySQL 8.0.39 sql/sql_const.h

というわけで、Oracleのサポートへバグ報告を行うのと並行して、Bugfixが提供されるまでの回避策を探します。

バグの回避方法の検討

上記の原因の調査と並行してバグの修正版がリリースされるまでの間、現状で対応可能なバグ回避策を検討する必要があります。

database関数の中で定義されている最大文字列長が正しくないだけで、単純な出力文字列としては正しく64文字まで出力は出来ています。
なので、文字列長の長さの定義だけ上書きできるような方法をとれば、バグを回避できる可能性が高いと考えて convert関数 でラップする方法を考えました。

実行してみると想定通りバグが回避出来て、文字列長が短い mysql データベースの場合でも問題なく動作することも確認できました。

お客様には、バグ修正がなされたバージョンがリリースされるまで上記の方法でバグを回避していただくことになりました。

MySQL 8.0.40 バグ修正版のリリース

MySQL 8.0.40 のリリースノートに以下のようなBugfixの記載があります

SQL Function and Operator Notes

バグ修正が行われたので、UNIONをしても正しく動作するようになりました。

バグの修正概要

MySQLのソースコードはGithubに公開されていて、誰でも見ることが可能です。

今回解消さればバグ番号で調べると以下のコミットログが残っています。

Bug#36871927: database() results truncated at 34 bytes due to union
https://github.com/mysql/mysql-server/commit/2dd5e2ededbbc40056428f7b137708e030477eb8

主な修正点は、テストケースの追加と上記のソースコード調査でも判明していた最大文字列長の値を NAME_CHAR_LEN の64文字に変更された点です。

他にも MAX_FIELD_NAME の値を使っていた sql/sql_table.ccなども変更されて MAX_FIELD_NAME の値を使っている場所がなくなりました。

まとめ

MySQLは、かなり昔からデータベースの文字列長の制限は64文字でした。
Githubで公開されている古い MySQL 3.23.22-beta でも見つかるので、かなり初期のころからずっと発見されずに生き残ってきたバグのようでした。

MySQL 3.23.22-beta sql/item_strfunc.h

もしMySQLでお困りのことがございましたら、弊社にご相談をいただければ対応できることは多いと思います。お気軽にお問い合わせください。

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

よかったらシェアしてね!
  • URLをコピーしました!
目次