From: Sergey Vojtovich Date: March 24 2010 2:39pm Subject: bzr commit into mysql-5.1-bugteam branch (svoj:3416) Bug#47621 List-Archive: http://lists.mysql.com/commits/104218 X-Bug: 47621 Message-Id: <0KZS00AH0JE50V20@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_fGQVavhAKYN+/TsC5WPslQ)" --Boundary_(ID_fGQVavhAKYN+/TsC5WPslQ) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/svoj/devel/innodb-snapshots/mysql-5.1-bugteam/ based on revid:svoj@stripped 3416 Sergey Vojtovich 2010-03-24 Applying InnoDB snapshot, fixes BUG#47621. Detailed revision comments: r6783 | jyang | 2010-03-09 17:54:14 +0200 (Tue, 09 Mar 2010) | 9 lines branches/5.1: Fix bug #47621 "MySQL and InnoDB data dictionaries will become out of sync when renaming columns". MySQL does not provide new column name information to storage engine to update the system table. To avoid column name mismatch, we shall just request a table copy for now. rb://246 approved by Marko. added: mysql-test/r/innodb_bug47621.result mysql-test/t/innodb_bug47621.test modified: mysql-test/r/innodb_bug21704.result storage/innobase/handler/ha_innodb.cc === modified file 'mysql-test/r/innodb_bug21704.result' --- a/mysql-test/r/innodb_bug21704.result 2009-07-10 11:35:53 +0000 +++ b/mysql-test/r/innodb_bug21704.result 2010-03-24 14:39:23 +0000 @@ -25,8 +25,8 @@ ALTER TABLE t1 CHANGE a c INT; ERROR HY000: Error on rename of '#sql-temporary' to './test/t1' (errno: 150) # Ensure that online column rename works. ALTER TABLE t1 CHANGE b c INT; -affected rows: 0 -info: Records: 0 Duplicates: 0 Warnings: 0 +affected rows: 3 +info: Records: 3 Duplicates: 0 Warnings: 0 # Test renaming the column in the referencing table @@ -34,8 +34,8 @@ ALTER TABLE t2 CHANGE a c INT; ERROR HY000: Error on rename of '#sql-temporary' to './test/t2' (errno: 150) # Ensure that online column rename works. ALTER TABLE t2 CHANGE b c INT; -affected rows: 0 -info: Records: 0 Duplicates: 0 Warnings: 0 +affected rows: 3 +info: Records: 3 Duplicates: 0 Warnings: 0 # Test with self-referential constraints @@ -45,8 +45,8 @@ ALTER TABLE t3 CHANGE b d INT; ERROR HY000: Error on rename of '#sql-temporary' to './test/t3' (errno: 150) # Ensure that online column rename works. ALTER TABLE t3 CHANGE c d INT; -affected rows: 0 -info: Records: 0 Duplicates: 0 Warnings: 0 +affected rows: 3 +info: Records: 3 Duplicates: 0 Warnings: 0 # Cleanup. === added file 'mysql-test/r/innodb_bug47621.result' --- a/mysql-test/r/innodb_bug47621.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/innodb_bug47621.result 2010-03-24 14:39:23 +0000 @@ -0,0 +1,21 @@ +CREATE TABLE bug47621 (salesperson INT) ENGINE=InnoDB; +ALTER TABLE bug47621 CHANGE salesperson sales_acct_id INT; +create index orgs on bug47621(sales_acct_id); +ALTER TABLE bug47621 CHANGE sales_acct_id salesperson INT; +drop table bug47621; +CREATE TABLE bug47621_sale ( +salesperson INT, +PRIMARY KEY(salesperson)) engine = innodb; +CREATE TABLE bug47621_shirt( +id SMALLINT, +owner INT, +FOREIGN KEY(owner) +references bug47621_sale(salesperson) ON DELETE RESTRICT) +engine = innodb; +insert into bug47621_sale values(9); +insert into bug47621_shirt values(1, 9); +ALTER TABLE bug47621_shirt CHANGE id new_id INT; +drop table bug47621_shirt; +ALTER TABLE bug47621_sale CHANGE salesperson sales_acct_id INT; +ALTER TABLE bug47621_sale ADD INDEX idx (sales_acct_id); +drop table bug47621_sale; === added file 'mysql-test/t/innodb_bug47621.test' --- a/mysql-test/t/innodb_bug47621.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/innodb_bug47621.test 2010-03-24 14:39:23 +0000 @@ -0,0 +1,57 @@ +# This is the test for bug #47621, column rename operation should +# not result in column definition inconsistency between MySQL and +# InnoDB + +--source include/have_innodb.inc + +CREATE TABLE bug47621 (salesperson INT) ENGINE=InnoDB; + +# Change the column name +ALTER TABLE bug47621 CHANGE salesperson sales_acct_id INT; + +# If there is inconsistency of column name definition +# in MySQL or InnoDB, following create index would fail +create index orgs on bug47621(sales_acct_id); + +# Change the column name back with the index defined on it. +ALTER TABLE bug47621 CHANGE sales_acct_id salesperson INT; + +drop table bug47621; + +CREATE TABLE bug47621_sale ( + salesperson INT, + PRIMARY KEY(salesperson)) engine = innodb; + +CREATE TABLE bug47621_shirt( + id SMALLINT, + owner INT, + FOREIGN KEY(owner) + references bug47621_sale(salesperson) ON DELETE RESTRICT) + engine = innodb; + +insert into bug47621_sale values(9); + +insert into bug47621_shirt values(1, 9); + +# Any rename operation on columns involved in a reference constraint will +# fail, as it will be rejected by InnoDB row_rename_table_for_mysql(). +# In above example, any rename on column "salesperson" for table +# "bug47621_sale", or on column "owner" for table "bug47621_shirt will +# be blocked. We do not put such rename in the test since InnoDB error +# message will be printed in the error log, and result in test failure. +# +# ALTER TABLE bug47621_sale CHANGE salesperson sales_acct_id INT; + +# Any rename on columns not involved in the foreign key constraint +# could still proceed +ALTER TABLE bug47621_shirt CHANGE id new_id INT; + +# Referencing table dropped, the rename operation on related columns +# could proceed +drop table bug47621_shirt; + +ALTER TABLE bug47621_sale CHANGE salesperson sales_acct_id INT; + +ALTER TABLE bug47621_sale ADD INDEX idx (sales_acct_id); + +drop table bug47621_sale; === modified file 'storage/innobase/handler/ha_innodb.cc' --- a/storage/innobase/handler/ha_innodb.cc 2010-02-26 13:16:46 +0000 +++ b/storage/innobase/handler/ha_innodb.cc 2010-03-24 14:39:23 +0000 @@ -8489,6 +8489,44 @@ innobase_set_cursor_view( (cursor_view_t*) curview); } +/*********************************************************************** +If col_name is not NULL, check whether the named column is being +renamed in the table. If col_name is not provided, check +whether any one of columns in the table is being renamed. */ +static +bool +check_column_being_renamed( +/*=======================*/ + /* out: true if find the column + being renamed */ + const TABLE* table, /* in: MySQL table */ + const char* col_name) /* in: name of the column */ +{ + uint k; + Field* field; + + for (k = 0; k < table->s->fields; k++) { + field = table->field[k]; + + if (field->flags & FIELD_IS_RENAMED) { + + /* If col_name is not provided, return + if the field is marked as being renamed. */ + if (!col_name) { + return(true); + } + + /* If col_name is provided, return only + if names match */ + if (innobase_strcasecmp(field->field_name, + col_name) == 0) { + return(true); + } + } + } + + return(false); +} /*********************************************************************** Check whether any of the given columns is being renamed in the table. */ @@ -8503,19 +8541,10 @@ column_is_being_renamed( const char** col_names) /* in: names of the columns */ { uint j; - uint k; - Field* field; - const char* col_name; for (j = 0; j < n_cols; j++) { - col_name = col_names[j]; - for (k = 0; k < table->s->fields; k++) { - field = table->field[k]; - if ((field->flags & FIELD_IS_RENAMED) - && innobase_strcasecmp(field->field_name, - col_name) == 0) { - return(true); - } + if (check_column_being_renamed(table, col_names[j])) { + return(true); } } @@ -8597,6 +8626,15 @@ bool ha_innobase::check_if_incompatible_ return COMPATIBLE_DATA_NO; } + /* For column rename operation, MySQL does not supply enough + information (new column name etc.) for InnoDB to make appropriate + system metadata change. To avoid system metadata inconsistency, + currently we can just request a table rebuild/copy by returning + COMPATIBLE_DATA_NO */ + if (check_column_being_renamed(table, NULL)) { + return COMPATIBLE_DATA_NO; + } + /* Check if a column participating in a foreign key is being renamed. There is no mechanism for updating InnoDB foreign key definitions. */ if (foreign_key_column_is_being_renamed(prebuilt, table)) { --Boundary_(ID_fGQVavhAKYN+/TsC5WPslQ) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/svoj@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/svoj@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: svoj@stripped # target_branch: file:///home/svoj/devel/innodb-snapshots/mysql-5.1-\ # bugteam/ # testament_sha1: a73cab7af5f142365d17f13c847f3fafd16e3a3e # timestamp: 2010-03-24 18:39:39 +0400 # base_revision_id: svoj@stripped # # Begin bundle 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 5LbusXHQjCe6bHXIVoZmBagv/F3JFOFCQjwCodQ= --Boundary_(ID_fGQVavhAKYN+/TsC5WPslQ)--