1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-16093 Memory leak with triggers

Problem was that blob memory allocated in Table_trigger_list was not
properly freed
This commit is contained in:
Monty
2018-05-24 15:18:09 +03:00
parent 9e22cae1cf
commit 29dbb23fb7
3 changed files with 31 additions and 2 deletions

View File

@ -2306,4 +2306,15 @@ CREATE TABLE t1 (i INT);
insert into t2 value (2); insert into t2 value (2);
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1,t2,t3; DROP TABLE t1,t2,t3;
End of 10.1 tests. #
# MDEV-16093
# Assertion `global_status_var.global_memory_used == 0' failed or
# bytes lost after inserting into table with non-null blob and trigger
#
CREATE TABLE t1 (b BLOB NOT NULL);
CREATE TRIGGER tr BEFORE UPDATE ON t1 FOR EACH ROW BEGIN END;
INSERT INTO t1 VALUES ('foo');
DROP TABLE t1;
#
# End of 10.1 tests.
#

View File

@ -2656,5 +2656,17 @@ insert into t2 value (2);
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1,t2,t3; DROP TABLE t1,t2,t3;
--echo #
--echo # MDEV-16093
--echo # Assertion `global_status_var.global_memory_used == 0' failed or
--echo # bytes lost after inserting into table with non-null blob and trigger
--echo #
--echo End of 10.1 tests. CREATE TABLE t1 (b BLOB NOT NULL);
CREATE TRIGGER tr BEFORE UPDATE ON t1 FOR EACH ROW BEGIN END;
INSERT INTO t1 VALUES ('foo');
DROP TABLE t1;
--echo #
--echo # End of 10.1 tests.
--echo #

View File

@ -614,6 +614,7 @@ end:
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
} }
/** /**
Build stmt_query to write it in the bin-log Build stmt_query to write it in the bin-log
and get the trigger definer. and get the trigger definer.
@ -1061,6 +1062,11 @@ Table_triggers_list::~Table_triggers_list()
for (int j= 0; j < (int)TRG_ACTION_MAX; j++) for (int j= 0; j < (int)TRG_ACTION_MAX; j++)
delete bodies[i][j]; delete bodies[i][j];
/* Free blobs used in insert */
if (record0_field)
for (Field **fld_ptr= record0_field; *fld_ptr; fld_ptr++)
(*fld_ptr)->free();
if (record1_field) if (record1_field)
for (Field **fld_ptr= record1_field; *fld_ptr; fld_ptr++) for (Field **fld_ptr= record1_field; *fld_ptr; fld_ptr++)
delete *fld_ptr; delete *fld_ptr;