diff options
-rw-r--r-- | sql/item.cc | 19 | ||||
-rw-r--r-- | sql/item.h | 54 | ||||
-rw-r--r-- | sql/sp_head.cc | 37 | ||||
-rw-r--r-- | sql/sp_rcontext.cc | 14 |
4 files changed, 24 insertions, 100 deletions
diff --git a/sql/item.cc b/sql/item.cc index aacf2f8cbdd..f105d97bec2 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -307,14 +307,8 @@ Item::Item(): /* Put item in free list so that we can free all items at end */ THD *thd= current_thd; - - if (reused) - next= reuse_next; - else - { - next= thd->free_list; - thd->free_list= this; - } + next= thd->free_list; + thd->free_list= this; /* Item constructor can be called during execution other then SQL_COM command => we should check thd->lex->current_select on zero (thd->lex @@ -349,13 +343,8 @@ Item::Item(THD *thd, Item *item): fixed(item->fixed), collation(item->collation) { - if (reused) - next= reuse_next; - else - { - next= thd->free_list; // Put in free list - thd->free_list= this; - } + next= thd->free_list; // Put in free list + thd->free_list= this; } diff --git a/sql/item.h b/sql/item.h index cd3e86aecd3..2bcc9482f4e 100644 --- a/sql/item.h +++ b/sql/item.h @@ -229,59 +229,9 @@ class Item { Item(const Item &); /* Prevent use of these */ void operator=(Item &); public: - /* For SP reuse mechanism */ - bool reused; - size_t reuse_slot_size; - Item *reuse_next; - - static void *operator new(size_t size) - { - Item *me= (Item *)sql_alloc((uint) size); - - if (me) - { - me->reuse_slot_size= size; - me->reused= FALSE; - } - return (void*)me; - } + static void *operator new(size_t size) {return (void*) sql_alloc((uint) size); } static void *operator new(size_t size, MEM_ROOT *mem_root) - { - Item *me= (Item *)alloc_root(mem_root, (uint) size); - - if (me) - { - me->reuse_slot_size= size; - me->reused= FALSE; - } - return (void*)me; - } - static void *operator new(size_t size, MEM_ROOT *mem_root, Item *reuse) - { - Item *me; - - if (!reuse || size > reuse->reuse_slot_size) - { - me= (Item *)alloc_root(mem_root, (uint) size); - if (me) - { - me->reuse_slot_size= size; - me->reused= FALSE; - } - } - else - { /* Reuse old item */ - size_t slot_size= reuse->reuse_slot_size; - - reuse->delete_self(); - me= reuse; - me->reuse_slot_size= slot_size; - /* For the constructor */ - me->reuse_next= reuse->next; - me->reused= TRUE; - } - return (void *)me; - } + { return (void*) alloc_root(mem_root, (uint) size); } static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); } static void operator delete(void *ptr, MEM_ROOT *mem_root) {} diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 0424f6caa9f..ca2ec6d0acf 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -131,9 +131,7 @@ sp_prepare_func_item(THD* thd, Item **it_addr) ** if nothing else. */ Item * -sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, - MEM_ROOT *mem_root, - Item *reuse) +sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type) { DBUG_ENTER("sp_eval_func_item"); Item *it= sp_prepare_func_item(thd, it_addr); @@ -146,7 +144,7 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, /* QQ How do we do this? Is there some better way? */ if (type == MYSQL_TYPE_NULL) - it= new(mem_root, reuse) Item_null(); + it= new Item_null(); else { switch (sp_map_result_type(type)) { @@ -157,12 +155,12 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, if (it->null_value) { DBUG_PRINT("info", ("INT_RESULT: null")); - it= new(mem_root, reuse) Item_null(); + it= new Item_null(); } else { DBUG_PRINT("info", ("INT_RESULT: %d", i)); - it= new(mem_root, reuse) Item_int(i); + it= new Item_int(i); } break; } @@ -173,7 +171,7 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, if (it->null_value) { DBUG_PRINT("info", ("REAL_RESULT: null")); - it= new(mem_root, reuse) Item_null(); + it= new Item_null(); } else { @@ -182,7 +180,7 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, uint8 decimals= it->decimals; uint32 max_length= it->max_length; DBUG_PRINT("info", ("REAL_RESULT: %g", d)); - it= new(mem_root, reuse) Item_float(d); + it= new Item_float(d); it->decimals= decimals; it->max_length= max_length; } @@ -192,9 +190,9 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, { my_decimal value, *val= it->val_decimal(&value); if (it->null_value) - it= new(mem_root, reuse) Item_null(); + it= new Item_null(); else - it= new(mem_root, reuse) Item_decimal(val); + it= new Item_decimal(val); #ifndef DBUG_OFF char dbug_buff[DECIMAL_MAX_STR_LENGTH+1]; DBUG_PRINT("info", ("DECIMAL_RESULT: %s", dbug_decimal_as_string(dbug_buff, val))); @@ -210,16 +208,14 @@ sp_eval_func_item(THD *thd, Item **it_addr, enum enum_field_types type, if (it->null_value) { DBUG_PRINT("info", ("default result: null")); - it= new(mem_root, reuse) Item_null(); + it= new Item_null(); } else { DBUG_PRINT("info",("default result: %*s", s->length(), s->c_ptr_quick())); - it= new(mem_root, reuse) Item_string(thd->strmake(s->ptr(), - s->length()), - s->length(), - it->collation.collation); + it= new Item_string(thd->strmake(s->ptr(), s->length()), + s->length(), it->collation.collation); } break; } @@ -712,7 +708,7 @@ sp_head::execute_function(THD *thd, Item **argp, uint argcount, Item **resp) for (i= 0 ; i < params && i < argcount ; i++) { sp_pvar_t *pvar = m_pcont->find_pvar(i); - Item *it= sp_eval_func_item(thd, argp++, pvar->type, thd->mem_root, NULL); + Item *it= sp_eval_func_item(thd, argp++, pvar->type); if (it) nctx->push_item(it); @@ -827,8 +823,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args) } else { - Item *it2= sp_eval_func_item(thd, li.ref(), pvar->type, - thd->mem_root, NULL); + Item *it2= sp_eval_func_item(thd, li.ref(), pvar->type); if (it2) nctx->push_item(it2); // IN or INOUT @@ -1474,9 +1469,7 @@ sp_instr_set::exec_core(THD *thd, uint *nextp) Item *it; int res; - it= sp_eval_func_item(thd, &m_value, m_type, - thd->mem_root, - thd->spcont->get_item(m_offset)); + it= sp_eval_func_item(thd, &m_value, m_type); if (! it) res= -1; else @@ -1722,7 +1715,7 @@ sp_instr_freturn::exec_core(THD *thd, uint *nextp) Item *it; int res; - it= sp_eval_func_item(thd, &m_value, m_type, thd->mem_root, NULL); + it= sp_eval_func_item(thd, &m_value, m_type); if (! it) res= -1; else diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index fdffa7fb88d..672491a97f2 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -43,11 +43,8 @@ sp_rcontext::sp_rcontext(uint fsize, uint hmax, uint cmax) int sp_rcontext::set_item_eval(uint idx, Item **item_addr, enum_field_types type) { - extern Item *sp_eval_func_item(THD *thd, Item **it, enum_field_types type, - MEM_ROOT *mem_root, - Item *reuse); - THD *thd= current_thd; - Item *it= sp_eval_func_item(thd, item_addr, type, thd->mem_root, NULL); + extern Item *sp_eval_func_item(THD *thd, Item **it, enum_field_types type); + Item *it= sp_eval_func_item(current_thd, item_addr, type); if (! it) return -1; @@ -114,12 +111,7 @@ void sp_rcontext::save_variables(uint fp) { while (fp < m_count) - { - Item *it= m_frame[fp]; - - m_frame[fp++]= NULL; // Prevent reuse - m_saved.push_front(it); - } + m_saved.push_front(m_frame[fp++]); } void |