From: Date: October 9 2008 12:49pm Subject: bzr commit into mysql-5.1 branch (Sergey.Glukhov:2772) Bug#39372 List-Archive: http://lists.mysql.com/commits/55906 X-Bug: 39372 Message-Id: <0K8G003UNWQYU5B0@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7BIT #At file:///home/gluh/MySQL/mysql-5.1-bugteam/ 2772 Sergey Glukhov 2008-10-09 Bug#39372 "Smart" ALTER TABLE not so smart after all. The problem was that PACK_KEYS and MAX_ROWS clause in ALTER TABLE did not trigger table reconstruction. The fix is to rebuild a table if PACK_KEYS or MAX_ROWS are specified. modified: mysql-test/r/alter_table.result mysql-test/t/alter_table.test sql/sql_table.cc per-file messages: mysql-test/r/alter_table.result test result mysql-test/t/alter_table.test test case sql/sql_table.cc The problem was that PACK_KEYS and MAX_ROWS clause in ALTER TABLE did not trigger table reconstruction. The fix is to rebuild a table if PACK_KEYS or MAX_ROWS are specified. === modified file 'mysql-test/r/alter_table.result' --- a/mysql-test/r/alter_table.result 2008-06-17 14:12:21 +0000 +++ b/mysql-test/r/alter_table.result 2008-10-09 10:49:13 +0000 @@ -1222,4 +1222,22 @@ ALTER TABLE t1 CHANGE d c varchar(10); affected rows: 0 info: Records: 0 Duplicates: 0 Warnings: 0 DROP TABLE t1; +create table t1(f1 int not null, f2 int not null, key (f1), key (f2)); +select index_length into @unpaked_keys_size from +information_schema.tables where table_name='t1'; +alter table t1 pack_keys=1; +select index_length into @paked_keys_size from +information_schema.tables where table_name='t1'; +select (@unpaked_keys_size > @paked_keys_size); +(@unpaked_keys_size > @paked_keys_size) +1 +select max_data_length into @orig_max_data_length from +information_schema.tables where table_name='t1'; +alter table t1 max_rows=100; +select max_data_length into @changed_max_data_length from +information_schema.tables where table_name='t1'; +select (@orig_max_data_length > @changed_max_data_length); +(@orig_max_data_length > @changed_max_data_length) +1 +drop table t1; End of 5.1 tests === modified file 'mysql-test/t/alter_table.test' --- a/mysql-test/t/alter_table.test 2008-06-17 14:12:21 +0000 +++ b/mysql-test/t/alter_table.test 2008-10-09 10:49:13 +0000 @@ -947,4 +947,34 @@ ALTER TABLE t1 CHANGE d c varchar(10); --disable_info DROP TABLE t1; +# +# Bug#39372 "Smart" ALTER TABLE not so smart after all. +# +create table t1(f1 int not null, f2 int not null, key (f1), key (f2)); +let $count= 50; +--disable_query_log +while ($count) +{ + EVAL insert into t1 values (1,1),(1,1),(1,1),(1,1),(1,1); + EVAL insert into t1 values (2,2),(2,2),(2,2),(2,2),(2,2); + dec $count ; +} +--enable_query_log + +select index_length into @unpaked_keys_size from +information_schema.tables where table_name='t1'; +alter table t1 pack_keys=1; +select index_length into @paked_keys_size from +information_schema.tables where table_name='t1'; +select (@unpaked_keys_size > @paked_keys_size); + +select max_data_length into @orig_max_data_length from +information_schema.tables where table_name='t1'; +alter table t1 max_rows=100; +select max_data_length into @changed_max_data_length from +information_schema.tables where table_name='t1'; +select (@orig_max_data_length > @changed_max_data_length); + +drop table t1; + --echo End of 5.1 tests === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2008-10-06 20:36:15 +0000 +++ b/sql/sql_table.cc 2008-10-09 10:49:13 +0000 @@ -5281,6 +5281,8 @@ compare_tables(TABLE *table, create_info->used_fields & HA_CREATE_USED_CHARSET || create_info->used_fields & HA_CREATE_USED_DEFAULT_CHARSET || create_info->used_fields & HA_CREATE_USED_ROW_FORMAT || + create_info->used_fields & HA_CREATE_USED_PACK_KEYS || + create_info->used_fields & HA_CREATE_USED_MAX_ROWS || (alter_info->flags & (ALTER_RECREATE | ALTER_FOREIGN_KEY)) || order_num || !table->s->mysql_version ||