summaryrefslogtreecommitdiff
path: root/sql/item.h
diff options
context:
space:
mode:
authorhf@deer.(none) <>2003-12-30 14:08:19 +0400
committerhf@deer.(none) <>2003-12-30 14:08:19 +0400
commitbfe134b86fad8eaa46196c8283cc91e6c77769b0 (patch)
tree2ae6e41d1324a906e2f8a6868b34fe75950e736f /sql/item.h
parent1547a03c797fa547f1664d9c56a313daf62972bc (diff)
downloadmariadb-git-bfe134b86fad8eaa46196c8283cc91e6c77769b0.tar.gz
Fix for prepared statements
Here i added Item_*::cleanup() functions, removed a lot of ~Item_*'s, added code to restore order_list and group_list
Diffstat (limited to 'sql/item.h')
-rw-r--r--sql/item.h35
1 files changed, 22 insertions, 13 deletions
diff --git a/sql/item.h b/sql/item.h
index 5def1e2b710..e1318224498 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -290,6 +290,7 @@ public:
bool get_time(TIME *ltime);
bool is_null() { return field->is_null(); }
Item *get_tmp_table_item(THD *thd);
+ void cleanup();
friend class Item_default_value;
friend class Item_insert_value;
};
@@ -498,7 +499,6 @@ public:
set_name(name_par,0,cs);
decimals=NOT_FIXED_DEC;
}
- ~Item_string() {}
enum Type type() const { return STRING_ITEM; }
double val()
{
@@ -565,7 +565,6 @@ class Item_varbinary :public Item
{
public:
Item_varbinary(const char *str,uint str_length);
- ~Item_varbinary() {}
enum Type type() const { return VARBIN_ITEM; }
double val() { return (double) Item_varbinary::val_int(); }
longlong val_int();
@@ -602,20 +601,25 @@ public:
class Item_ref :public Item_ident
{
public:
- Field *result_field; /* Save result here */
+ Field *result_field; /* Save result here */
Item **ref;
- Item_ref(const char *db_par, const char *table_name_par,
- const char *field_name_par)
- :Item_ident(db_par,table_name_par,field_name_par),ref(0) {}
- Item_ref(Item **item, const char *table_name_par, const char *field_name_par)
- :Item_ident(NullS,table_name_par,field_name_par),ref(item) {}
+ Item **hook_ptr; /* These two to restore */
+ Item *orig_item; /* things in 'cleanup()' */
+ Item_ref(Item **hook, Item *original,const char *db_par,
+ const char *table_name_par, const char *field_name_par)
+ :Item_ident(db_par,table_name_par,field_name_par),ref(0), hook_ptr(hook),
+ orig_item(original) {}
+ Item_ref(Item **item, Item **hook,
+ const char *table_name_par, const char *field_name_par)
+ :Item_ident(NullS,table_name_par,field_name_par),
+ ref(item), hook_ptr(hook), orig_item(hook ? *hook:0) {}
// Constructor need to process subselect with temporary tables (see Item)
- Item_ref(THD *thd, Item_ref &item)
- :Item_ident(thd, item), ref(item.ref) {}
+ Item_ref(THD *thd, Item_ref &item, Item **hook)
+ :Item_ident(thd, item), ref(item.ref),
+ hook_ptr(hook), orig_item(hook ? *hook : 0) {}
enum Type type() const { return REF_ITEM; }
bool eq(const Item *item, bool binary_cmp) const
{ return ref && (*ref)->eq(item, binary_cmp); }
- ~Item_ref() { if (ref && (*ref) && (*ref) != this) delete *ref; }
double val()
{
double tmp=(*ref)->val_result();
@@ -660,6 +664,7 @@ public:
}
Item *real_item() { return *ref; }
void print(String *str);
+ void cleanup();
};
class Item_in_subselect;
@@ -670,7 +675,7 @@ protected:
public:
Item_ref_null_helper(Item_in_subselect* master, Item **item,
const char *table_name_par, const char *field_name_par):
- Item_ref(item, table_name_par, field_name_par), owner(master) {}
+ Item_ref(item, NULL, table_name_par, field_name_par), owner(master) {}
double val();
longlong val_int();
String* val_str(String* s);
@@ -734,7 +739,6 @@ public:
name=item->name;
cached_field_type= item->field_type();
}
- ~Item_copy_string() { delete item; }
enum Type type() const { return COPY_STR_ITEM; }
enum Item_result result_type () const { return STRING_RESULT; }
enum_field_types field_type() const { return cached_field_type; }
@@ -982,6 +986,11 @@ public:
bool check_cols(uint c);
bool null_inside();
void bring_value();
+ void cleanup()
+ {
+ Item_cache::cleanup();
+ values= 0;
+ }
};