UDFのメカニズムが機能するためには,関数をCまたはc++で記述し,オペレーティングシステムが動的ロードをサポートしている必要があります。MySQLソス配布には,5のUDF関数を定義しているsql / udf_example.cc
ファ邮箱ルが含まれています。Udfの呼び出し規則のしくみを理解するには,このファeルを参照してください。包括/ mysql_com.h
ヘッダーファイルにはUDF関連のシンボルおよびデータ構造体が定義されていますが,このヘッダーファイルを直接インクルードする必要はなく,mysql.h
によって邮箱ンクル邮箱ドされます。
UDFに含まれているコードは実行中のサーバーの一部になるため,UDFを記述するときは,サーバーコードを記述するときに適用されるすべての制約に従う必要があります。たとえば,libstdc + +
ラブラリの関数を使用しようとすると,問題が生じることがあります。これらの制約は将来のサーバーのバージョンで変更されることがあるため,サーバーをアップグレードするときに,古いサーバー用にもともと作成されたUDFを改訂する必要がある場合があります。これらの制約にいては,セクション2.9.4 " MySQLソス構成オプション"およびセクション2.9.5 " MySQLのコンパereplicationルに関する問題"を参照してください。
Udfを使用できるようにするには,mysqldを動的にリンクする必要があります。mysqldからシンボルにアクセスする必要があるudfを使用する場合(たとえば,sql / udf_example.cc
の变音位
関数はdefault_charset_info
を使用します)は,-rdynamic
を指定してプログラムをリンクする必要があります(男人dlopen
を参照してください)。
SQLステートメントで使用する各関数について,対応するC(またはc++)関数を定義します。以降の説明では,「xxx」という名前を関数名の例として使用します。SQLとc / c++での使用を区別するために,XXX ()
(大文字)はSQL関数の呼び出しを示し,xxx ()
(小文字)はc / c++関数の呼び出しを示します。
c++を使用する場合は,C関数を次のようにカプセル化できます。
extern "C"{…}
これにより,完成したudf内でc++関数名が読み取ることができる状態に維持されます。
次のリストは,XXX ()
という名前の関数のc / c++関数に。メ邮箱ンの関数xxx ()
は必須です。また,セクション24.3.2.6 "ユザ定義関数のセキュリティ上の予防措置"で説明している理由により,UDFにはここで説明している少なくとも1つのほかの関数が必要となります。
xxx ()
メ邮箱ン関数。ここで関数の結果が計算されます。SQL関数のデタ型とc / c++関数の戻り型との対応を次に示します。
SQLの型 C / c++の型 字符串
char *
整数
很久很久
真正的
双
小数
関数を宣言することも可能ですが,現時点では値は文字列として返されるため,字符串
関数の場合と同様にudfを作成します。行
関数は実装されていません。xxx_init ()
xxx ()
の初期化関数。存在する場合は次の目的で使用できます。XXX ()
への引数の数をチェックする。引数が目的の型であることを確認するか,メインの関数が呼び出されたときに引数を目的の型に強制的に変更するようにMySQLに指示する。
メ邮箱ンの関数が必要とするメモリ邮箱を割り当てる。
結果の最大長を指定する。
結果の小数点以下の最大の桁数を指定する(
真正的
関数の場合)。結果として
零
を許容するかどうかを指定する。
xxx_deinit ()
xxx ()
の初期化解除関数。存在する場合,初期化関数によって割り当てられたすべてのメモリを割り当て解除します。
SQLステトメントによってXXX ()
が呼び出されると,MySQLは初期化関数xxx_init ()
を呼び出して,引数のチェック,メモリ,の割り当てなどの必要なセットアップを実行させます。xxx_init ()
がエラーを返した場合,MySQLはエラーメッセージを出力してSQLステートメントを中止し,メイン関数または初期化解除関数を呼び出しません。それ以外の場合,MySQLはメMySQLン関数xxx ()
を行ごとに1回ず呼び出します。すべての行が処理されると,MySQLは初期化解除関数xxx_deinit ()
を呼び出し,必要なクリンアップ処理が実行されます。
SUM ()
のように動作する集約関数の場合は,次の関数も作成する必要があります。
xxx_clear ()
現在の集約値をリセットしますが,新しいグルプに対する初期集計値として引数を挿入しません。
xxx_add ()
現在の集計値に引数を追加します。
MySQLは集計UDFを次のように処理します。
xxx_init ()
を呼び出して,集約関数が結果を格納するために必要なメモリを割り当てます。集团
式に従ってテブルをソトします。新しいグルプになるたびに先頭行で
xxx_clear ()
を呼び出します。同じグルプに属する各行に対して
xxx_add ()
を呼び出します。グルプが変更されたとき,または最後の行が処理されたあとに,
xxx ()
を呼び出して集約の結果を取得します。すべての行が処理されるまでステップ3から5までを繰り返します。
xxx_deinit ()
を呼び出して,udfが割り当てたメモリを解放します。
すべての関数はスレッドセフである必要があります。これにはメイン関数だけでなく,初期化関数および初期化解除関数のほか,集約関数によって必要とされる追加の関数も含まれます。この要件により,変化するグロバル変数または静的変数を割り当てることができなくなります。メモリが必要な場合は,メモリをxxx_init ()
で割り当て,xxx_deinit ()
で解放するようにしてください。