Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
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
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
  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.