Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  ユーザー定義関数のコンパイルおよびインストール

24.3.2.5 ユーザー定義関数のコンパイルおよびインストール

UDF を実装するファイルは、サーバーが実行されるホストでコンパイルおよびインストールする必要があります。MySQL ソース配布に含まれている UDF ファイルの例 sql/udf_example.cc を使用して、このプロセスについて説明します。

スレーブサーバーにレプリケーションされるステートメントで UDF が参照される場合は、すべてのスレーブでその関数が使用可能である必要があります。そうしないと、スレーブでその関数を呼び出そうとしたときに、レプリケーションがスレーブで失敗します。

次の手順は Unix の場合です。Windows での手順は、このセクションの以降で説明します。

udf_example.cc ファイルには次の関数が含まれています。

  • metaphon() は、文字列引数の metaphon 文字列を返します。これは soundex 文字列に似ていますが、英語向けに調整されています。

  • myfunc_double() は、引数内の文字の ASCII 値の合計をその引数の長さの合計で割ったものを返します。

  • myfunc_int() は、その引数の長さの合計を返します。

  • sequence([const int]) は、指定された数値または 1 (数値が指定されなかった場合) から始まるシーケンスを返します。

  • lookup() は、ホスト名の IP アドレスを返します。

  • reverse_lookup() は、IP アドレスに対するホスト名を返します。この関数は、'xxx.xxx.xxx.xxx' という形式の単一の文字列引数または 4 つの数値のいずれかを使用して呼び出すことができます。

  • avgcost() は、平均コストを返します。これは集約関数です。

動的にロード可能なファイルは、次のようなコマンドを使用して、共有可能なオブジェクトファイルとしてコンパイルします。

shell> gcc -shared -o udf_example.so udf_example.cc

CMakegcc を使用している場合 (MySQL はそのように構成されています) は、より簡単なコマンドで udf_example.so を作成できます。

shell> make udf_example

UDF が含まれている共有オブジェクトをコンパイルしたら、共有オブジェクトをインストールして MySQL に通知する必要があります。gcc を使用して udf_example.cc から共有オブジェクトをコンパイルすると、udf_example.so という名前のファイルが直接生成されます。共有オブジェクトをサーバーのプラグインディレクトリにコピーし、udf_example.so という名前を付けます。このディレクトリは、plugin_dir システム変数の値から取得できます。

一部のシステムでは、ダイナミックリンカーを構成する ldconfig プログラムは、共有オブジェクトの名前が lib で始まっていない場合、共有オブジェクトを認識しません。この場合は、たとえば、ファイル名を udf_example.so から libudf_example.so に名前変更してください。

Windows では、次の手順を使用してユーザー定義関数をコンパイルできます。

  1. MySQL ソース配布を取得します。セクション2.1.3「MySQL の取得方法」を参照してください。

  2. 必要な場合は CMake ビルドユーティリティーを http://www.cmake.org から取得します。(バージョン 2.6 以降が必要となります)。

  3. ソースツリーで sql ディレクトリを参照します。その場所には udf_example.def udf_example.cc という名前のファイルがあります。両方のファイルをこのディレクトリから作業ディレクトリにコピーします。

  4. 次の内容を持つ CMakemakefile (CMakeLists.txt) を作成します。

    PROJECT(udf_example)
    
    # Path for MySQL include directory
    INCLUDE_DIRECTORIES("c:/mysql/include")
    
    ADD_DEFINITIONS("-DHAVE_DLOPEN")
    ADD_LIBRARY(udf_example MODULE udf_example.cc udf_example.def)
    TARGET_LINK_LIBRARIES(udf_example wsock32)
    
  5. VC プロジェクトファイルおよびソリューションファイルを作成します。

    cmake -G "<Generator>"
    

    cmake --help を呼び出すと、有効なジェネレータのリストが表示されます。

  6. udf_example.dll を作成します。

    devenv udf_example.sln /build Release
    

共有オブジェクトファイルがインストールされたら、次のステートメントを使用して、新しい関数について mysqld に通知します。使用しているシステムでオブジェクトファイルのサフィクスが .so ではない場合、正しいサフィクスにすべて置き換えます (たとえば、Windows の場合は .dll)。

mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME 'udf_example.so';
mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME 'udf_example.so';
mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME 'udf_example.so';
mysql> CREATE FUNCTION sequence RETURNS INTEGER SONAME 'udf_example.so';
mysql> CREATE FUNCTION lookup RETURNS STRING SONAME 'udf_example.so';
mysql> CREATE FUNCTION reverse_lookup
    ->        RETURNS STRING SONAME 'udf_example.so';
mysql> CREATE AGGREGATE FUNCTION avgcost
    ->        RETURNS REAL SONAME 'udf_example.so';

関数を削除するには、DROP FUNCTION を使用します。

mysql> DROP FUNCTION metaphon;
mysql> DROP FUNCTION myfunc_double;
mysql> DROP FUNCTION myfunc_int;
mysql> DROP FUNCTION sequence;
mysql> DROP FUNCTION lookup;
mysql> DROP FUNCTION reverse_lookup;
mysql> DROP FUNCTION avgcost;

CREATE FUNCTION ステートメントおよび DROP FUNCTION ステートメントは、mysql データベースの func システムテーブルを更新します。関数の名前、型、および共有ライブラリ名は、このテーブルに保存されます。関数を作成または削除するには、mysql データベースの INSERT 権限または DELETE 権限をそれぞれ持っている必要があります。

すでに作成されている関数を CREATE FUNCTION を使用して追加しないでください。関数を再インストールする必要がある場合は、DROP FUNCTION を使用して関数を削除してから、CREATE FUNCTION を使用して再インストールする必要があります。これを行う必要があるのは、たとえば、mysqld が関数の新しいバージョンを取得するように、新しいバージョンを再コンパイルする場合です。そうしないと、サーバーは古いバージョンを使用し続けます。

アクティブ関数とは、CREATE FUNCTION を使用してロードされていて、DROP FUNCTION を使用して削除されていない関数です。すべてのアクティブ関数は、サーバーが起動するたびにリロードされますが、--skip-grant-tables オプションを指定して mysqld を起動した場合は異なります。この場合は、UDF の初期化がスキップされ、UDF は使用できません。


User Comments
  Posted by Anthony Ball on April 15, 2003
Helpful hint for debugging: fprintf(stderr,"Hello world"); anything printed to stderr will go to the mysql error log.
%lld is the proper format for printing long longs.
  Posted by Anthony Ball on April 21, 2003
After much time trying to track a problem on solaris(2.7, gcc 2.9-gnupro-99r1) I found that I needed -c -shared as compiler options. Almost everything worked without the -c, but strangely, any time I tried to use double quoted strings in the code they got turned into empty strings.
  Posted by Leonard Cuff on August 2, 2005
On Mac OS X 10.4 (Tiger), the following incantations were needed, in
order to build a "shared object" file.

export MACOSX_DEPLOYMENT_TARGET="10.4"
gcc -c myfunction.c
gcc -bundle -o myfunction.so myfunction.o -undefined dynamic_lookup

  Posted by matthieu aubry on October 25, 2006
I wanted to install the UDF to compute the levenshtein distance between two strings.
I put here all the commands i used, from scratch (both on the server and my mind), to make it running.
I had several little problems that you can't really solve without knowing some linux tips.

This is different from what I saw in this doc.

Here is the command for a debian sarge stable server.

>apt-get source mysql-server
>locate udf_example.c
>cd /usr/share/doc/libmysqlclient14-dev/examples
>gunzip udf_example.cc.gz
>gcc -shared -o udf_example.so udf_example.cc
>locate mysql.h
>gcc -shared -o udf_example.so udf_example.cc -I/usr/include/mysql/
>ll
>mv udf_example.so /usr/lib/libudf_example.so

#at this step i'm happy because the example from mysql works (note that i had to add the -I for the path and change the file extension to .cc)

# now i download the package from the mysql udf repository
# http://empyrean.lib.ndsu.nodak.edu/~nem/mysql/

>wget http://empyrean.lib.ndsu.nodak.edu/~nem/mysql/udf/dludf.cgi?ckey=28
>ll
>tar -xzvf dludf.cgi\?ckey\=28
>gcc -shared -o libmysqllevenshtein.so mysqllevenshtein.cc -I/usr/include/mysql/
>mv libmysqllevenshtein.so /usr/lib

#Then i launch mysql
>mysql -uroot -pPASS

# in mysql
mysql> use DATABASE

Database changed
mysql> CREATE FUNCTION levenshtein RETURNS INT SONAME 'libmysqllevenshtein.so';

mysql> select levenshtein(w1.word,w2.word) as dist from word w1, word w2 where ETC........... order by dist asc limit 0,10;

Enjoy :-)
  Posted by Adam Block on May 19, 2007
To compile mysqllevenshtein (as it happens, though I imagine this would be the case with other functions) on Ubuntu Dapper Drake, I needed to add the -fPIC compiler flag:

gcc -shared -o mysqllevenshtein.so mysqllevenshtein.cc \
-I/usr/include/mysql/ -fPIC

/afb
  Posted by Matthias Fripp on April 5, 2008
To clarify the Mac OS X example slightly: I use the following commands to build and install the example UDF on OS X 10.4. These should be executed in the directory where udf_example.c is stored.

# On OS X, use "-bundle" instead of "-shared",
# and specify where the mysql include files are
# (they should be in your main mysql directory).
gcc -bundle -o udf_example.so udf_example.c -I/usr/local/mysql/include

# MySQL will look for the shared library in /usr/lib, so put it there:
sudo cp udf_example.so /usr/lib
  Posted by newbie newbie on July 14, 2008
If you're still in trouble with the levenshtein function, here you can find a manual concerning the installation of the levenshtein group function: http://www.teamarbyte.de/levenshtein.html
It's in German, but I hope it helps anyway.
  Posted by Juan Miguel Cejuela on November 25, 2011
Implementation of levenshtein distance and k-bounded levenshtein distance (time O(kl), space(k))

http://github.com/jmcejuela/Levenshtein-MySQL-UDF

Entirely written in C
Sign Up Login You must be logged in to post a comment.