Fix for Bug #9913 "udf_deinit is not called after execution of PS"
(aka "deinit is not called when calling udf from trigger"). We should call udf_deinit() function during cleanup phase after prepared (or ordinary) statement execution instead of calling it from Item's desctructor. No test case is provided since it is hard to test UDF's from our test suite.
This commit is contained in:
parent
0fc5a1678c
commit
8ee6d33bdd
@ -1617,6 +1617,13 @@ longlong Item_func_bit_count::val_int()
|
|||||||
#ifdef HAVE_DLOPEN
|
#ifdef HAVE_DLOPEN
|
||||||
|
|
||||||
udf_handler::~udf_handler()
|
udf_handler::~udf_handler()
|
||||||
|
{
|
||||||
|
/* Everything should be properly cleaned up by this moment. */
|
||||||
|
DBUG_ASSERT(not_original || !(initialized || buffers));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void udf_handler::cleanup()
|
||||||
{
|
{
|
||||||
if (!not_original)
|
if (!not_original)
|
||||||
{
|
{
|
||||||
@ -1629,9 +1636,11 @@ udf_handler::~udf_handler()
|
|||||||
(*deinit)(&initid);
|
(*deinit)(&initid);
|
||||||
}
|
}
|
||||||
free_udf(u_d);
|
free_udf(u_d);
|
||||||
|
initialized= FALSE;
|
||||||
}
|
}
|
||||||
if (buffers) // Because of bug in ecc
|
if (buffers) // Because of bug in ecc
|
||||||
delete [] buffers;
|
delete [] buffers;
|
||||||
|
buffers= 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1871,6 +1880,12 @@ String *udf_handler::val_str(String *str,String *save_str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Item_udf_func::cleanup()
|
||||||
|
{
|
||||||
|
udf.cleanup();
|
||||||
|
Item_func::cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
double Item_func_udf_float::val()
|
double Item_func_udf_float::val()
|
||||||
{
|
{
|
||||||
|
@ -786,6 +786,7 @@ public:
|
|||||||
fixed= 1;
|
fixed= 1;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
void cleanup();
|
||||||
Item_result result_type () const { return udf.result_type(); }
|
Item_result result_type () const { return udf.result_type(); }
|
||||||
table_map not_null_tables() const { return 0; }
|
table_map not_null_tables() const { return 0; }
|
||||||
};
|
};
|
||||||
|
@ -1449,6 +1449,17 @@ bool Item_udf_sum::add()
|
|||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Item_udf_sum::cleanup()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
udf_handler::cleanup() nicely handles case when we have not
|
||||||
|
original item but one created by copy_or_same() method.
|
||||||
|
*/
|
||||||
|
udf.cleanup();
|
||||||
|
Item_sum::cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Item *Item_sum_udf_float::copy_or_same(THD* thd)
|
Item *Item_sum_udf_float::copy_or_same(THD* thd)
|
||||||
{
|
{
|
||||||
return new (thd->mem_root) Item_sum_udf_float(thd, this);
|
return new (thd->mem_root) Item_sum_udf_float(thd, this);
|
||||||
|
@ -550,6 +550,7 @@ public:
|
|||||||
bool add();
|
bool add();
|
||||||
void reset_field() {};
|
void reset_field() {};
|
||||||
void update_field() {};
|
void update_field() {};
|
||||||
|
void cleanup();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -67,6 +67,7 @@ class udf_handler :public Sql_alloc
|
|||||||
bool get_arguments();
|
bool get_arguments();
|
||||||
bool fix_fields(THD *thd,struct st_table_list *tlist,Item_result_field *item,
|
bool fix_fields(THD *thd,struct st_table_list *tlist,Item_result_field *item,
|
||||||
uint arg_count,Item **args);
|
uint arg_count,Item **args);
|
||||||
|
void cleanup();
|
||||||
double val(my_bool *null_value)
|
double val(my_bool *null_value)
|
||||||
{
|
{
|
||||||
if (get_arguments())
|
if (get_arguments())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user