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