1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

Bug #56947 InnoDB leaks memory when failing to create a table

row_create_table_for_mysql(): When the table creation fails,
free the dict_table_t object.
This commit is contained in:
Marko Mäkelä
2010-10-11 11:59:43 +03:00
parent fd4cd8cee0
commit cfc97fd026
3 changed files with 32 additions and 6 deletions

View File

@@ -0,0 +1,8 @@
SET @old_innodb_file_per_table=@@innodb_file_per_table;
SET GLOBAL innodb_file_per_table=0;
create table bug56947(a int not null) engine = innodb;
CREATE TABLE `bug56947#1`(a int) ENGINE=InnoDB;
alter table bug56947 add unique index (a);
ERROR HY000: Table 'test.bug56947#1' already exists
drop table `bug56947#1`;
drop table bug56947;

View File

@@ -0,0 +1,16 @@
#
# Bug #56947 valgrind reports a memory leak in innodb-plugin.innodb-index
#
-- source include/have_innodb.inc
SET @old_innodb_file_per_table=@@innodb_file_per_table;
# avoid a message about filed *.ibd file creation in the error log
SET GLOBAL innodb_file_per_table=0;
create table bug56947(a int not null) engine = innodb;
CREATE TABLE `bug56947#1`(a int) ENGINE=InnoDB;
--error 156
alter table bug56947 add unique index (a);
drop table `bug56947#1`;
drop table bug56947;
--disable_query_log
SET GLOBAL innodb_file_per_table=@old_innodb_file_per_table;

View File

@@ -1938,15 +1938,13 @@ err_exit:
err = trx->error_state; err = trx->error_state;
if (UNIV_UNLIKELY(err != DB_SUCCESS)) { switch (err) {
case DB_SUCCESS:
break;
case DB_OUT_OF_FILE_SPACE:
trx->error_state = DB_SUCCESS; trx->error_state = DB_SUCCESS;
trx_general_rollback_for_mysql(trx, NULL); trx_general_rollback_for_mysql(trx, NULL);
/* TO DO: free table? The code below will dereference
table->name, though. */
}
switch (err) {
case DB_OUT_OF_FILE_SPACE:
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Warning: cannot create table ", fputs(" InnoDB: Warning: cannot create table ",
stderr); stderr);
@@ -1961,9 +1959,13 @@ err_exit:
break; break;
case DB_DUPLICATE_KEY: case DB_DUPLICATE_KEY:
default:
/* We may also get err == DB_ERROR if the .ibd file for the /* We may also get err == DB_ERROR if the .ibd file for the
table already exists */ table already exists */
trx->error_state = DB_SUCCESS;
trx_general_rollback_for_mysql(trx, NULL);
dict_mem_table_free(table);
break; break;
} }