文字列系組込みSQL関数(Native関数)の引数
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関数仕様に則った型かどうかを判別するためには、このへんを考慮してあげないといかんということね。