ここでは、新しいネイティブ関数を追加する手順について説明します。注意: この手順には MySQL ソースコードの修正が含まれるので、バイナリディストリビューションにネイティブ関数を追加することはできません。MySQL をソースディストリビューションからコンパイルする必要があります。注意: (新しいバージョンがリリースされたときなど)別のバージョンの MySQL に移行する場合、新しいバージョンでも同じ手順を繰り返してネイティブ関数を追加する必要があります。
MySQL の新しいネイティブ関数を追加するには、以下の手順に従います。
sql_functions[]
配列に関数名を定義する行を
lex.h
に追加する。
関数のプロトタイプが単純な場合(引数の数が
0、1、2、または 3 個しかない)、lex.h で
sql_functions[]
配列の 2
番目の引数として SYM(FUNC_ARG#) (#
は引数の数)を指定し、item_create.cc
に関数オブジェクトを作成する関数を追加する必要がある。この例として、"ABS"
および create_funcs_abs()
を参照すること。
関数のプロトタイプが複雑な場合(引数の数が可変の場合など)、sql_yacc.yy
に 2
行追加する必要がある。まず、yacc
が定義する必要があるプリプロセッサシンボルを表す行を追加する(ファイルの先頭部分)。次に、関数のパラメータを定義し、パラメータの指定方法を定義する行を
simple_expr
解析規則に追加する。この参考例として、sql_yacc.yy
の ATAN
が出現する部分を参照すること。
item_func.h
で、関数の戻り値の型(数値または文字列)に応じて、Item_num_func
または Item_str_func
を継承するクラスを宣言する。
item_func.cc
で、定義している関数の型(数値型または文字列型)に応じて、以下のいずれかの宣言を追加する。
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
標準のアイテム(Item_num_func
など)からオブジェクトを継承する場合、定義する必要があるのはおそらく上記のいずれか
1
つだけであり、残りの関数の定義は親オブジェクトにまかせることができる。たとえば、Item_str_func
クラスは ::str()
が返す値に対して atof()
を実行する val()
関数を定義している。
おそらく、以下のオブジェクト関数も定義する必要がある。
void Item_func_newname::fix_length_and_dec()
この関数は、少なくとも渡された引数に基づいて
max_length
を計算する必要がある。max_length
は、関数が返す可能性がある最大文字数である。関数が
NULL
値を返すことができない場合、この関数で
maybe_null = 0
も設定する必要がある。関数は、関数の引数が
NULL
を返すことができるかどうかを、その引数の
maybe_null
変数を調べることによって、確認できる。この実装例については、Item_func_mod::fix_length_and_dec
を参照すること。
上記の関数はすべてスレッドセーフで作成する必要があります(言い換えると、mutex ロックを使用せずに関数でグローバルまたはスタティックな変数を使用してはいけません)。
NULL
を返す場合、::val()
、::val_int()
、または
::str()
で、null_value
を 1 に設定して、0 を返す必要があります。
::str()
オブジェクト関数の場合、さらにいくつかの注意事項があります。
String *str
引数は、結果の格納に使用できる文字列バッファを提供する(String
型の詳細については、sql_string.h
ファイルを参照すること)。
::str()
関数は、結果が
NULL
の場合は (char*)
0
を、それ以外の値の場合は結果が格納された文字列を返す必要がある。
現在のすべての文字列関数は、どうしても必要な場合を除いて、メモリ割り当ては一切行わないように定義されている。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.