List:Commits« Previous MessageNext Message »
From:<gshchepa Date:May 12 2008 6:01pm
Subject:bk commit into 5.0 tree (gshchepa:1.2614) BUG#36055
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of gshchepa.  When gshchepa does a push these changes
will be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2008-05-12 21:01:13+05:00, gshchepa@stripped +7 -0
  Fixed bug #36055: mysql_upgrade doesn't really 'upgrade' tables
  
  The REPAIR TABLE ... USE_FRM query silently corrupts data of tables
  with old .FRM file version.
  The mysql_upgrade client program or the REPAIR TABLE query (without
  the USE_FRM clause) can't prevent this trouble, because in the
  common case they don't upgrade .FRM file to compatible structure.
  
  1. Evaluation of the REPAIR TABLE ... USE_FRM query has been
     modified to reject such tables with the message:
     "Failed repairing incompatible .FRM file".
  
  2. REPAIR TABLE query (without USE_FRM clause) evaluation has been
     modified to upgrade .FRM files to current version.
  
  3. CHECK TABLE ... FOR UPGRADE query evaluation has been modified
     to return error status when .FRM file has incompatible version.
  
  4. mysql_upgrade and mysqlcheck client programs call CHECK TABLE
     FOR UPGRADE and REPAIR TABLE queries, so their behaviors have
     been changed too to upgrade .FRM files with incompatible
     version numbers.

  mysql-test/r/repair.result@stripped, 2008-05-12 20:59:09+05:00, gshchepa@stripped +36 -0
    Added test case for bug# 36055.

  mysql-test/std_data/bug36055.MYD@stripped, 2008-05-12 20:04:32+05:00, gshchepa@stripped +2 -0
    Added test data for bug #36055.

  mysql-test/std_data/bug36055.MYD@stripped, 2008-05-12 20:04:32+05:00, gshchepa@stripped +0 -0

  mysql-test/std_data/bug36055.MYI@stripped, 2008-05-12 20:04:32+05:00, gshchepa@stripped +24
-0
    Added test data for bug #36055.

  mysql-test/std_data/bug36055.MYI@stripped, 2008-05-12 20:04:32+05:00, gshchepa@stripped +0 -0

  mysql-test/std_data/bug36055.frm@stripped, 2008-05-12 20:04:32+05:00, gshchepa@stripped +192
-0
    Added test data for bug #36055.

  mysql-test/std_data/bug36055.frm@stripped, 2008-05-12 20:04:32+05:00, gshchepa@stripped +0 -0

  mysql-test/t/repair.test@stripped, 2008-05-12 20:59:13+05:00, gshchepa@stripped +30 -0
    Added test case for bug# 36055.

  sql/handler.cc@stripped, 2008-05-12 20:59:15+05:00, gshchepa@stripped +2 -0
    Fixed bug #36055: mysql_upgrade doesn't really 'upgrade' tables
    
    The handler::ha_check_for_upgrade method has been modified to
    return error if .FRM file has incompatible version number.

  sql/sql_table.cc@stripped, 2008-05-12 20:59:16+05:00, gshchepa@stripped +7 -0
    Fixed bug #36055: mysql_upgrade doesn't really 'upgrade' tables
    
    The prepare_for_repair function has been modified to reject
    REPAIR TABLE ... USE_FRM queries on incompatible .FRM files
    with the message: "Failed repairing incompatible .FRM file".

diff -Nrup a/mysql-test/r/repair.result b/mysql-test/r/repair.result
--- a/mysql-test/r/repair.result	2007-10-17 11:31:59 +05:00
+++ b/mysql-test/r/repair.result	2008-05-12 20:59:09 +05:00
@@ -115,3 +115,39 @@ SET myisam_repair_threads=@@global.myisa
 SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
 DROP TABLE t1;
 End of 4.1 tests
+# Test with a saved table from 4.1
+SHOW TABLE STATUS LIKE 't1';
+Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
+t1	MyISAM	9	Fixed	2	5	10	21474836479	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
+SELECT * FROM t1;
+id
+1
+2
+# Run CHECK TABLE, it should indicate table need a REPAIR TABLE
+CHECK TABLE t1 FOR UPGRADE;
+Table	Op	Msg_type	Msg_text
+test.t1	check	error	Table upgrade required. Please do "REPAIR TABLE `t1`" to fix it!
+# REPAIR old table USE_FRM should fail
+REPAIR TABLE t1 USE_FRM;
+Table	Op	Msg_type	Msg_text
+t1	repair	error	Failed reparing incompatible .FRM file
+# Run REPAIR TABLE to upgrade .frm file
+REPAIR TABLE t1;
+Table	Op	Msg_type	Msg_text
+test.t1	repair	status	OK
+SHOW TABLE STATUS LIKE 't1';
+Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment
+t1	MyISAM	10	Fixed	2	7	14	1970324836974591	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL		
+SELECT * FROM t1;
+id
+1
+2
+REPAIR TABLE t1 USE_FRM;
+Table	Op	Msg_type	Msg_text
+test.t1	repair	warning	Number of rows changed from 0 to 2
+test.t1	repair	status	OK
+SELECT * FROM t1;
+id
+1
+2
+DROP TABLE t1;
Binary files a/mysql-test/std_data/bug36055.MYD and b/mysql-test/std_data/bug36055.MYD
differ
Binary files a/mysql-test/std_data/bug36055.MYI and b/mysql-test/std_data/bug36055.MYI
differ
Binary files a/mysql-test/std_data/bug36055.frm and b/mysql-test/std_data/bug36055.frm
differ
diff -Nrup a/mysql-test/t/repair.test b/mysql-test/t/repair.test
--- a/mysql-test/t/repair.test	2007-10-17 11:31:59 +05:00
+++ b/mysql-test/t/repair.test	2008-05-12 20:59:13 +05:00
@@ -113,3 +113,33 @@ SET myisam_sort_buffer_size=@@global.myi
 DROP TABLE t1;
 
 --echo End of 4.1 tests
+
+#
+# BUG#36055 - mysql_upgrade doesn't really 'upgrade' tables
+#
+
+--echo # Test with a saved table from 4.1
+--copy_file std_data/bug36055.frm $MYSQLTEST_VARDIR/master-data/test/t1.frm
+--copy_file std_data/bug36055.MYD $MYSQLTEST_VARDIR/master-data/test/t1.MYD
+--copy_file std_data/bug36055.MYI $MYSQLTEST_VARDIR/master-data/test/t1.MYI
+
+--replace_column 12 # 13 #
+SHOW TABLE STATUS LIKE 't1';
+SELECT * FROM t1;
+
+--echo # Run CHECK TABLE, it should indicate table need a REPAIR TABLE
+CHECK TABLE t1 FOR UPGRADE;
+
+--echo # REPAIR old table USE_FRM should fail
+REPAIR TABLE t1 USE_FRM;
+
+--echo # Run REPAIR TABLE to upgrade .frm file
+REPAIR TABLE t1;
+--replace_column 12 # 13 #
+SHOW TABLE STATUS LIKE 't1';
+SELECT * FROM t1;
+
+REPAIR TABLE t1 USE_FRM;
+SELECT * FROM t1;
+
+DROP TABLE t1;
diff -Nrup a/sql/handler.cc b/sql/handler.cc
--- a/sql/handler.cc	2008-02-07 06:09:59 +04:00
+++ b/sql/handler.cc	2008-05-12 20:59:15 +05:00
@@ -1980,6 +1980,8 @@ int handler::ha_check_for_upgrade(HA_CHE
       }
     }
   }
+  if (table->s->frm_version != FRM_VER_TRUE_VARCHAR)
+    return HA_ADMIN_NEEDS_ALTER;
   return check_for_upgrade(check_opt);
 }
 
diff -Nrup a/sql/sql_table.cc b/sql/sql_table.cc
--- a/sql/sql_table.cc	2008-01-23 19:01:29 +04:00
+++ b/sql/sql_table.cc	2008-05-12 20:59:16 +05:00
@@ -2118,6 +2118,13 @@ static int prepare_for_repair(THD* thd, 
   const char **ext= table->file->bas_ext();
   MY_STAT stat_info;
 
+  if (table->s->frm_version != FRM_VER_TRUE_VARCHAR)
+  {
+    error= send_check_errmsg(thd, table_list, "repair",
+                             "Failed reparing incompatible .FRM file");
+    goto end;
+  }
+
   /*
     Check if this is a table type that stores index and data separately,
     like ISAM or MyISAM. We assume fixed order of engine file name
Thread
bk commit into 5.0 tree (gshchepa:1.2614) BUG#36055gshchepa12 May 2008