Item::val_str(String *str)について
コメントがたっぷり書いてあったので訳してみました。
概要
virtual String *val_str(String *str)=0;
このItemオブジェクトの文字列表現を返す。
引数strは割り当て済みのバッファ。このItemオブジェクトあるいは入れ子のItemオブジェクトはこのメソッドの戻り値を格納するために使用することができる。
注釈
引数で渡されたバッファはItemオブジェクト自身がStringバッファを所有していない場合にのみ使用されるべきである。もしItemオブジェクト自身がStringバッファを所有しているのなら、mallocやmemcpyを行う回数を最小化するために、そのStringバッファを戻り値として返すのが好ましい。
このメソッドの呼び出し元は戻り値のStringを修正することができるが、それは文字列がheapに割り当てられている場合(is_alloced()がtrueを返す)にのみに限定される。これによりメソッドの呼び出し元は、入れ子のItemによって割り当てられたバッファを利用することにより自分自身がバッファの割り当てを行うことなしに、効率的にバッファを使うことができる。val_str関数の引数として与えられたバッファは呼び出し元に所属し、その後さらに利用されるかは呼び出し元の選択次第である。
上記の補足
- あなたのバッファを指すが管理は行わないような文字列を返さない限り、Stringは修正可能。(※訳注:ちょっと意味不明)
- 動的に割り当てられたStringではない限り(is_alloced()がfalseを返さない限り)、呼び出し元はcharsetを変更できる。(Item_func_{typecast/binary}を参照。XXX: これはバグ?)
- 可能であれば極力、データのコピーを最小化し、内部のオブジェクトを返すべき。
戻り値
NULL値が0を返す場合(NULLポインタ)、null_valueフラグをTRUEに設定すること。戻り値がnullではない場合、null_valueフラグはFALSEに再設定される。
ついでにStringクラスのコンストラクタ一覧
String(); String(uint32 length_arg); String(const char *str, CHARSET_INFO *cs); String(const char *str,uint32 len, CHARSET_INFO *cs); String(char *str,uint32 len, CHARSET_INFO *cs); String(const String &str);