mariadb/mysql-test/t/repair.test
unknown e7e49eb69e 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".
2008-05-12 21:01:13 +05:00

145 lines
4.5 KiB
Text

#
# Test of repair table
#
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1 SELECT 1,"table 1";
repair table t1 use_frm;
alter table t1 ENGINE=HEAP;
repair table t1 use_frm;
drop table t1;
#
# disabled keys during repair
#
create table t1(id int PRIMARY KEY, st varchar(10), KEY st_key(st));
insert into t1 values(1, "One");
alter table t1 disable keys;
show keys from t1;
repair table t1 extended;
show keys from t1;
drop table t1;
# non-existent table
repair table t1 use_frm;
create table t1 engine=myisam SELECT 1,"table 1";
flush tables;
system echo 1 > $MYSQLTEST_VARDIR/master-data/test/t1.MYI ;
repair table t1;
repair table t1 use_frm;
drop table t1;
#
# BUG#18874 - Setting myisam_repair_threads > 1, index cardinality always 1
#
CREATE TABLE t1(a INT, KEY(a));
INSERT INTO t1 VALUES(1),(2),(3),(4),(5);
SET myisam_repair_threads=2;
REPAIR TABLE t1;
SHOW INDEX FROM t1;
SET myisam_repair_threads=@@global.myisam_repair_threads;
DROP TABLE t1;
#
# BUG#22562 - REPAIR TABLE .. USE_FRM causes server crash on Windows and
# server hangs on Linux
#
CREATE TABLE t1(a INT);
USE mysql;
REPAIR TABLE test.t1 USE_FRM;
USE test;
DROP TABLE t1;
#
# BUG#23175 - MYISAM crash/repair failed during repair
#
CREATE TABLE t1(a CHAR(255), KEY(a));
SET myisam_sort_buffer_size=4096;
INSERT INTO t1 VALUES
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0');
SET myisam_repair_threads=2;
REPAIR TABLE t1;
SET myisam_repair_threads=@@global.myisam_repair_threads;
SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
DROP TABLE t1;
#
# BUG#31174 - "Repair" command on MyISAM crashes with small
# myisam_sort_buffer_size
#
CREATE TABLE t1(a CHAR(255), KEY(a));
SET myisam_sort_buffer_size=4496;
INSERT INTO t1 VALUES
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),
('0'),('0'),('0'),('0'),('0'),('0'),('0');
SET myisam_repair_threads=2;
REPAIR TABLE t1;
SET myisam_repair_threads=@@global.myisam_repair_threads;
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;