MDEV-22277 LeakSanitizer: detected memory leaks in mem_heap_create_block_func...

MDEV-22277 LeakSanitizer: detected memory leaks in mem_heap_create_block_func after attempt to create foreign key

- During online DDL, prepare phase error handler fails to remove
the memory allocated for newly created foreign keys.
parent 15cd9195
...@@ -233,3 +233,14 @@ Opened_table_definitions 2 ...@@ -233,3 +233,14 @@ Opened_table_definitions 2
Opened_tables 2 Opened_tables 2
drop function foo; drop function foo;
drop table t2, t1; drop table t2, t1;
CREATE TABLE t1 (pk INT, a INT, PRIMARY KEY (pk)) ENGINE=InnoDB;
XA START 'xid';
INSERT INTO t1 VALUES (1,2);
CREATE TABLE x AS SELECT * FROM t1;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state
SET foreign_key_checks= OFF, innodb_lock_wait_timeout= 1;
ALTER TABLE t1 ADD FOREIGN KEY f (a) REFERENCES t1 (pk), LOCK=EXCLUSIVE;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
XA END 'xid';
XA ROLLBACK 'xid';
DROP TABLE t1;
...@@ -285,6 +285,20 @@ show status like '%opened_tab%'; ...@@ -285,6 +285,20 @@ show status like '%opened_tab%';
drop function foo; drop function foo;
drop table t2, t1; drop table t2, t1;
CREATE TABLE t1 (pk INT, a INT, PRIMARY KEY (pk)) ENGINE=InnoDB;
XA START 'xid';
INSERT INTO t1 VALUES (1,2);
--error ER_XAER_RMFAIL
CREATE TABLE x AS SELECT * FROM t1;
--connect (con1,localhost,root,,test)
SET foreign_key_checks= OFF, innodb_lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
ALTER TABLE t1 ADD FOREIGN KEY f (a) REFERENCES t1 (pk), LOCK=EXCLUSIVE;# Cleanup
--disconnect con1
--connection default
XA END 'xid';
XA ROLLBACK 'xid';
DROP TABLE t1;
# #
# End of 10.1 tests # End of 10.1 tests
# #
...@@ -3376,6 +3376,12 @@ prepare_inplace_alter_table_dict( ...@@ -3376,6 +3376,12 @@ prepare_inplace_alter_table_dict(
trx_free_for_mysql(ctx->trx); trx_free_for_mysql(ctx->trx);
trx_commit_for_mysql(ctx->prebuilt->trx); trx_commit_for_mysql(ctx->prebuilt->trx);
for (uint i = 0; i < ctx->num_to_add_fk; i++) {
if (ctx->add_fk[i]) {
dict_foreign_free(ctx->add_fk[i]);
}
}
delete ctx; delete ctx;
ha_alter_info->handler_ctx = NULL; ha_alter_info->handler_ctx = NULL;
......
...@@ -3388,6 +3388,12 @@ prepare_inplace_alter_table_dict( ...@@ -3388,6 +3388,12 @@ prepare_inplace_alter_table_dict(
trx_free_for_mysql(ctx->trx); trx_free_for_mysql(ctx->trx);
trx_commit_for_mysql(ctx->prebuilt->trx); trx_commit_for_mysql(ctx->prebuilt->trx);
for (uint i = 0; i < ctx->num_to_add_fk; i++) {
if (ctx->add_fk[i]) {
dict_foreign_free(ctx->add_fk[i]);
}
}
delete ctx; delete ctx;
ha_alter_info->handler_ctx = NULL; ha_alter_info->handler_ctx = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment