Loading sql/item.cc +20 −0 Original line number Diff line number Diff line Loading @@ -379,6 +379,12 @@ Item_field::Item_field(THD *thd, Field *f) orig_db_name= thd->strdup(db_name); orig_table_name= thd->strdup(table_name); orig_field_name= thd->strdup(field_name); /* We don't restore 'name' in cleanup because it's not changed during execution. Still we need it to point to persistent memory if this item is to be reused. */ name= (char*) orig_field_name; } set_field(f); } Loading Loading @@ -406,6 +412,20 @@ void Item_field::set_field(Field *field_par) fixed= 1; } /* Reset this item to point to a field from the new temporary table. This is used when we create a new temporary table for each execution of prepared statement. */ void Item_field::reset_field(Field *f) { set_field(f); /* 'name' is pointing at field->field_name of old field */ name= (char*) f->field_name; } const char *Item_ident::full_name() const { char *tmp; Loading sql/item.h +3 −2 Original line number Diff line number Diff line Loading @@ -348,6 +348,7 @@ class Item_ident :public Item class Item_field :public Item_ident { void set_field(Field *field); public: Field *field,*result_field; Loading @@ -369,7 +370,7 @@ class Item_field :public Item_ident /* If this constructor is used, fix_fields() won't work, because db_name, table_name and column_name are unknown. It's necessary to call set_field() before fix_fields() for all fields created this way. reset_field() before fix_fields() for all fields created this way. */ Item_field(Field *field); enum Type type() const { return FIELD_ITEM; } Loading @@ -381,7 +382,7 @@ class Item_field :public Item_ident longlong val_int_result(); String *str_result(String* tmp); bool send(Protocol *protocol, String *str_arg); void set_field(Field *field); void reset_field(Field *f); bool fix_fields(THD *, struct st_table_list *, Item **); void make_field(Send_field *tmp_field); int save_in_field(Field *field,bool no_conversions); Loading sql/sql_union.cc +1 −1 Original line number Diff line number Diff line Loading @@ -360,7 +360,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, { Item_field *item_field= (Item_field*) it++; DBUG_ASSERT(item_field); item_field->set_field(*field); item_field->reset_field(*field); } } } Loading Loading
sql/item.cc +20 −0 Original line number Diff line number Diff line Loading @@ -379,6 +379,12 @@ Item_field::Item_field(THD *thd, Field *f) orig_db_name= thd->strdup(db_name); orig_table_name= thd->strdup(table_name); orig_field_name= thd->strdup(field_name); /* We don't restore 'name' in cleanup because it's not changed during execution. Still we need it to point to persistent memory if this item is to be reused. */ name= (char*) orig_field_name; } set_field(f); } Loading Loading @@ -406,6 +412,20 @@ void Item_field::set_field(Field *field_par) fixed= 1; } /* Reset this item to point to a field from the new temporary table. This is used when we create a new temporary table for each execution of prepared statement. */ void Item_field::reset_field(Field *f) { set_field(f); /* 'name' is pointing at field->field_name of old field */ name= (char*) f->field_name; } const char *Item_ident::full_name() const { char *tmp; Loading
sql/item.h +3 −2 Original line number Diff line number Diff line Loading @@ -348,6 +348,7 @@ class Item_ident :public Item class Item_field :public Item_ident { void set_field(Field *field); public: Field *field,*result_field; Loading @@ -369,7 +370,7 @@ class Item_field :public Item_ident /* If this constructor is used, fix_fields() won't work, because db_name, table_name and column_name are unknown. It's necessary to call set_field() before fix_fields() for all fields created this way. reset_field() before fix_fields() for all fields created this way. */ Item_field(Field *field); enum Type type() const { return FIELD_ITEM; } Loading @@ -381,7 +382,7 @@ class Item_field :public Item_ident longlong val_int_result(); String *str_result(String* tmp); bool send(Protocol *protocol, String *str_arg); void set_field(Field *field); void reset_field(Field *f); bool fix_fields(THD *, struct st_table_list *, Item **); void make_field(Send_field *tmp_field); int save_in_field(Field *field,bool no_conversions); Loading
sql/sql_union.cc +1 −1 Original line number Diff line number Diff line Loading @@ -360,7 +360,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, { Item_field *item_field= (Item_field*) it++; DBUG_ASSERT(item_field); item_field->set_field(*field); item_field->reset_field(*field); } } } Loading