summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@oracle.com>2010-10-11 11:18:00 +0300
committerMarko Mäkelä <marko.makela@oracle.com>2010-10-11 11:18:00 +0300
commita8da1a3a581a3572edf165ffe1076b0194195a18 (patch)
tree2289138fad80aeba7f90f31c85c89a3f235efe76
parentdf29195345758a35a2968e85f03cc1e2a0870d76 (diff)
downloadmariadb-git-a8da1a3a581a3572edf165ffe1076b0194195a18.tar.gz
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.
-rw-r--r--mysql-test/suite/innodb_plugin/r/innodb_bug56947.result6
-rw-r--r--mysql-test/suite/innodb_plugin/t/innodb_bug56947.test11
-rw-r--r--storage/innodb_plugin/ChangeLog13
-rw-r--r--storage/innodb_plugin/row/row0mysql.c14
4 files changed, 35 insertions, 9 deletions
diff --git a/mysql-test/suite/innodb_plugin/r/innodb_bug56947.result b/mysql-test/suite/innodb_plugin/r/innodb_bug56947.result
new file mode 100644
index 00000000000..42101a46a5b
--- /dev/null
+++ b/mysql-test/suite/innodb_plugin/r/innodb_bug56947.result
@@ -0,0 +1,6 @@
+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;
diff --git a/mysql-test/suite/innodb_plugin/t/innodb_bug56947.test b/mysql-test/suite/innodb_plugin/t/innodb_bug56947.test
new file mode 100644
index 00000000000..88544387567
--- /dev/null
+++ b/mysql-test/suite/innodb_plugin/t/innodb_bug56947.test
@@ -0,0 +1,11 @@
+#
+# Bug #56947 valgrind reports a memory leak in innodb-plugin.innodb-index
+#
+-- source include/have_innodb_plugin.inc
+
+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;
diff --git a/storage/innodb_plugin/ChangeLog b/storage/innodb_plugin/ChangeLog
index 342e3e32bc1..ca7900549c2 100644
--- a/storage/innodb_plugin/ChangeLog
+++ b/storage/innodb_plugin/ChangeLog
@@ -1,13 +1,21 @@
+2010-10-11 The InnoDB Team
+
+ * row/row0mysql.c, innodb_bug56947.result, innodb_bug56947.test:
+ Fix Bug #56947 InnoDB leaks memory when failing to create a table
+
2010-10-06 The InnoDB Team
+
* row/row0mysql.c, innodb_bug57255.result, innodb_bug57255.test
- Fix Bug #Cascade Delete results in "Got error -1 from storage engine"
-
+ Fix Bug #57255 Cascade Delete results in "Got error -1 from
+ storage engine"
+
2010-09-27 The InnoDB Team
* row/row0sel.c, innodb_bug56716.result, innodb_bug56716.test:
Fix Bug #56716 InnoDB locks a record gap without locking the table
2010-09-06 The InnoDB Team
+
* dict/dict0load.c, innodb_bug53756.test innodb_bug53756.result
Fix Bug #53756 ALTER TABLE ADD PRIMARY KEY affects crash recovery
@@ -40,7 +48,6 @@
* handler/ha_innodb.cc
Fix Bug #55382 Assignment with SELECT expressions takes unexpected
S locks in READ COMMITTED
->>>>>>> MERGE-SOURCE
2010-07-27 The InnoDB Team
diff --git a/storage/innodb_plugin/row/row0mysql.c b/storage/innodb_plugin/row/row0mysql.c
index 9cabea507fb..f27afc253ff 100644
--- a/storage/innodb_plugin/row/row0mysql.c
+++ b/storage/innodb_plugin/row/row0mysql.c
@@ -1879,15 +1879,13 @@ err_exit:
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_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);
fputs(" InnoDB: Warning: cannot create table ",
stderr);
@@ -1902,9 +1900,13 @@ err_exit:
break;
case DB_DUPLICATE_KEY:
+ default:
/* We may also get err == DB_ERROR if the .ibd file for the
table already exists */
+ trx->error_state = DB_SUCCESS;
+ trx_general_rollback_for_mysql(trx, NULL);
+ dict_mem_table_free(table);
break;
}