summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
-rw-r--r--sql/handler.cc2
-rw-r--r--sql/sql_table.cc7
7 files changed, 75 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;
diff --git a/sql/handler.cc b/sql/handler.cc
index bfad10f986f..40b85a0901c 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -1980,6 +1980,8 @@ int handler::ha_check_for_upgrade(HA_CHECK_OPT *check_opt)
}
}
}
+ if (table->s->frm_version != FRM_VER_TRUE_VARCHAR)
+ return HA_ADMIN_NEEDS_ALTER;
return check_for_upgrade(check_opt);
}
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 9e1a8151e3a..f1de63892d5 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -2118,6 +2118,13 @@ static int prepare_for_repair(THD* thd, TABLE_LIST *table_list,
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