summaryrefslogtreecommitdiff
path: root/sql/item_strfunc.h
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2016-12-01 11:57:01 +0400
committerAlexander Barkov <bar@mariadb.org>2016-12-16 18:33:54 +0400
commit69f80e5ecf8b2685a598e60320d4f0f05f492c22 (patch)
tree89d1b057a0d94a0beca81295c9fd3784ffa173e1 /sql/item_strfunc.h
parent9185f8d4a72e7e2001c29bf1502ce7dd4e782e98 (diff)
downloadmariadb-git-69f80e5ecf8b2685a598e60320d4f0f05f492c22.tar.gz
MDEV-11298 Split Item_func_hex::val_str_ascii() into virtual methods in Type_handler
Diffstat (limited to 'sql/item_strfunc.h')
-rw-r--r--sql/item_strfunc.h20
1 files changed, 18 insertions, 2 deletions
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index be23f45c286..50258c84daa 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -913,17 +913,33 @@ public:
class Item_func_hex :public Item_str_ascii_func
{
+protected:
String tmp_value;
+ /*
+ Calling arg[0]->type_handler() can be expensive on every row.
+ It's a virtual method, and in case if args[0] is a complex Item,
+ its type_handler() can call more virtual methods.
+ So let's cache it during fix_length_and_dec().
+ */
+ const Type_handler *m_arg0_type_handler;
public:
Item_func_hex(THD *thd, Item *a):
- Item_str_ascii_func(thd, a) {}
+ Item_str_ascii_func(thd, a), m_arg0_type_handler(NULL) {}
const char *func_name() const { return "hex"; }
- String *val_str_ascii(String *);
+ String *val_str_ascii_from_val_int(String *str);
+ String *val_str_ascii_from_val_real(String *str);
+ String *val_str_ascii_from_val_str(String *str);
+ String *val_str_ascii(String *str)
+ {
+ DBUG_ASSERT(fixed);
+ return m_arg0_type_handler->Item_func_hex_val_str_ascii(this, str);
+ }
void fix_length_and_dec()
{
collation.set(default_charset());
decimals=0;
fix_char_length(args[0]->max_length * 2);
+ m_arg0_type_handler= args[0]->type_handler();
}
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
{ return get_item_copy<Item_func_hex>(thd, mem_root, this); }