From: Jon Olav Hauglid Date: February 28 2011 4:31pm Subject: bzr commit into mysql-5.5 branch (jon.hauglid:3357) Bug#11755431 List-Archive: http://lists.mysql.com/commits/132139 X-Bug: 11755431 Message-Id: <201102281632.p1SEox5N002920@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5862137273778068985==" --===============5862137273778068985== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/x/mysql-5.5-bug11755431/ based on revid:tor.didriksen@stripped 3357 Jon Olav Hauglid 2011-02-28 Bug #11755431 (former 47205) MAP 'REPAIR TABLE' TO RECREATE +ANALYZE FOR ENGINES NOT SUPPORTING NATIVE REPAIR This is a draft patch. Executing 'mysqlcheck --check --auto-repair ...' will first issue 'CHECK TABLE FOR UPDATE' for all tables in the database in order to check if the tables are compatible with the current version of MySQL. Any tables that are found incompatible are then upgraded using 'REPAIR TABLE'. The problem was that some engines (e.g. InnoDB) does not support 'REPAIR TABLE'. This caused any such tables to be left incompatible. This could in turn cause problems for mysql_upgrade. This patch fixes the problem by first changing 'CHECK TABLE FOR UPDATE' to return a different error message if the engine does not support REPAIR. Instead of "Table upgrade required. Please do "REPAIR TABLE ..." it will report "Table rebuild required. Please do "ALTER TABLE ... FORCE ..." Second, the patch changes mysqlcheck to do 'ALTER TABLE ... FORCE' instead of 'REPAIR TABLE' in these cases. Test case added to mysqlcheck.test @ client/mysqlcheck.c Changed mysqlcheck to do 'ALTER TABLE ... FORCE' if 'CHECK TABLE FOR UPGRADE' reports ER_TABLE_NEEDS_REBUILD and not ER_TABLE_NEEDS_UPGRADE. @ mysql-test/r/mysqlcheck.result Added regression test. @ mysql-test/std_data/bug47205.frm InnoDB 5.0 FRM which contains a varchar primary key using utf8_general_ci. This is an incompatible FRM for 5.5. @ mysql-test/t/mysqlcheck.test Added regression test. @ sql/handler.h Added new HA_SUPPORTS_REPAIR flag. @ sql/share/errmsg-utf8.txt Added new error message ER_TABLE_NEEDS_REBUILD @ sql/sql_admin.cc Changed 'CHECK TABLE FOR UPDATE' to give ER_TABLE_NEEDS_REBUILD instead of ER_TABLE_NEEDS_UPGRADE if the engine does not support REPAIR (as indicated by the new HA_SUPPORTS_REPAIR flag). @ storage/archive/ha_archive.h Added new HA_SUPPORTS_REPAIR flag to Archive @ storage/csv/ha_tina.h Added new HA_SUPPORTS_REPAIR flag to CSV @ storage/federated/ha_federated.h Added new HA_SUPPORTS_REPAIR flag to Federated @ storage/myisam/ha_myisam.cc Added new HA_SUPPORTS_REPAIR flag to MyISAM added: mysql-test/std_data/bug47205.frm modified: client/mysqlcheck.c mysql-test/r/mysqlcheck.result mysql-test/t/mysqlcheck.test sql/handler.h sql/share/errmsg-utf8.txt sql/sql_admin.cc storage/archive/ha_archive.h storage/csv/ha_tina.h storage/federated/ha_federated.h storage/myisam/ha_myisam.cc === modified file 'client/mysqlcheck.c' --- a/client/mysqlcheck.c 2011-01-16 03:59:05 +0000 +++ b/client/mysqlcheck.c 2011-02-28 16:31:23 +0000 @@ -42,13 +42,13 @@ static char *opt_password = 0, *current_ *default_charset= 0, *current_host= 0; static char *opt_plugin_dir= 0, *opt_default_auth= 0; static int first_error = 0; -DYNAMIC_ARRAY tables4repair; +DYNAMIC_ARRAY tables4repair, tables4rebuild; #ifdef HAVE_SMEM static char *shared_memory_base_name=0; #endif static uint opt_protocol=0; -enum operations { DO_CHECK=1, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE }; +enum operations { DO_CHECK=1, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE, DO_REBUILD }; static struct my_option my_long_options[] = { @@ -626,6 +626,25 @@ static int fix_database_storage_name(con return rc; } +static int rebuild_table(const char *full_name) +{ + char qbuf[100 + NAME_LEN*4]; + int rc= 0; + const char *name= strchr(full_name, '.'); + if (name == NULL) + return 1; + sprintf(qbuf, "ALTER TABLE `%s` FORCE", name + 1); + if (mysql_query(sock, qbuf)) + { + fprintf(stderr, "Failed to %s\n", qbuf); + fprintf(stderr, "Error: %s\n", mysql_error(sock)); + rc= 1; + } + if (verbose) + printf("%-50s %s\n", name, rc ? "FAILED" : "OK"); + return rc; +} + static int process_one_db(char *database) { if (what_to_do == DO_UPGRADE) @@ -695,6 +714,8 @@ static int handle_request_for_tables(cha if (opt_extended) end = strmov(end, " EXTENDED"); if (opt_frm) end = strmov(end, " USE_FRM"); break; + case DO_REBUILD: + return rebuild_table(tables); case DO_ANALYZE: op= (opt_write_binlog) ? "ANALYZE" : "ANALYZE NO_WRITE_TO_BINLOG"; break; @@ -739,7 +760,7 @@ static void print_result() MYSQL_ROW row; char prev[NAME_LEN*2+2]; uint i; - my_bool found_error=0; + my_bool found_error=0, table_rebuild=0; res = mysql_use_result(sock); @@ -758,8 +779,14 @@ static void print_result() */ if (found_error && opt_auto_repair && what_to_do != DO_REPAIR && strcmp(row[3],"OK")) - insert_dynamic(&tables4repair, (uchar*) prev); + { + if (table_rebuild) + insert_dynamic(&tables4rebuild, (uchar*) prev); + else + insert_dynamic(&tables4repair, (uchar*) prev); + } found_error=0; + table_rebuild=0; if (opt_silent) continue; } @@ -770,6 +797,8 @@ static void print_result() printf("%s\n%-9s: %s", row[0], row[2], row[3]); if (strcmp(row[2],"note")) found_error=1; + if (opt_auto_repair && strncmp(row[3], "Table rebuild", 13) == 0) + table_rebuild=1; } else printf("%-9s: %s", row[2], row[3]); @@ -778,7 +807,12 @@ static void print_result() } /* add the last table to be repaired to the list */ if (found_error && opt_auto_repair && what_to_do != DO_REPAIR) - insert_dynamic(&tables4repair, (uchar*) prev); + { + if (table_rebuild) + insert_dynamic(&tables4rebuild, (uchar*) prev); + else + insert_dynamic(&tables4repair, (uchar*) prev); + } mysql_free_result(res); } @@ -876,7 +910,8 @@ int main(int argc, char **argv) } if (opt_auto_repair && - my_init_dynamic_array(&tables4repair, sizeof(char)*(NAME_LEN*2+2),16,64)) + (my_init_dynamic_array(&tables4repair, sizeof(char)*(NAME_LEN*2+2),16,64) || + my_init_dynamic_array(&tables4rebuild, sizeof(char)*(NAME_LEN*2+2),16,64))) { first_error = 1; goto end; @@ -894,7 +929,7 @@ int main(int argc, char **argv) { uint i; - if (!opt_silent && tables4repair.elements) + if (!opt_silent && (tables4repair.elements || tables4rebuild.elements)) puts("\nRepairing tables"); what_to_do = DO_REPAIR; for (i = 0; i < tables4repair.elements ; i++) @@ -902,11 +937,20 @@ int main(int argc, char **argv) char *name= (char*) dynamic_array_ptr(&tables4repair, i); handle_request_for_tables(name, fixed_name_length(name)); } + what_to_do = DO_REBUILD; + for (i = 0; i < tables4rebuild.elements ; i++) + { + char *name= (char*) dynamic_array_ptr(&tables4rebuild, i); + handle_request_for_tables(name, fixed_name_length(name)); + } } end: dbDisconnect(current_host); if (opt_auto_repair) + { delete_dynamic(&tables4repair); + delete_dynamic(&tables4rebuild); + } my_free(opt_password); #ifdef HAVE_SMEM my_free(shared_memory_base_name); === modified file 'mysql-test/r/mysqlcheck.result' --- a/mysql-test/r/mysqlcheck.result 2010-12-17 11:11:34 +0000 +++ b/mysql-test/r/mysqlcheck.result 2011-02-28 16:31:23 +0000 @@ -260,3 +260,41 @@ End of 5.1 tests # # Bug #35269: mysqlcheck behaves different depending on order of parameters # +# +# Bug#11755431 47205: MAP 'REPAIR TABLE' TO RECREATE +ANALYZE FOR +# ENGINES NOT SUPPORTING NATIVE +# +DROP TABLE IF EXISTS bug47205; +# +# Test 1: InnoDB - REPAIR not supported +CREATE TABLE bug47205(a VARCHAR(20) PRIMARY KEY) +DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci engine=innodb; +# Should indicate that ALTER TABLE .. FORCE is needed +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check error Table rebuild required. Please do "ALTER TABLE `bug47205` FORCE" or dump/reload to fix it! +test.bug47205 +error : Table rebuild required. Please do "ALTER TABLE `bug47205` FORCE" or dump/reload to fix it! + +Repairing tables +# Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check status OK +DROP TABLE bug47205; +# +# Test 2: MyISAM - REPAIR supported +# Should indicate that REPAIR TABLE is needed +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check error Table upgrade required. Please do "REPAIR TABLE `bug47205`" or dump/reload to fix it! +test.bug47205 +error : Table upgrade required. Please do "REPAIR TABLE `bug47205`" or dump/reload to fix it! + +Repairing tables +test.bug47205 OK +# Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; +Table Op Msg_type Msg_text +test.bug47205 check status OK +DROP TABLE bug47205; === added file 'mysql-test/std_data/bug47205.frm' Binary files a/mysql-test/std_data/bug47205.frm 1970-01-01 00:00:00 +0000 and b/mysql-test/std_data/bug47205.frm 2011-02-28 16:31:23 +0000 differ === modified file 'mysql-test/t/mysqlcheck.test' --- a/mysql-test/t/mysqlcheck.test 2010-10-08 07:09:47 +0000 +++ b/mysql-test/t/mysqlcheck.test 2011-02-28 16:31:23 +0000 @@ -229,3 +229,49 @@ drop table `t1-1`; --error 1 --exec $MYSQL_CHECK -aoc test "#mysql50#t1-1" + +--echo # +--echo # Bug#11755431 47205: MAP 'REPAIR TABLE' TO RECREATE +ANALYZE FOR +--echo # ENGINES NOT SUPPORTING NATIVE +--echo # + +--disable_warnings +DROP TABLE IF EXISTS bug47205; +--enable_warnings + +--echo # +--echo # Test 1: InnoDB - REPAIR not supported + +CREATE TABLE bug47205(a VARCHAR(20) PRIMARY KEY) + DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci engine=innodb; + +let $MYSQLD_DATADIR= `select @@datadir`; +--remove_file $MYSQLD_DATADIR/test/bug47205.frm +--copy_file std_data/bug47205.frm $MYSQLD_DATADIR/test/bug47205.frm + +--echo # Should indicate that ALTER TABLE .. FORCE is needed +CHECK TABLE bug47205 FOR UPGRADE; + +--exec $MYSQL_CHECK --check --auto-repair test + +--echo # Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; + +DROP TABLE bug47205; + +--echo # +--echo # Test 2: MyISAM - REPAIR supported + +--copy_file std_data/bug36055.frm $MYSQLD_DATADIR/test/bug47205.frm +--copy_file std_data/bug36055.MYD $MYSQLD_DATADIR/test/bug47205.MYD +--copy_file std_data/bug36055.MYI $MYSQLD_DATADIR/test/bug47205.MYI + +--echo # Should indicate that REPAIR TABLE is needed +CHECK TABLE bug47205 FOR UPGRADE; + +--exec $MYSQL_CHECK --check --auto-repair test + +--echo # Table should now be ok +CHECK TABLE bug47205 FOR UPGRADE; + +DROP TABLE bug47205; === modified file 'sql/handler.h' --- a/sql/handler.h 2011-01-26 13:23:29 +0000 +++ b/sql/handler.h 2011-02-28 16:31:23 +0000 @@ -153,6 +153,7 @@ ordered. */ #define HA_DUPLICATE_KEY_NOT_IN_ORDER (LL(1) << 36) +#define HA_SUPPORTS_REPAIR (LL(1) << 37) /* Set of all binlog flags. Currently only contain the capabilities @@ -2010,7 +2011,10 @@ private: upon the table. */ virtual int repair(THD* thd, HA_CHECK_OPT* check_opt) - { return HA_ADMIN_NOT_IMPLEMENTED; } + { + DBUG_ASSERT(!(ha_table_flags() & HA_SUPPORTS_REPAIR)); + return HA_ADMIN_NOT_IMPLEMENTED; + } virtual void start_bulk_insert(ha_rows rows) {} virtual int end_bulk_insert() { return 0; } virtual int index_read(uchar * buf, const uchar * key, uint key_len, === modified file 'sql/share/errmsg-utf8.txt' --- a/sql/share/errmsg-utf8.txt 2011-02-21 15:49:03 +0000 +++ b/sql/share/errmsg-utf8.txt 2011-02-28 16:31:23 +0000 @@ -6397,3 +6397,6 @@ ER_STMT_CACHE_FULL ER_MULTI_UPDATE_KEY_CONFLICT eng "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'." + +ER_TABLE_NEEDS_REBUILD + eng "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!" === modified file 'sql/sql_admin.cc' --- a/sql/sql_admin.cc 2011-01-10 13:12:23 +0000 +++ b/sql/sql_admin.cc 2011-02-28 16:31:23 +0000 @@ -771,8 +771,12 @@ send_result_message: size_t length; protocol->store(STRING_WITH_LEN("error"), system_charset_info); - length=my_snprintf(buf, sizeof(buf), ER(ER_TABLE_NEEDS_UPGRADE), - table->table_name); + if (table->table->file->ha_table_flags() & HA_SUPPORTS_REPAIR) + length=my_snprintf(buf, sizeof(buf), ER(ER_TABLE_NEEDS_UPGRADE), + table->table_name); + else + length=my_snprintf(buf, sizeof(buf), ER(ER_TABLE_NEEDS_REBUILD), + table->table_name); protocol->store(buf, length, system_charset_info); fatal_error=1; break; === modified file 'storage/archive/ha_archive.h' --- a/storage/archive/ha_archive.h 2010-10-06 14:34:28 +0000 +++ b/storage/archive/ha_archive.h 2011-02-28 16:31:23 +0000 @@ -90,7 +90,7 @@ public: return (HA_NO_TRANSACTIONS | HA_REC_NOT_IN_SEQ | HA_CAN_BIT_FIELD | HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | HA_STATS_RECORDS_IS_EXACT | - HA_HAS_RECORDS | + HA_HAS_RECORDS | HA_SUPPORTS_REPAIR | HA_FILE_BASED | HA_CAN_INSERT_DELAYED | HA_CAN_GEOMETRY); } ulong index_flags(uint idx, uint part, bool all_parts) const === modified file 'storage/csv/ha_tina.h' --- a/storage/csv/ha_tina.h 2010-07-08 21:20:08 +0000 +++ b/storage/csv/ha_tina.h 2011-02-28 16:31:23 +0000 @@ -106,7 +106,8 @@ public: ulonglong table_flags() const { return (HA_NO_TRANSACTIONS | HA_REC_NOT_IN_SEQ | HA_NO_AUTO_INCREMENT | - HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE); + HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | + HA_SUPPORTS_REPAIR); } ulong index_flags(uint idx, uint part, bool all_parts) const { === modified file 'storage/federated/ha_federated.h' --- a/storage/federated/ha_federated.h 2010-10-06 14:34:28 +0000 +++ b/storage/federated/ha_federated.h 2011-02-28 16:31:23 +0000 @@ -149,7 +149,8 @@ public: HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | HA_NO_PREFIX_CHAR_KEYS | HA_PRIMARY_KEY_REQUIRED_FOR_DELETE | HA_NO_TRANSACTIONS /* until fixed by WL#2952 */ | - HA_PARTIAL_COLUMN_READ | HA_NULL_IN_KEY); + HA_PARTIAL_COLUMN_READ | HA_NULL_IN_KEY | + HA_SUPPORTS_REPAIR); } /* This is a bitmap of flags that says how the storage engine === modified file 'storage/myisam/ha_myisam.cc' --- a/storage/myisam/ha_myisam.cc 2011-01-11 09:07:37 +0000 +++ b/storage/myisam/ha_myisam.cc 2011-02-28 16:31:23 +0000 @@ -639,7 +639,7 @@ ha_myisam::ha_myisam(handlerton *hton, T HA_DUPLICATE_POS | HA_CAN_INDEX_BLOBS | HA_AUTO_PART_KEY | HA_FILE_BASED | HA_CAN_GEOMETRY | HA_NO_TRANSACTIONS | HA_CAN_INSERT_DELAYED | HA_CAN_BIT_FIELD | HA_CAN_RTREEKEYS | - HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT), + HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT | HA_SUPPORTS_REPAIR), can_enable_indexes(1) {} --===============5862137273778068985== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/jon.hauglid@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: jon.hauglid@stripped # target_branch: file:///export/home/x/mysql-5.5-bug11755431/ # testament_sha1: 6b034aaba52022f3dd4b679e52c6f02244fd50ae # timestamp: 2011-02-28 17:31:29 +0100 # base_revision_id: tor.didriksen@stripped\ # qmhcbs7oyzdgiyyy # # Begin bundle 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 OIaA --===============5862137273778068985==--