はじめに
前の記事を書いているときに、SQL文を発行するためのコードをPHPに書くためにテストをしていたのですが、どうもSQL文を実行した結果、以下のようなWarningが出力されてしまっているのに気が付きました。
最初は「これはthread_stackの大きさが小さいのが原因だが、mariadb-server.cnfにthread_stackの大きさを大きくするための設定も入れてあるので、何か他の原因があるかもしれない。よって、別途調べよう。」と思い、調査を後回しにして、前の記事を書きました。
ただ、ちょっと気持ちが悪かったのでGoogle先生に聞いてみたところ、MariaDBのバグであり、かつMariaDB関連のパッケージをアップグレードすれば直せることがわかったので、本記事ではそれについて書いていきます。
発生した現象
Fedora 27へのアップグレードを行ったところ、MariaDBのバージョンも以下のように更新されます。
mysql Ver 15.1 Distrib 10.1.25-MariaDB, for Linux (x86_64) using readline 5.1
SQLのregexp_replace関数を実行すると以下のようなwarningが発生することがあるようです。
+——–+
| total |
+——–+
| 146416 |
+——–+
1 row in set, 28 warnings (0.12 sec)
show warningsコマンドを使ってWarningの内容を表示させると、以下のWarningが表示されます。
原因
MariaDBのjiraに以下のようなバグレポートがありました。
An RLIKE that previously worked on 10.0 now returns “Got error ‘pcre_exec: recursion limit of 100 exceeded’ from regexp”
Warning発生時の操作は異なるものの、出力されているメッセージが同じであることと、対象のバージョンに10.1.25が含まれていたので、MariaDBだけアップデートを行うことにしました。
対応策
root権限でdnfコマンドを実行してMariaDB関連のパッケージをアップデートします。ついでに、MariaDBを再起動します。
[root@pnr panda]# systemctl restart mariadb*
アップデートすると、MariaDBのバージョンが10.1.29になリます。
この状態でアップデート前にWarningが返された時と同じSQL文を実行してみると…
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
スポンサーリンク
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.29-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
MariaDB [hogehoge]> select sum(char_length(regexp_replace(regexp_replace(regexp_replace(regexp_replace(post_content,'(?s)<div class=”code”>((?!</div>).)*?</div>’,”),'<.+?>’,”),’&.+?;’,’_’),'(\s+|\r\n|\n)’,”))) as total from wp_posts where post_status = ‘publish’ and post_type = ‘post’;
+——–+
| total |
+——–+
| 118302 |
+——–+
1 row in set (0.15 sec)
Warningが表示されなくなりました。また、文字数の合計が少なくなっています。
まとめ
この記事で取り上げたWarningが返されてしまうとregexp_replace関数の実行がまったくできていないか、途中で失敗してしまっている可能性が高い(というか、ほぼ確実に失敗している)ので、修正が必要な問題でした。次回のアップグレードからは確認が必要な項目に追加した方が良いのかもしれません。
この記事は以上です。