summaryrefslogtreecommitdiff
path: root/mysql-test/suite/parts/inc
diff options
context:
space:
mode:
authorMattias Jonsson <mattias.jonsson@oracle.com>2010-10-01 13:22:11 +0200
committerMattias Jonsson <mattias.jonsson@oracle.com>2010-10-01 13:22:11 +0200
commit1b5f84db5b2b38428ec662124c9241cf2bd51350 (patch)
tree87bdb5c22e4b934f359f4407fb9fbd707c95da62 /mysql-test/suite/parts/inc
parentfdb40d42e57f770e3939baf6c43a0c81f38352b7 (diff)
downloadmariadb-git-1b5f84db5b2b38428ec662124c9241cf2bd51350.tar.gz
Bug#56172: Server crashes in ha_partition::reset on
REBUILD PARTITION under LOCK TABLE Collapsed patch including updates from the reviews. In case of failure in ALTER ... PARTITION under LOCK TABLE the server could crash, due to it had modified the locked table object, which was not reverted in case of failure, resulting in a bad table definition used after the failed command. Solved by instead of altering the locked table object and its partition_info struct, creating an internal temporary intermediate table object used for altering, just like the non partitioned mysql_alter_table. So if an error occur before the alter operation is complete, the original table is not modified at all. But if the alter operation have succeeded so far that it must be completed as whole, the table is properly closed and reopened. (The completion on failure is done by the ddl_log.) mysql-test/suite/parts/inc/partition_fail.inc: Added tests under LOCK TABLE mysql-test/suite/parts/r/partition_debug_innodb.result: Updated results mysql-test/suite/parts/r/partition_debug_myisam.result: Updated results mysql-test/suite/parts/r/partition_special_innodb.result: updated result mysql-test/suite/parts/t/partition_special_innodb.test: changing comment, since this patch also fixes this. sql/sql_partition.cc: Added TODO, to use DBUG_SUICIDE() instead of abort() to avoid core-files on expected crashes. Removed unused arguments to fast_end_partition. Opening a intermediate table in prep_alter_part_table, instead of altering (a possible locked) normally opened table. That way we do not have to do anything more than close the intermediate table on error, leaving the ordinary table opened and locked. Also making sure that the intermediate table are closed/destroyed on failure. If no error occur it is later destroyed in the end of fast_alter_partition_table. Added ha_external_lock to make sure MyISAM flushed the index file after copying the partitions. This also leads to removal of the special close and removal from the table cache for other instances of the table. sql/sql_partition.h: Changed the arguments for prep_alter_part_table and fast_alter_partition_table to use an intermediate table instead of altering a (possibly locked) normal table. sql/sql_table.cc: Using an intermediate table created in prep_alter_part_table to be used in fast_alter_partition_table, also closing/destroying it on failure.
Diffstat (limited to 'mysql-test/suite/parts/inc')
-rw-r--r--mysql-test/suite/parts/inc/partition_fail.inc20
1 files changed, 20 insertions, 0 deletions
diff --git a/mysql-test/suite/parts/inc/partition_fail.inc b/mysql-test/suite/parts/inc/partition_fail.inc
index 6942b40042a..995a1f895e4 100644
--- a/mysql-test/suite/parts/inc/partition_fail.inc
+++ b/mysql-test/suite/parts/inc/partition_fail.inc
@@ -16,3 +16,23 @@ SHOW CREATE TABLE t1;
--sorted_result
SELECT * FROM t1;
DROP TABLE t1;
+
+--echo # Same test under LOCK TABLE
+--eval $create_statement
+--eval $insert_statement
+--echo # State before failure
+--list_files $DATADIR/test
+SHOW CREATE TABLE t1;
+--sorted_result
+SELECT * FROM t1;
+LOCK TABLE t1 WRITE;
+--disable_abort_on_error
+--eval $fail_statement
+--enable_abort_on_error
+--echo # State after failure
+--list_files $DATADIR/test
+SHOW CREATE TABLE t1;
+--sorted_result
+SELECT * FROM t1;
+UNLOCK TABLES;
+DROP TABLE t1;