From: Dmitry Lenev Date: November 18 2010 2:09pm Subject: bzr commit into mysql-5.5-runtime branch (Dmitry.Lenev:3186) Bug#57985 List-Archive: http://lists.mysql.com/commits/124343 X-Bug: 57985 Message-Id: <20101118140939.A5A9C1E51CB@mockturtle> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1695665073==" --===============1695665073== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/dlenev/src/bzr/mysql-5.5-57985/ based on revid:jon.hauglid@stripped 3186 Dmitry Lenev 2010-11-18 Fix for bug #57985 "ONLINE/FAST ALTER PARTITION can fail and leave the table unusable". Failing ALTER statement on partitioned table could have left this table in an unusable state. This has happened in cases when ALTER was executed using "fast" algorithm, which doesn't involve copying of data between old and new versions of table, and the resulting new table was incompatible with partitioning function in some way. The problem stems from the fact that discrepancies between new table definition and partitioning function are discovered only table is opened. In case of "fast" algorithm this has happened too late during ALTER's execution, at the moment when all changes were already done and couldn't have been reverted. In the cases when "slow" algoritm, which copies data, is used such discrepancies are detected at the moment new table definition is opened implicitly when new version of table is created in storage engine. As result ALTER is aborted before any changes to table were done. This fix tries to address this issue by ensuring that "fast" algorithm behaves similarly to "slow" algoritm and checks compatibility between new definition and partitioning function by trying to open new definition after .FRM file for it has been created. Long term we probably should implement some way to check compatibility between partitioning function and new table definition which won't involve opening it, as this should allow much cleaner fix for this problem. @ mysql-test/r/partition_innodb.result Added test for bug #57985 "ONLINE/FAST ALTER PARTITION can fail and leave the table unusable". @ mysql-test/t/partition_innodb.test Added test for bug #57985 "ONLINE/FAST ALTER PARTITION can fail and leave the table unusable". @ sql/sql_table.cc Ensure that in cases when .FRM for partitioned table is created without creating table in storage engine (e.g. during "fast" ALTER TABLE) we still open table definition. This allows to check that definition of created table/.FRM is compatible with its partitioning function. modified: mysql-test/r/partition_innodb.result mysql-test/t/partition_innodb.test sql/sql_table.cc === modified file 'mysql-test/r/partition_innodb.result' --- a/mysql-test/r/partition_innodb.result 2010-09-13 13:56:56 +0000 +++ b/mysql-test/r/partition_innodb.result 2010-11-18 14:09:21 +0000 @@ -489,3 +489,31 @@ Warning 1265 Data truncated for column ' Error 1067 Invalid default value for 'b' SET SESSION sql_mode = @old_mode; DROP TABLE t1; +# +# Bug#57985 "ONLINE/FAST ALTER PARTITION can fail and leave the +# table unusable". +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a bigint not null, b int not null, PRIMARY KEY (a)) +ENGINE = InnoDB PARTITION BY KEY(a) PARTITIONS 2; +INSERT INTO t1 values (0,1), (1,2); +# The below ALTER should fail. It should leave the +# table in its original, non-corrupted, usable state. +ALTER TABLE t1 ADD UNIQUE KEY (b); +ERROR HY000: A UNIQUE INDEX must include all columns in the table's partitioning function +# The below statements should succeed, as ALTER should +# have left table intact. +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` bigint(20) NOT NULL, + `b` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY KEY (a) +PARTITIONS 2 */ +SELECT * FROM t1; +a b +1 2 +0 1 +DROP TABLE t1; === modified file 'mysql-test/t/partition_innodb.test' --- a/mysql-test/t/partition_innodb.test 2010-08-20 17:15:48 +0000 +++ b/mysql-test/t/partition_innodb.test 2010-11-18 14:09:21 +0000 @@ -569,3 +569,24 @@ SET SESSION sql_mode = 'NO_ZERO_DATE'; OPTIMIZE TABLE t1; SET SESSION sql_mode = @old_mode; DROP TABLE t1; + + +--echo # +--echo # Bug#57985 "ONLINE/FAST ALTER PARTITION can fail and leave the +--echo # table unusable". +--echo # +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TABLE t1 (a bigint not null, b int not null, PRIMARY KEY (a)) + ENGINE = InnoDB PARTITION BY KEY(a) PARTITIONS 2; +INSERT INTO t1 values (0,1), (1,2); +--echo # The below ALTER should fail. It should leave the +--echo # table in its original, non-corrupted, usable state. +--error ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF +ALTER TABLE t1 ADD UNIQUE KEY (b); +--echo # The below statements should succeed, as ALTER should +--echo # have left table intact. +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2010-11-12 11:23:17 +0000 +++ b/sql/sql_table.cc 2010-11-18 14:09:21 +0000 @@ -3802,6 +3802,49 @@ void sp_prepare_create_field(THD *thd, C (void) prepare_blob_field(thd, sql_field); } + +/** + Auxiliary function which allows to check if freshly created .FRM + file for table can be opened. + + @retval FALSE - Success. + @retval TRUE - Failure. +*/ + +static bool check_if_created_table_can_be_opened(THD *thd, + const char *path, + const char *db, + const char *table_name, + HA_CREATE_INFO *create_info, + handler *file) +{ + TABLE table; + TABLE_SHARE share; + bool result= TRUE; + + /* + It is impossible to open definition of partitioned table without .par file. + */ + if (file->ha_create_handler_files(path, NULL, CHF_CREATE_FLAG, create_info)) + return TRUE; + + init_tmp_table_share(thd, &share, db, 0, table_name, path); + + if (open_table_def(thd, &share, 0) || + open_table_from_share(thd, &share, "", 0, (uint) READ_ALL, + 0, &table, TRUE)) + goto err; + + result= FALSE; + (void) closefrm(&table, 0); + +err: + free_table_share(&share); + (void) file->ha_create_handler_files(path, NULL, CHF_DELETE_FLAG, create_info); + return result; +} + + /* Create a table @@ -4228,6 +4271,29 @@ bool mysql_create_table_no_lock(THD *thd thd->thread_specific_used= TRUE; } +#ifdef WITH_PARTITION_STORAGE_ENGINE + else if (part_info && create_info->frm_only) + { + /* + For partitioned tables we can't find some problems with table + until table is opened. Therefore in order to disallow creation + of corrupted tables we have to try to open table as the part + of its creation process. + In cases when both .FRM and SE part of table are created table + is implicitly open in ha_create_table() call. + In cases when we create .FRM without SE part we have to open + table explicitly. + */ + if (check_if_created_table_can_be_opened(thd, path, db, table_name, + create_info, file)) + { + char frm_name[FN_REFLEN]; + strxmov(frm_name, path, reg_ext, NullS); + (void) mysql_file_delete(key_file_frm, frm_name, MYF(0)); + goto err; + } + } +#endif error= FALSE; err: --===============1695665073== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/dmitry.lenev@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: dmitry.lenev@stripped # target_branch: file:///home/dlenev/src/bzr/mysql-5.5-57985/ # testament_sha1: 718025e3ebc3f9b737400736bf98475fcc6a94e7 # timestamp: 2010-11-18 17:09:39 +0300 # base_revision_id: jon.hauglid@stripped\ # eoi6ar9yb1issdsn # # Begin bundle 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 xU2ra4r4TzBmVOlYuzJ9nue7/xdyRThQkBF6/ds= --===============1695665073==--