summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <ram@gw.mysql.r18.ru>2004-11-06 09:37:30 +0400
committerunknown <ram@gw.mysql.r18.ru>2004-11-06 09:37:30 +0400
commit3f07afbea005900c185a769ea23381f1bba0ef23 (patch)
tree324e143b46603ed4b13ab4f03ecb13557bb73a3a /sql
parentb38510ecd00abbfc99d7767d4b91c8d4d1cfbdc0 (diff)
downloadmariadb-git-3f07afbea005900c185a769ea23381f1bba0ef23.tar.gz
A fix (bug #6441: Aggregate UDF in multi-table query crashes MySQL when returning multiple rows).
sql/item_func.cc: A fix (bug #6441: Aggregate UDF in multi-table query crashes MySQL when returning multiple rows). Do nothing in the udf_handler destructor if not_original flag is set. sql/item_sum.h: A fix (bug #6441: Aggregate UDF in multi-table query crashes MySQL when returning multiple rows). Set udf.not_original flag if we create an Item from the existent one. sql/sql_udf.h: A fix (bug #6441: Aggregate UDF in multi-table query crashes MySQL when returning multiple rows). not_original flag added.
Diffstat (limited to 'sql')
-rw-r--r--sql/item_func.cc19
-rw-r--r--sql/item_sum.h2
-rw-r--r--sql/sql_udf.h3
3 files changed, 14 insertions, 10 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 09d7e50eaa3..32708ecb4ca 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1602,18 +1602,21 @@ longlong Item_func_bit_count::val_int()
udf_handler::~udf_handler()
{
- if (initialized)
+ if (!not_original)
{
- if (u_d->func_deinit != NULL)
+ if (initialized)
{
- void (*deinit)(UDF_INIT *) = (void (*)(UDF_INIT*))
- u_d->func_deinit;
- (*deinit)(&initid);
+ if (u_d->func_deinit != NULL)
+ {
+ void (*deinit)(UDF_INIT *) = (void (*)(UDF_INIT*))
+ u_d->func_deinit;
+ (*deinit)(&initid);
+ }
+ free_udf(u_d);
}
- free_udf(u_d);
+ if (buffers) // Because of bug in ecc
+ delete [] buffers;
}
- if (buffers) // Because of bug in ecc
- delete [] buffers;
}
diff --git a/sql/item_sum.h b/sql/item_sum.h
index 5aa0d37190b..74c28765f8d 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -532,7 +532,7 @@ public:
:Item_sum( list ), udf(udf_arg)
{ quick_group=0;}
Item_udf_sum(THD *thd, Item_udf_sum *item)
- :Item_sum(thd, item), udf(item->udf) {}
+ :Item_sum(thd, item), udf(item->udf) { udf.not_original= TRUE; }
const char *func_name() const { return udf.name(); }
bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
{
diff --git a/sql/sql_udf.h b/sql/sql_udf.h
index 7b10b80f148..d1f99a6d232 100644
--- a/sql/sql_udf.h
+++ b/sql/sql_udf.h
@@ -56,8 +56,9 @@ class udf_handler :public Sql_alloc
public:
table_map used_tables_cache;
bool const_item_cache;
+ bool not_original;
udf_handler(udf_func *udf_arg) :u_d(udf_arg), buffers(0), error(0),
- is_null(0), initialized(0)
+ is_null(0), initialized(0), not_original(0)
{}
~udf_handler();
const char *name() const { return u_d ? u_d->name.str : "?"; }