summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2019-10-10 22:19:53 +0400
committerAlexander Barkov <bar@mariadb.com>2019-10-10 22:19:53 +0400
commit5e17b1f7cbfc256850ed139a0a4898040e16ff60 (patch)
tree23a2ca0da556bccef315b71a42ba419bdcfd2f08
parentf5833a4e4507454a4f70510c97e6e75a709c5722 (diff)
downloadmariadb-git-5e17b1f7cbfc256850ed139a0a4898040e16ff60.tar.gz
A small cleanup for MDEV-16309 Split ::create_tmp_field() into virtual methods in Item
These two methods: - Item_result_field::create_tmp_field_ex() - Item_func_user_var::create_tmp_field_ex() had duplicate code, except that they used a different type handler. Adding a protected method Item_result_field::create_tmp_field_ex_from_handler() with a "const Type_handler*" parameter, and reusing it from the two mentioned methods.
-rw-r--r--sql/item.h12
-rw-r--r--sql/item_func.h7
-rw-r--r--sql/sql_select.cc30
3 files changed, 28 insertions, 21 deletions
diff --git a/sql/item.h b/sql/item.h
index 022a14585c3..880d4ec0d27 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -3169,6 +3169,11 @@ class st_select_lex;
class Item_result_field :public Item_fixed_hybrid /* Item with result field */
{
+protected:
+ Field *create_tmp_field_ex_from_handler(MEM_ROOT *root, TABLE *table,
+ Tmp_field_src *src,
+ const Tmp_field_param *param,
+ const Type_handler *h);
public:
Field *result_field; /* Save result here */
Item_result_field(THD *thd): Item_fixed_hybrid(thd), result_field(0) {}
@@ -3179,7 +3184,12 @@ public:
~Item_result_field() {} /* Required with gcc 2.95 */
Field *get_tmp_table_field() { return result_field; }
Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src,
- const Tmp_field_param *param);
+ const Tmp_field_param *param)
+ {
+ DBUG_ASSERT(fixed);
+ const Type_handler *h= type_handler()->type_handler_for_tmp_table(this);
+ return create_tmp_field_ex_from_handler(root, table, src, param, h);
+ }
void get_tmp_field_src(Tmp_field_src *src, const Tmp_field_param *param);
/*
This implementation of used_tables() used by Item_avg_field and
diff --git a/sql/item_func.h b/sql/item_func.h
index 6226b741e91..0f10e4b94e2 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -2732,7 +2732,12 @@ public:
:Item_hybrid_func(thd, item),
m_var_entry(item->m_var_entry), name(item->name) { }
Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src,
- const Tmp_field_param *param);
+ const Tmp_field_param *param)
+ {
+ DBUG_ASSERT(fixed);
+ return create_tmp_field_ex_from_handler(root, table, src, param,
+ type_handler());
+ }
Field *create_field_for_create_select(MEM_ROOT *root, TABLE *table)
{ return create_table_field_from_handler(root, table); }
bool check_vcol_func_processor(void *arg);
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 6cc87ddcbb5..23de18d0d17 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -17740,9 +17740,13 @@ void Item_result_field::get_tmp_field_src(Tmp_field_src *src,
}
-Field *Item_result_field::create_tmp_field_ex(MEM_ROOT *root, TABLE *table,
- Tmp_field_src *src,
- const Tmp_field_param *param)
+Field *
+Item_result_field::create_tmp_field_ex_from_handler(
+ MEM_ROOT *root,
+ TABLE *table,
+ Tmp_field_src *src,
+ const Tmp_field_param *param,
+ const Type_handler *h)
{
/*
Possible Item types:
@@ -17750,26 +17754,14 @@ Field *Item_result_field::create_tmp_field_ex(MEM_ROOT *root, TABLE *table,
- Item_func
- Item_subselect
*/
+ DBUG_ASSERT(fixed);
DBUG_ASSERT(is_result_field());
DBUG_ASSERT(type() != NULL_ITEM);
get_tmp_field_src(src, param);
Field *result;
- if ((result= tmp_table_field_from_field_type(root, table)) &&
- param->modify_item())
- result_field= result;
- return result;
-}
-
-
-Field *Item_func_user_var::create_tmp_field_ex(MEM_ROOT *root, TABLE *table,
- Tmp_field_src *src,
- const Tmp_field_param *param)
-{
- DBUG_ASSERT(is_result_field());
- DBUG_ASSERT(type() != NULL_ITEM);
- get_tmp_field_src(src, param);
- Field *result;
- if ((result= create_table_field_from_handler(root, table)) &&
+ if ((result= h->make_and_init_table_field(root, &name,
+ Record_addr(maybe_null),
+ *this, table)) &&
param->modify_item())
result_field= result;
return result;