Commit 703e396b authored by konstantin@mysql.com's avatar konstantin@mysql.com

A small simplification: perform two actions at once, register a

change, and perform it (the new Item changes registry).
parent e08febea
...@@ -1332,13 +1332,11 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -1332,13 +1332,11 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
return -1; return -1;
} }
Item_ref *rf; Item_ref *rf= new Item_ref(last->ref_pointer_array + counter,
*ref= rf= new Item_ref(last->ref_pointer_array + counter, (char *)table_name, (char *)field_name);
(char *)table_name,
(char *)field_name);
thd->register_item_tree_change(ref, this, &thd->mem_root);
if (!rf) if (!rf)
return 1; return 1;
thd->change_item_tree(ref, rf);
/* /*
rf is Item_ref => never substitute other items (in this case) rf is Item_ref => never substitute other items (in this case)
during fix_fields() => we can use rf after fix_fields() during fix_fields() => we can use rf after fix_fields()
...@@ -1355,11 +1353,11 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -1355,11 +1353,11 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
if (last->having_fix_field) if (last->having_fix_field)
{ {
Item_ref *rf; Item_ref *rf;
thd->register_item_tree_change(ref, *ref, &thd->mem_root); rf= new Item_ref((where->db[0] ? where->db : 0),
*ref= rf= new Item_ref((where->db[0] ? where->db : 0), (char*) where->alias, (char*) field_name);
(char*) where->alias, (char*) field_name);
if (!rf) if (!rf)
return 1; return 1;
thd->change_item_tree(ref, rf);
/* /*
rf is Item_ref => never substitute other items (in this case) rf is Item_ref => never substitute other items (in this case)
during fix_fields() => we can use rf after fix_fields() during fix_fields() => we can use rf after fix_fields()
...@@ -1992,10 +1990,10 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) ...@@ -1992,10 +1990,10 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
else if (tmp != not_found_field) else if (tmp != not_found_field)
{ {
ref= 0; // To prevent "delete *ref;" on ~Item_ref() of this item ref= 0; // To prevent "delete *ref;" on ~Item_ref() of this item
Item_field* fld; Item_field* fld= new Item_field(tmp);
if (!((*reference)= fld= new Item_field(tmp))) if (!fld)
return 1; return 1;
thd->register_item_tree_change(reference, this, &thd->mem_root); thd->change_item_tree(reference, fld);
mark_as_dependent(thd, last, thd->lex->current_select, fld); mark_as_dependent(thd, last, thd->lex->current_select, fld);
return 0; return 0;
} }
...@@ -2250,10 +2248,7 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item) ...@@ -2250,10 +2248,7 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
new Item_real(name, result, decimals, length)); new Item_real(name, result, decimals, length));
} }
if (new_item) if (new_item)
{ thd->change_item_tree(ref, new_item);
thd->register_item_tree_change(ref, item, &thd->mem_root);
*ref= new_item;
}
} }
/* /*
......
...@@ -153,10 +153,7 @@ static bool convert_constant_item(THD *thd, Field *field, Item **item) ...@@ -153,10 +153,7 @@ static bool convert_constant_item(THD *thd, Field *field, Item **item)
{ {
Item *tmp=new Item_int_with_ref(field->val_int(), *item); Item *tmp=new Item_int_with_ref(field->val_int(), *item);
if (tmp) if (tmp)
{ thd->change_item_tree(item, tmp);
thd->register_item_tree_change(item, *item, &thd->mem_root);
*item=tmp;
}
return 1; // Item was replaced return 1; // Item was replaced
} }
} }
...@@ -2033,10 +2030,10 @@ void Item_cond::split_sum_func(THD *thd, Item **ref_pointer_array, ...@@ -2033,10 +2030,10 @@ void Item_cond::split_sum_func(THD *thd, Item **ref_pointer_array,
{ {
Item **ref= li.ref(); Item **ref= li.ref();
uint el= fields.elements; uint el= fields.elements;
Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name);
fields.push_front(item); fields.push_front(item);
ref_pointer_array[el]= item; ref_pointer_array[el]= item;
thd->register_item_tree_change(ref, *ref, &thd->mem_root); thd->change_item_tree(ref, new_item);
li.replace(new Item_ref(ref_pointer_array + el, 0, item->name));
} }
item->update_used_tables(); item->update_used_tables();
used_tables_cache|=item->used_tables(); used_tables_cache|=item->used_tables();
......
...@@ -269,10 +269,10 @@ void Item_func::split_sum_func(THD *thd, Item **ref_pointer_array, ...@@ -269,10 +269,10 @@ void Item_func::split_sum_func(THD *thd, Item **ref_pointer_array,
else if (item->used_tables() || item->type() == SUM_FUNC_ITEM) else if (item->used_tables() || item->type() == SUM_FUNC_ITEM)
{ {
uint el= fields.elements; uint el= fields.elements;
Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name);
fields.push_front(item); fields.push_front(item);
ref_pointer_array[el]= item; ref_pointer_array[el]= item;
thd->register_item_tree_change(arg, *arg, &thd->mem_root); thd->change_item_tree(arg, new_item);
*arg= new Item_ref(ref_pointer_array + el, 0, item->name);
} }
} }
} }
......
...@@ -95,10 +95,10 @@ void Item_row::split_sum_func(THD *thd, Item **ref_pointer_array, ...@@ -95,10 +95,10 @@ void Item_row::split_sum_func(THD *thd, Item **ref_pointer_array,
else if ((*arg)->used_tables() || (*arg)->type() == SUM_FUNC_ITEM) else if ((*arg)->used_tables() || (*arg)->type() == SUM_FUNC_ITEM)
{ {
uint el= fields.elements; uint el= fields.elements;
Item *new_item= new Item_ref(ref_pointer_array + el, 0, (*arg)->name);
fields.push_front(*arg); fields.push_front(*arg);
ref_pointer_array[el]= *arg; ref_pointer_array[el]= *arg;
thd->register_item_tree_change(arg, *arg, &thd->mem_root); thd->change_item_tree(arg, new_item);
*arg= new Item_ref(ref_pointer_array + el, 0, (*arg)->name);
} }
} }
} }
......
...@@ -643,10 +643,10 @@ void Item_func_concat_ws::split_sum_func(THD *thd, Item **ref_pointer_array, ...@@ -643,10 +643,10 @@ void Item_func_concat_ws::split_sum_func(THD *thd, Item **ref_pointer_array,
else if (separator->used_tables() || separator->type() == SUM_FUNC_ITEM) else if (separator->used_tables() || separator->type() == SUM_FUNC_ITEM)
{ {
uint el= fields.elements; uint el= fields.elements;
Item *new_item= new Item_ref(ref_pointer_array + el, 0, separator->name);
fields.push_front(separator); fields.push_front(separator);
ref_pointer_array[el]= separator; ref_pointer_array[el]= separator;
thd->register_item_tree_change(&separator, separator, &thd->mem_root); thd->change_item_tree(&separator, new_item);
separator= new Item_ref(ref_pointer_array + el, 0, separator->name);
} }
Item_str_func::split_sum_func(thd, ref_pointer_array, fields); Item_str_func::split_sum_func(thd, ref_pointer_array, fields);
} }
...@@ -1779,10 +1779,10 @@ void Item_func_make_set::split_sum_func(THD *thd, Item **ref_pointer_array, ...@@ -1779,10 +1779,10 @@ void Item_func_make_set::split_sum_func(THD *thd, Item **ref_pointer_array,
else if (item->used_tables() || item->type() == SUM_FUNC_ITEM) else if (item->used_tables() || item->type() == SUM_FUNC_ITEM)
{ {
uint el= fields.elements; uint el= fields.elements;
Item *new_item= new Item_ref(ref_pointer_array + el, 0, item->name);
fields.push_front(item); fields.push_front(item);
ref_pointer_array[el]= item; ref_pointer_array[el]= item;
thd->register_item_tree_change(&item, item, &thd->mem_root); thd->change_item_tree(&item, new_item);
item= new Item_ref(ref_pointer_array + el, 0, item->name);
} }
Item_str_func::split_sum_func(thd, ref_pointer_array, fields); Item_str_func::split_sum_func(thd, ref_pointer_array, fields);
} }
......
...@@ -1054,14 +1054,15 @@ public: ...@@ -1054,14 +1054,15 @@ public:
inline CHARSET_INFO *charset() { return variables.character_set_client; } inline CHARSET_INFO *charset() { return variables.character_set_client; }
void update_charset(); void update_charset();
void register_item_tree_change(Item **place, Item *old_value, void change_item_tree(Item **place, Item *new_value)
MEM_ROOT *runtime_memroot)
{ {
/* TODO: check for OOM condition here */
if (!current_arena->is_conventional_execution()) if (!current_arena->is_conventional_execution())
nocheck_register_item_tree_change(place, old_value, runtime_memroot); nocheck_register_item_tree_change(place, *place, &mem_root);
*place= new_value;
} }
void nocheck_register_item_tree_change(Item **place, Item *old_value, void nocheck_register_item_tree_change(Item **place, Item *old_value,
MEM_ROOT *runtime_memroot); MEM_ROOT *runtime_memroot);
void rollback_item_tree_changes(); void rollback_item_tree_changes();
}; };
......
...@@ -4203,8 +4203,7 @@ change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list, ...@@ -4203,8 +4203,7 @@ change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list,
Item *tmp=value->new_item(); Item *tmp=value->new_item();
if (tmp) if (tmp)
{ {
thd->register_item_tree_change(args + 1, args[1], &thd->mem_root); thd->change_item_tree(args + 1, tmp);
args[1]= tmp;
func->update_used_tables(); func->update_used_tables();
if ((functype == Item_func::EQ_FUNC || functype == Item_func::EQUAL_FUNC) if ((functype == Item_func::EQ_FUNC || functype == Item_func::EQUAL_FUNC)
&& and_father != cond && !left_item->const_item()) && and_father != cond && !left_item->const_item())
...@@ -4225,15 +4224,14 @@ change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list, ...@@ -4225,15 +4224,14 @@ change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list,
Item *tmp=value->new_item(); Item *tmp=value->new_item();
if (tmp) if (tmp)
{ {
thd->register_item_tree_change(args, args[0], &thd->mem_root); thd->change_item_tree(args, tmp);
args[0]= value= tmp; value= tmp;
func->update_used_tables(); func->update_used_tables();
if ((functype == Item_func::EQ_FUNC || functype == Item_func::EQUAL_FUNC) if ((functype == Item_func::EQ_FUNC || functype == Item_func::EQUAL_FUNC)
&& and_father != cond && !right_item->const_item()) && and_father != cond && !right_item->const_item())
{ {
args[0]= args[1]; // For easy check args[0]= args[1]; // For easy check
thd->register_item_tree_change(args + 1, args[1], &thd->mem_root); thd->change_item_tree(args + 1, value);
args[1]= value;
cond->marker=1; cond->marker=1;
COND_CMP *tmp2; COND_CMP *tmp2;
if ((tmp2=new COND_CMP(and_father,func))) if ((tmp2=new COND_CMP(and_father,func)))
...@@ -4959,8 +4957,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, ...@@ -4959,8 +4957,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
*blob_field++= new_field; *blob_field++= new_field;
blob_count++; blob_count++;
} }
thd->register_item_tree_change(argp, arg, &thd->mem_root); thd->change_item_tree(argp, new Item_field(new_field));
*argp= new Item_field(new_field);
if (!(new_field->flags & NOT_NULL_FLAG)) if (!(new_field->flags & NOT_NULL_FLAG))
{ {
null_count++; null_count++;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment