Under term of this tasks we'll remove switch(cmp_type()) in Item_func_hybrid_field_type::val_xxx() and Item_func_hybrid_field_type::get_date() and introduce instead new methods in Type_handler, e.g.:
class Type_handler
|
{
|
...
|
virtual
|
String *Item_func_hybrid_field_type_val_str(Item_func_hybrid_field_type *,
|
String *) const= 0;};
|
}
|
The methods Item_func_hybrid_field_type::val_xxx() and Item_func_hybrid_field_type::get_date() will call the corresponding new methods in Type_handler:
class Item_func_hybrid_field_type: public Item_hybrid_func
|
{
|
...
|
String *val_str(String*str)
|
{
|
return Item_func_hybrid_field_type::type_handler()->
|
Item_func_hybrid_field_type_val_str(this, str);
|
}
|
...
|
}
|
For performance purposes, the change should try not to introduce new virtual calls.
One virtual call in switch(cmp_type()) should be replaced to one virtual call in Type_handler.
Calls inside the new methods in Type_handler should be done statically.