Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
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 は使用できません。