summaryrefslogtreecommitdiff
path: root/mysql-test
diff options
context:
space:
mode:
authorunknown <gshchepa/uchum@host.loc>2008-05-12 21:01:13 +0500
committerunknown <gshchepa/uchum@host.loc>2008-05-12 21:01:13 +0500
commite7e49eb69ee6ca949d8f885505da572bb1d394c4 (patch)
treec199105fc93fb719a3a0fc021e64ed6662c0b00e /mysql-test
parent89b866e7bfc8965046626844ee22ecd5b4e5a774 (diff)
downloadmariadb-git-e7e49eb69ee6ca949d8f885505da572bb1d394c4.tar.gz
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/std_data/bug36055.MYD: Added test data for bug #36055. mysql-test/std_data/bug36055.MYI: Added test data for bug #36055. mysql-test/std_data/bug36055.frm: Added test data for bug #36055. mysql-test/r/repair.result: Added test case for bug# 36055. mysql-test/t/repair.test: Added test case for bug# 36055. sql/handler.cc: 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: 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".
Diffstat (limited to 'mysql-test')
-rw-r--r--mysql-test/r/repair.result36
-rw-r--r--mysql-test/std_data/bug36055.MYDbin0 -> 10 bytes
-rw-r--r--mysql-test/std_data/bug36055.MYIbin0 -> 1024 bytes
-rw-r--r--mysql-test/std_data/bug36055.frmbin0 -> 8556 bytes
-rw-r--r--mysql-test/t/repair.test30
5 files changed, 66 insertions, 0 deletions
diff --git a/mysql-test/r/repair.result b/mysql-test/r/repair.result
index e0548233b86..c59a5300e64 100644
--- a/mysql-test/r/repair.result
+++ b/mysql-test/r/repair.result
@@ -115,3 +115,39 @@ SET myisam_repair_threads=@@global.myisam_repair_threads;
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;
diff --git a/mysql-test/std_data/bug36055.MYD b/mysql-test/std_data/bug36055.MYD
new file mode 100644
index 00000000000..4932a077113
--- /dev/null
+++ b/mysql-test/std_data/bug36055.MYD
Binary files differ
diff --git a/mysql-test/std_data/bug36055.MYI b/mysql-test/std_data/bug36055.MYI
new file mode 100644
index 00000000000..531c505c102
--- /dev/null
+++ b/mysql-test/std_data/bug36055.MYI
Binary files differ
diff --git a/mysql-test/std_data/bug36055.frm b/mysql-test/std_data/bug36055.frm
new file mode 100644
index 00000000000..11c9cb31dad
--- /dev/null
+++ b/mysql-test/std_data/bug36055.frm
Binary files differ
diff --git a/mysql-test/t/repair.test b/mysql-test/t/repair.test
index 9870e1749b3..4af0895827c 100644
--- a/mysql-test/t/repair.test
+++ b/mysql-test/t/repair.test
@@ -113,3 +113,33 @@ SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
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;