From: Georgi Kodinov Date: September 18 2009 11:31am Subject: bzr commit into mysql-5.1-bugteam branch (joro:3120) Bug#46760 List-Archive: http://lists.mysql.com/commits/83713 X-Bug: 46760 Message-Id: <200909181131.n8IBVvbx026017@magare.gmz> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6763100528165271451==" --===============6763100528165271451== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/kgeorge/mysql/work/B46760-5.1-bugteam/ based on revid:alik@stripped 3120 Georgi Kodinov 2009-09-18 Bug#46760: Fast ALTER TABLE no longer works for InnoDB Despite copying the value of the old table's row type we don't always have to mark row type as being specified. Innodb uses this to check if it can do fast ALTER TABLE or not. Fixed by marking the row as supplied only when it's not the default one. Added a test case for 39200. modified: mysql-test/r/innodb_mysql.result mysql-test/t/innodb_mysql.test sql/handler.h sql/sql_table.cc === modified file 'mysql-test/r/innodb_mysql.result' --- a/mysql-test/r/innodb_mysql.result 2009-07-13 17:41:43 +0000 +++ b/mysql-test/r/innodb_mysql.result 2009-09-18 11:31:51 +0000 @@ -2208,4 +2208,53 @@ EXPLAIN SELECT * FROM t1 FORCE INDEX(PRI id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL PRIMARY 4 NULL 128 Using where DROP TABLE t1; +# +# Bug#46760: Fast ALTER TABLE no longer works for InnoDB +# +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +# By using --enable_info and verifying that number of affected +# rows is 0 we check that this ALTER TABLE is really carried +# out as "fast/online" operation, i.e. without full-blown data +# copying. +# +# I.e. info for the below statement should normally look like: +# +# affected rows: 0 +# info: Records: 0 Duplicates: 0 Warnings: 0 +ALTER TABLE t1 ALTER COLUMN a SET DEFAULT 10; +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 0 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT '10' +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1; +# +# MySQL Bug#39200: optimize table does not recognize +# ROW_FORMAT=COMPRESSED +# +CREATE TABLE t1 (a INT) ROW_FORMAT=compressed; +Warnings: +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize note Table does not support optimize, doing recreate + analyze instead +test.t1 optimize status OK +Warnings: +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED +DROP TABLE t1; End of 5.1 tests === modified file 'mysql-test/t/innodb_mysql.test' --- a/mysql-test/t/innodb_mysql.test 2009-07-07 12:52:34 +0000 +++ b/mysql-test/t/innodb_mysql.test 2009-09-18 11:31:51 +0000 @@ -461,4 +461,39 @@ EXPLAIN SELECT * FROM t1 FORCE INDEX(PRI DROP TABLE t1; +--echo # +--echo # Bug#46760: Fast ALTER TABLE no longer works for InnoDB +--echo # + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); + +--echo # By using --enable_info and verifying that number of affected +--echo # rows is 0 we check that this ALTER TABLE is really carried +--echo # out as "fast/online" operation, i.e. without full-blown data +--echo # copying. +--echo # +--echo # I.e. info for the below statement should normally look like: +--echo # +--echo # affected rows: 0 +--echo # info: Records: 0 Duplicates: 0 Warnings: 0 + +--enable_info +ALTER TABLE t1 ALTER COLUMN a SET DEFAULT 10; +--disable_info +SHOW CREATE TABLE t1; + +DROP TABLE t1; + +--echo # +--echo # MySQL Bug#39200: optimize table does not recognize +--echo # ROW_FORMAT=COMPRESSED +--echo # + +CREATE TABLE t1 (a INT) ROW_FORMAT=compressed; +SHOW CREATE TABLE t1; +OPTIMIZE TABLE t1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + --echo End of 5.1 tests === modified file 'sql/handler.h' --- a/sql/handler.h 2009-08-17 14:14:51 +0000 +++ b/sql/handler.h 2009-09-18 11:31:51 +0000 @@ -913,6 +913,15 @@ typedef struct st_ha_create_information ulong key_block_size; SQL_LIST merge_list; handlerton *db_type; + /** + Row type of the table definition. + + Defaults to ROW_TYPE_DEFAULT for all non-ALTER statements. + For ALTER TABLE defaults to ROW_TYPE_NOT_USED (means "keep the current"). + + Can be changed either explicitly by the parser. + If nothing speficied inherits the value of the original table (if present). + */ enum row_type row_type; uint null_bits; /* NULL bits at start of record */ uint options; /* OR of HA_CREATE_ options */ === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2009-09-10 08:49:49 +0000 +++ b/sql/sql_table.cc 2009-09-18 11:31:51 +0000 @@ -6656,10 +6656,16 @@ view_err: goto err; } - if (create_info->row_type == ROW_TYPE_NOT_USED) + /* + If this is an ALTER TABLE and no explicit row type specified reuse + the table's row type. + Note : this is the same as if the row type was specified explicitly. + */ + if (create_info->row_type == ROW_TYPE_NOT_USED && + create_info->row_type != table->s->row_type) { - create_info->row_type= table->s->row_type; create_info->used_fields |= HA_CREATE_USED_ROW_FORMAT; + create_info->row_type= table->s->row_type; } DBUG_PRINT("info", ("old type: %s new type: %s", --===============6763100528165271451== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/joro@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: joro@stripped # target_branch: file:///home/kgeorge/mysql/work/B46760-5.1-bugteam/ # testament_sha1: b1dad588058d6f50c547544152f1d9865d2b898b # timestamp: 2009-09-18 14:31:57 +0300 # base_revision_id: alik@stripped # # Begin bundle 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 LEC/nireP/4u5IpwoSE2ahSG --===============6763100528165271451==--