2765 Ramil Kalimullin 2008-10-08
Fix for bug#39585: innodb and myisam corruption after binary
upgrade from <=5.0.46 to >=5.0.48
Problem: 'check table .. for upgrade' doesn't detect
incompatible collation changes made in 5.0.48.
Fix: check for incompatible collation changes.
modified:
sql/handler.cc
sql/handler.h
2764 Mats Kindahl 2008-10-08 [merge]
Merging with 5.1-5.1.29-rc
removed:
mysql-test/suite/funcs_1/r/memory_storedproc.result
mysql-test/suite/funcs_1/r/myisam_storedproc.result
mysql-test/suite/funcs_1/r/ndb_storedproc.result
mysql-test/suite/funcs_1/t/innodb_storedproc.test
mysql-test/suite/funcs_1/t/memory_storedproc.test
mysql-test/suite/funcs_1/t/myisam_storedproc.test
mysql-test/suite/funcs_1/t/ndb_storedproc.test
added:
mysql-test/suite/funcs_1/storedproc/param_check.inc
renamed:
mysql-test/suite/funcs_1/r/innodb_storedproc.result =>
mysql-test/suite/funcs_1/r/storedproc.result
mysql-test/suite/funcs_1/storedproc/storedproc_master.inc =>
mysql-test/suite/funcs_1/t/storedproc.test
modified:
configure.in
include/hash.h
mysql-test/include/index_merge1.inc
mysql-test/mysql-test-run.pl
mysql-test/r/create.result
mysql-test/r/federated_bug_25714.result
mysql-test/r/index_merge_myisam.result
mysql-test/r/information_schema_db.result
mysql-test/r/join.result
mysql-test/r/partition.result
mysql-test/r/slow_launch_time_func.result
mysql-test/r/status.result
mysql-test/r/trigger-trans.result
mysql-test/suite/binlog/t/binlog_killed.test
mysql-test/suite/funcs_1/views/func_view.inc
mysql-test/suite/rpl/r/rpl_temporary.result
mysql-test/suite/rpl/t/rpl_temporary.test
mysql-test/t/create.test
mysql-test/t/disabled.def
mysql-test/t/federated_bug_25714.test
mysql-test/t/information_schema_db.test
mysql-test/t/join.test
mysql-test/t/partition.test
mysql-test/t/slow_launch_time_func.test
mysql-test/t/status.test
mysql-test/t/trigger-trans.test
mysys/hash.c
scripts/mysql_system_tables_data.sql
sql/handler.cc
sql/handler.h
sql/mysql_priv.h
sql/opt_range.cc
sql/sp_head.cc
sql/sql_base.cc
sql/sql_parse.cc
sql/sql_show.cc
sql/sql_yacc.yy
mysql-test/suite/funcs_1/r/storedproc.result
mysql-test/suite/funcs_1/t/storedproc.test
=== modified file 'sql/handler.cc'
--- a/sql/handler.cc 2008-10-08 11:37:13 +0000
+++ b/sql/handler.cc 2008-10-08 13:52:57 +0000
@@ -2752,8 +2752,53 @@ bool handler::get_error_message(int erro
}
+/**
+ Check for incompatible collation changes.
+
+ @retval
+ HA_ADMIN_NEEDS_UPGRADE Table may have data requiring upgrade.
+ @retval
+ 0 No upgrade required.
+*/
+
+int handler::check_collation_compatibility()
+{
+ ulong mysql_version= table->s->mysql_version;
+
+ if (mysql_version < 50048)
+ {
+ KEY *key= table->key_info;
+ KEY *key_end= key + table->s->keys;
+ for (; key < key_end; key++)
+ {
+ KEY_PART_INFO *key_part= key->key_part;
+ KEY_PART_INFO *key_part_end= key_part + key->key_parts;
+ for (; key_part < key_part_end; key_part++)
+ {
+ if (!key_part->fieldnr)
+ continue;
+ Field *field= table->field[key_part->fieldnr - 1];
+ uint cs_number= field->charset()->number;
+ if (mysql_version < 50048 &&
+ (cs_number == 11 || /* ascii_general_ci - bug #29499, bug #27562 */
+ cs_number == 41 || /* latin7_general_ci - bug #29461 */
+ cs_number == 42 || /* latin7_general_cs - bug #29461 */
+ cs_number == 20 || /* latin7_estonian_cs - bug #29461 */
+ cs_number == 21 || /* latin2_hungarian_ci - bug #29461 */
+ cs_number == 22 || /* koi8u_general_ci - bug #29461 */
+ cs_number == 23 || /* cp1251_ukrainian_ci - bug #29461 */
+ cs_number == 26)) /* cp1250_general_ci - bug #29461 */
+ return HA_ADMIN_NEEDS_UPGRADE;
+ }
+ }
+ }
+ return 0;
+}
+
+
int handler::ha_check_for_upgrade(HA_CHECK_OPT *check_opt)
{
+ int error;
KEY *keyinfo, *keyend;
KEY_PART_INFO *keypart, *keypartend;
@@ -2782,6 +2827,10 @@ int handler::ha_check_for_upgrade(HA_CHE
}
if (table->s->frm_version != FRM_VER_TRUE_VARCHAR)
return HA_ADMIN_NEEDS_ALTER;
+
+ if ((error= check_collation_compatibility()))
+ return error;
+
return check_for_upgrade(check_opt);
}
=== modified file 'sql/handler.h'
--- a/sql/handler.h 2008-10-08 07:46:30 +0000
+++ b/sql/handler.h 2008-10-08 13:52:57 +0000
@@ -1211,6 +1211,7 @@ public:
int ha_delete_row(const uchar * buf);
void ha_release_auto_increment();
+ int check_collation_compatibility();
int ha_check_for_upgrade(HA_CHECK_OPT *check_opt);
/** to be actually called to get 'check()' functionality*/
int ha_check(THD *thd, HA_CHECK_OPT *check_opt);
| Thread |
|---|
| • bzr push into mysql-5.1 branch (ramil:2764 to 2765) Bug#39585 | Ramil Kalimullin | 8 Oct |