CentOS 5.5 MariaDB 5.1.49にUDF mregexpを入れてみる
MySQLのデフォルトの正規表現検索 REGEXPでは日本語を扱えないので、UDF*1でこれを実現したmregexp - MySQLで日本語の正規表現を扱うをMariaDBにインストールしてみる。尚、MariaDB 5.1はMySQL 5.1相当なので、動作検証はされていない。
- 事前に4.x系の鬼車が必要なのでこちらをインストールしておく
- Makeファイルを編集
INSTALL_LIBDIR = /usr/local/mariadb/lib/mysql/plugin
cd /usr/local/src wget http://www.irori.org/dl/tool/mregexp-1.0.tar.gz tar xvzf mregexp-1.0.tar.gz make make install
CREATE FUNCTION mregexp RETURNS INTEGER SONAME 'mregexp.so'; CREATE FUNCTION mregexp_version RETURNS STRING SONAME 'mregexp.so';
- エラーが発生
ERROR 1127 (HY000): Can't find symbol 'mregexp_version_init' in library
mregexp_versionはヴァージョン確認用の関数なので、とりあえずよいことにする。mregexpについてはMariaDB 5.1.49上で正常に動作していることを確認した。
参考
- mregexp_versionをどうにか動かせないかぐぐっていたところ、同時期にa_bickyさんという方がインストールを試されていらっしゃいました。奇遇ですね。上記インストール方法はa_bickyさんと別の方法にて問題を回避していたりします。その部分は解説はしょってます。何か問題が発生したらa_bickyさんの以下のエントリーを参考にすると解決するかもしれません。
追記
MySQL 5.1のplugin機構ではUDFの関数定義毎に_init関数が必要っぽいので以下のように何もしない初期化関数を用意
- mregexp.cにmregexp_version_initを追加
my_bool mregexp_version_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { regex_t *reg; DPRINT(">>mregexp_version_init"); if (args->arg_count > 0) { strcpy(message, "mregexp_version(): not requires arguments."); return 1; } initid->maybe_null = 0; initid->ptr = (char *)reg; return 0; }
これを追加してmakeし直し、MySQLを停止、make install、MySQL起動
make clean make svc -d /service/mariadb make install svc -u /service/mariadb
そしてmregexp_versionを再度登録!!
CREATE FUNCTION mregexp_version RETURNS STRING SONAME 'mregexp.so';
今度は無事動きましたー。
mysql> SELECT mregexp_version(); +-------------------------------------------+ | mregexp_version() | +-------------------------------------------+ | mregexp-1.0 [Shift_JIS] (oniguruma-4.7.1) | +-------------------------------------------+ 1 row in set (0.00 sec)
*1:User Defined Function