文字列系組込みSQL関数(Native関数)の引数

dddで観察

しっかり撮影できたので残しとこう。

値がnameになるらしい。引数に3とか数字を渡しても"3"になる。3.3なら"3.3"。で、-2を渡したら0になってた。

printfで観察

SQLクエリ上の引数は、Item_funcのインスタンス変数argsに設定された状態で呼出が行われる。Item_str_func::val_str(String *str)の引数strは戻り値に使用するためのもの(ローカル変数のポインタを返すわけにはいかないので)。

argsの定義

Item **args;

つまりargsはItem型の配列。ということは、Item::type()で型を判別できる。

というわけで、いろいろ試してみた結果、得られた型の一覧。型の候補はItemクラスにenum Typeで定義されてる。

SQLクエリ上の引数 Itemの型
"abc" STRING_ITEM
100 INT_ITEM
12.3 DECIMAL_ITEM
-10 FUNC_ITEM
-22.2 FUNC_ITEM
hex(6) FUNC_ITEM
カラム名(c1とか) FIELD_ITEM

面白いのは負の数はFUNC_ITEMであること。そういえばsql_functionsのところに演算子(+-*/)もあったなぁ。あとhex(hex6))みたいに入れ子SQL関数呼出をした場合、内側のSQL関数は展開されていない状態で外側のSQL関数の処理が呼び出されること。つまり、引数がFUNC_ITEMだったらちゃんと呼出をしてあげないといかんということかしら。カラム名の場合、これもカラムとして渡されるっぽい。

引数がSQL関数仕様に則った型かどうかを判別するためには、このへんを考慮してあげないといかんということね。