Fedora 27のMariaDBでregexp_replace関数を使うとWarningが返されるので、MariaDBだけアップデートしてみた。

By | 2017年12月20日 , Last update: 2017年12月21日

はじめに

前の記事を書いているときに、SQL文を発行するためのコードをPHPに書くためにテストをしていたのですが、どうもSQL文を実行した結果、以下のようなWarningが出力されてしまっているのに気が付きました。

| Warning | 1139 | Got error ‘pcre_exec: recursion limit of 100 exceeded’ from regexp |

 
最初は「これはthread_stackの大きさが小さいのが原因だが、mariadb-server.cnfにthread_stackの大きさを大きくするための設定も入れてあるので、何か他の原因があるかもしれない。よって、別途調べよう。」と思い、調査を後回しにして、前の記事を書きました。

ただ、ちょっと気持ちが悪かったのでGoogle先生に聞いてみたところ、MariaDBのバグであり、かつMariaDB関連のパッケージをアップグレードすれば直せることがわかったので、本記事ではそれについて書いていきます。

スポンサーリンク

発生した現象

Fedora 27へのアップグレードを行ったところ、MariaDBのバージョンも以下のように更新されます。

[panda@pnr ~]$ mysql –version
mysql Ver 15.1 Distrib 10.1.25-MariaDB, for Linux (x86_64) using readline 5.1

 
SQLのregexp_replace関数を実行すると以下のようなwarningが発生することがあるようです。

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 |
+——–+
| 146416 |
+——–+
1 row in set, 28 warnings (0.12 sec)

 

show warningsコマンドを使ってWarningの内容を表示させると、以下のWarningが表示されます。

| Warning | 1139 | Got error ‘pcre_exec: recursion limit of 100 exceeded’ from regexp |

 

原因

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]# dnf update mariadb*
[root@pnr panda]# systemctl restart mariadb*

 
アップデートすると、MariaDBのバージョンが10.1.29になリます。

この状態でアップデート前にWarningが返された時と同じSQL文を実行してみると…

[panda@pnr ~]$ mysql -u abcdefghij -p1234567890 hogehoge
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関数の実行がまったくできていないか、途中で失敗してしまっている可能性が高い(というか、ほぼ確実に失敗している)ので、修正が必要な問題でした。次回のアップグレードからは確認が必要な項目に追加した方が良いのかもしれません。

この記事は以上です。