diff options
author | dlenev@brandersnatch.localdomain <> | 2004-03-31 21:25:55 +0400 |
---|---|---|
committer | dlenev@brandersnatch.localdomain <> | 2004-03-31 21:25:55 +0400 |
commit | 4122188cc2d3ce836f88681fc5e0d41cacfda3f9 (patch) | |
tree | 526682a26c471951e15c895db2723ad065b5690c /sql/item.cc | |
parent | 9e28b7698d487f188c8669d5b7918fca1d750753 (diff) | |
download | mariadb-git-4122188cc2d3ce836f88681fc5e0d41cacfda3f9.tar.gz |
Fix for Bug #3307 "FLUSH TABLES sometimes breaks prepared statement
table resolution".
Added members to Item_ident for storing original db, table and field
names since those that set later from Field have shorter life-time
than required by prep. stmt. So we need to restore original names in
Item_ident::cleanup(). Also now using special construnctor for creation
of Item_field from Field object that ensures that table and field name
have big enough life-time.
"Fix" for bug #2050 "10 to 1 performance drop with server 4.1.1"
Clean ups in implementation of caching of field number in table.
Added caching of table in which field is found in find_field_in_tables().
Diffstat (limited to 'sql/item.cc')
-rw-r--r-- | sql/item.cc | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/sql/item.cc b/sql/item.cc index a919dc4c133..b4aa87cd4df 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -103,9 +103,12 @@ void Item::print_item_w_name(String *str) Item_ident::Item_ident(const char *db_name_par,const char *table_name_par, const char *field_name_par) - :changed_during_fix_field(0), db_name(db_name_par), - table_name(table_name_par), field_name(field_name_par), - cached_field_index(-1), depended_from(0) + : + orig_db_name(db_name_par), orig_table_name(table_name_par), + orig_field_name(field_name_par), changed_during_fix_field(0), + db_name(db_name_par), table_name(table_name_par), + field_name(field_name_par), cached_field_index(NO_CACHED_FIELD_INDEX), + cached_table(0), depended_from(0) { name = (char*) field_name_par; } @@ -113,11 +116,15 @@ Item_ident::Item_ident(const char *db_name_par,const char *table_name_par, // Constructor used by Item_field & Item_ref (see Item comment) Item_ident::Item_ident(THD *thd, Item_ident *item) :Item(thd, item), + orig_db_name(item->orig_db_name), + orig_table_name(item->orig_table_name), + orig_field_name(item->orig_field_name), changed_during_fix_field(0), db_name(item->db_name), table_name(item->table_name), field_name(item->field_name), cached_field_index(item->cached_field_index), + cached_table(item->cached_table), depended_from(item->depended_from) {} @@ -129,6 +136,9 @@ void Item_ident::cleanup() *changed_during_fix_field= this; changed_during_fix_field= 0; } + db_name= orig_db_name; + table_name= orig_table_name; + field_name= orig_field_name; } bool Item_ident::remove_dependence_processor(byte * arg) @@ -310,6 +320,15 @@ Item_field::Item_field(Field *f) fixed= 1; } +Item_field::Item_field(THD *thd, Field *f) + :Item_ident(NullS, thd->strdup(f->table_name), + thd->strdup(f->field_name)) +{ + set_field(f); + collation.set(DERIVATION_IMPLICIT); + fixed= 1; +} + // Constructor need to process subselect with temporary tables (see Item) Item_field::Item_field(THD *thd, Item_field *item) :Item_ident(thd, item), |