diff options
-rw-r--r-- | sql/item.h | 12 | ||||
-rw-r--r-- | sql/item_func.h | 7 | ||||
-rw-r--r-- | sql/sql_select.cc | 30 |
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; |