Bug #9913 deinit not called when calling udf from trigger
| Submitted: | 14 Apr 2005 16:59 | Modified: | 19 May 2005 2:01 |
|---|---|---|---|
| Reporter: | Trevor Kramer | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: User-defined functions ( UDF ) | Severity: | S1 (Critical) |
| Version: | 5.0.3 | OS: | Linux (RedHat 4) |
| Assigned to: | Dmitry Lenev | CPU Architecture: | Any |
[15 Apr 2005 4:57]
Jorge del Conde
Thanks for your bug-report. I verified this with 5.0.4 from bk.
[30 Apr 2005 16:22]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/internals/24501
[9 May 2005 14:20]
Dmitry Lenev
After investigating this problem I would say that we have similar problem in 4.1 with prepared statements. I.e. udf_init() function is called for each execution of prepared statement and udf_deinit() function is called only once when this statement is destroyed. Which is obviously wrong...
[9 May 2005 14:22]
Dmitry Lenev
Fixed in 4.1.12 and 5.0.6
[19 May 2005 2:01]
Paul DuBois
Noted in 4.1.12, 5.0.6 changelogs.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.054 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: When calling a udf from a trigger the udf is invoked with a call to init followed by a call to the function and the deinit method is never called leading to a huge memory leak if memory was allocated in the init call. How to repeat: compile this as a udf #include <my_global.h> #include <mysql.h> #include <m_string.h> #include <iostream> namespace std { extern ostream cerr; } extern "C" { my_bool example_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void example_deinit(UDF_INIT *initid); char* example(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error); } my_bool example_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { std::cerr << "example_init" << std::endl; return 0; } void example_deinit(UDF_INIT *initid) { std::cout << "example_deinit" << std::endl; } char* example(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error) { *is_null = 1; return NULL; } and install it with this command CREATE FUNCTION example RETURNS STRING SONAME "library_name.so"; install a trigger on a table that uses the udf create trigger example_trigger BEFORE INSERT ON test_table for each row BEGIN set NEW.test_column = example(NEW.test_column); END// and look in the server log for output - you will see example_init example_init with no calls to deinit Suggested fix: Don't call udfs from triggers