Commit 6a931667 authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/home/dlenev/src/mysql-4.1-tzfix

parents 4ff9b605 1cd249e0
...@@ -379,6 +379,12 @@ Item_field::Item_field(THD *thd, Field *f) ...@@ -379,6 +379,12 @@ Item_field::Item_field(THD *thd, Field *f)
orig_db_name= thd->strdup(db_name); orig_db_name= thd->strdup(db_name);
orig_table_name= thd->strdup(table_name); orig_table_name= thd->strdup(table_name);
orig_field_name= thd->strdup(field_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); set_field(f);
} }
...@@ -406,6 +412,20 @@ void Item_field::set_field(Field *field_par) ...@@ -406,6 +412,20 @@ void Item_field::set_field(Field *field_par)
fixed= 1; 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 const char *Item_ident::full_name() const
{ {
char *tmp; char *tmp;
......
...@@ -348,6 +348,7 @@ class Item_ident :public Item ...@@ -348,6 +348,7 @@ class Item_ident :public Item
class Item_field :public Item_ident class Item_field :public Item_ident
{ {
void set_field(Field *field);
public: public:
Field *field,*result_field; Field *field,*result_field;
...@@ -369,7 +370,7 @@ class Item_field :public Item_ident ...@@ -369,7 +370,7 @@ class Item_field :public Item_ident
/* /*
If this constructor is used, fix_fields() won't work, because 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 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); Item_field(Field *field);
enum Type type() const { return FIELD_ITEM; } enum Type type() const { return FIELD_ITEM; }
...@@ -381,7 +382,7 @@ class Item_field :public Item_ident ...@@ -381,7 +382,7 @@ class Item_field :public Item_ident
longlong val_int_result(); longlong val_int_result();
String *str_result(String* tmp); String *str_result(String* tmp);
bool send(Protocol *protocol, String *str_arg); 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 **); bool fix_fields(THD *, struct st_table_list *, Item **);
void make_field(Send_field *tmp_field); void make_field(Send_field *tmp_field);
int save_in_field(Field *field,bool no_conversions); int save_in_field(Field *field,bool no_conversions);
......
...@@ -360,7 +360,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result, ...@@ -360,7 +360,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
{ {
Item_field *item_field= (Item_field*) it++; Item_field *item_field= (Item_field*) it++;
DBUG_ASSERT(item_field); DBUG_ASSERT(item_field);
item_field->set_field(*field); item_field->reset_field(*field);
} }
} }
} }
......
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