summaryrefslogtreecommitdiff
path: root/sql/sql_insert.cc
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2021-10-09 22:27:31 +0400
committerAlexander Barkov <bar@mariadb.com>2021-10-11 18:03:42 +0400
commit8f04ec288528fd53efd98e2139e5d22ba229d20b (patch)
tree9ea889eb32052021c167e6f574c6a1b835089f0f /sql/sql_insert.cc
parenteadd87880887e6ca73e6f292c9d856df7e56c3c0 (diff)
downloadmariadb-git-bb-10.2-bar-MDEV-25925.tar.gz
MDEV-25925 Warning: Memory not freed: 32 on INSERT DELAYEDbb-10.2-bar-MDEV-25925
Also fixes MDEV-24467 Memory not freed after failed INSERT DELAYED Description: In case of an error (e.g. data truncation) during mysql_insert() handling an INSERT DELAYED, the data type specific data in fields (e.g. Field_blob::value) is not taken over by the delayed writer thread. All fields in table_list->table are freed by free_root() immediately after mysql_insert(). To avoid a memory leak, we need to free the specific data before exiting mysql_insert() on error.
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r--sql/sql_insert.cc11
1 files changed, 11 insertions, 0 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 51b2c84cfea..718682f767e 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -1257,7 +1257,18 @@ values_loop_end:
abort:
#ifndef EMBEDDED_LIBRARY
if (lock_type == TL_WRITE_DELAYED)
+ {
end_delayed_insert(thd);
+ /*
+ In case of an error (e.g. data truncation), the data type specific data
+ in fields (e.g. Field_blob::value) was not taken over
+ by the delayed writer thread. All fields in table_list->table
+ will be freed by free_root() soon. We need to free the specific
+ data before free_root() to avoid a memory leak.
+ */
+ for (Field **ptr= table_list->table->field ; *ptr ; ptr++)
+ (*ptr)->free();
+ }
#endif
if (table != NULL)
table->file->ha_release_auto_increment();