summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhf@deer.(none) <>2004-01-20 20:55:47 +0400
committerhf@deer.(none) <>2004-01-20 20:55:47 +0400
commit37abf689ecedcc377370697bb13a570d6d8c392e (patch)
tree38b07f5cc9271b9d99a946af98e1ce00eeaaa2e9
parent7dda8c102f88de1578e343d508374b60b0cfe5fa (diff)
downloadmariadb-git-37abf689ecedcc377370697bb13a570d6d8c392e.tar.gz
Pack of changes about 'cleanup()'-s
Some errorneous code trimmed
-rw-r--r--sql/item.cc3
-rw-r--r--sql/item.h13
-rw-r--r--sql/item_row.h10
-rw-r--r--sql/item_sum.cc1
-rw-r--r--sql/item_sum.h6
-rw-r--r--sql/sql_parse.cc2
6 files changed, 19 insertions, 16 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 72c5ac3fd55..09328dfbf07 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -2024,7 +2024,8 @@ void Item_cache_row::bring_value()
Item_type_holder::Item_type_holder(THD *thd, Item *item)
- :Item(thd, item), item_type(item->result_type())
+ :Item(thd, item), item_type(item->result_type()),
+ orig_type(item_type)
{
DBUG_ASSERT(item->fixed);
diff --git a/sql/item.h b/sql/item.h
index e9d34568350..d06977f555e 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -125,7 +125,7 @@ public:
optimisation changes in prepared statements
*/
Item(THD *thd, Item *item);
- virtual ~Item() { name=0; cleanup(); } /*lint -e1509 */
+ virtual ~Item() { name=0; } /*lint -e1509 */
void set_name(const char *str,uint length, CHARSET_INFO *cs);
void init_make_field(Send_field *tmp_field,enum enum_field_types type);
virtual void cleanup() { fixed=0; }
@@ -227,6 +227,11 @@ public:
/* Used in sql_select.cc:eliminate_not_funcs() */
virtual Item *neg_transformer() { return NULL; }
+ void delete_self()
+ {
+ cleanup();
+ delete this;
+ }
};
@@ -1003,6 +1008,7 @@ class Item_type_holder: public Item
{
protected:
Item_result item_type;
+ Item_result orig_type;
Field *field_example;
public:
Item_type_holder(THD*, Item*);
@@ -1014,6 +1020,11 @@ public:
String *val_str(String*);
bool join_types(THD *thd, Item *);
Field *example() { return field_example; }
+ void cleanup()
+ {
+ Item::cleanup();
+ item_type= orig_type;
+ }
};
diff --git a/sql/item_row.h b/sql/item_row.h
index 1b792f981fd..f87b4f66e80 100644
--- a/sql/item_row.h
+++ b/sql/item_row.h
@@ -34,16 +34,6 @@ public:
with_null(0)
{}
- void cleanup()
- {
- if (array_holder && items)
- {
- sql_element_free(items);
- items= 0;
- array_holder= 0;
- }
- }
-
enum Type type() const { return ROW_ITEM; };
void illegal_method_call(const char *);
bool is_null() { return null_value; }
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index 7c2d5501c06..e01f9db3463 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -1097,6 +1097,7 @@ void Item_sum_count_distinct::cleanup()
if (use_tree)
delete_tree(tree);
table= 0;
+ use_tree= 0;
}
}
diff --git a/sql/item_sum.h b/sql/item_sum.h
index 9f1c8a09a4e..dc84e4d4ab7 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -610,7 +610,7 @@ class Item_sum_udf_float :public Item_sum_num
public:
Item_sum_udf_float(udf_func *udf_arg) :Item_sum_num() {}
Item_sum_udf_float(udf_func *udf_arg, List<Item> &list) :Item_sum_num() {}
- Item_sum_udf_float(THD *thd, Item_sum_udf_float &item)
+ Item_sum_udf_float(THD *thd, Item_sum_udf_float *item)
:Item_sum_num(thd, item) {}
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
double val() { return 0.0; }
@@ -625,7 +625,7 @@ class Item_sum_udf_int :public Item_sum_num
public:
Item_sum_udf_int(udf_func *udf_arg) :Item_sum_num() {}
Item_sum_udf_int(udf_func *udf_arg, List<Item> &list) :Item_sum_num() {}
- Item_sum_udf_int(THD *thd, Item_sum_udf_int &item)
+ Item_sum_udf_int(THD *thd, Item_sum_udf_int *item)
:Item_sum_num(thd, item) {}
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
longlong val_int() { return 0; }
@@ -641,7 +641,7 @@ class Item_sum_udf_str :public Item_sum_num
public:
Item_sum_udf_str(udf_func *udf_arg) :Item_sum_num() {}
Item_sum_udf_str(udf_func *udf_arg, List<Item> &list) :Item_sum_num() {}
- Item_sum_udf_str(THD *thd, Item_sum_udf_str &item)
+ Item_sum_udf_str(THD *thd, Item_sum_udf_str *item)
:Item_sum_num(thd, item) {}
String *val_str(String *) { null_value=1; return 0; }
double val() { null_value=1; return 0.0; }
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index de75ed301e5..7929247676f 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1109,7 +1109,7 @@ end:
void free_items(Item *item)
{
for (; item ; item=item->next)
- delete item;
+ item->delete_self();
}
/* This works because items are allocated with sql_alloc() */