diff options
author | Alexander Barkov <bar@mariadb.org> | 2016-12-01 11:57:01 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2016-12-16 18:33:54 +0400 |
commit | 69f80e5ecf8b2685a598e60320d4f0f05f492c22 (patch) | |
tree | 89d1b057a0d94a0beca81295c9fd3784ffa173e1 /sql/item_strfunc.h | |
parent | 9185f8d4a72e7e2001c29bf1502ce7dd4e782e98 (diff) | |
download | mariadb-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.h | 20 |
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); } |