# REPAIR USE_FRM is not implemented for partitioned tables.
# test of non partitioned myisam for reference
CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM;
INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
FLUSH TABLES;
# replacing t1.MYI with a corrupt + unclosed one created by doing:
# 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI 
CHECK TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	error	Size of indexfile is: 1024        Should be: 2048
test.t1_will_crash	check	warning	Size of datafile is: 77       Should be: 7
test.t1_will_crash	check	error	Corrupt
REPAIR TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	warning	Number of rows changed from 1 to 11
test.t1_will_crash	repair	status	OK
SELECT * FROM t1_will_crash;
a
1
2
3
4
5
6
7
8
9
10
11
DROP TABLE t1_will_crash;
# test of check/repair of a damaged partition's MYI-file
CREATE TABLE t1_will_crash (a INT, KEY (a))
ENGINE=MyISAM
PARTITION BY HASH (a)
PARTITIONS 3;
INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
FLUSH TABLES;
# test with CHECK/REPAIR TABLE
# replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing:
# 'create table t1 (a int key(a)) partition by hash (a) partitions 3'
# head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI 
CHECK TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	error	Size of indexfile is: 1024        Should be: 2048
test.t1_will_crash	check	warning	Size of datafile is: 28       Should be: 7
test.t1_will_crash	check	error	Partition p1 returned error
test.t1_will_crash	check	error	Corrupt
REPAIR TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	warning	Number of rows changed from 1 to 4
test.t1_will_crash	repair	status	OK
SELECT * FROM t1_will_crash;
a
1
2
3
4
5
6
7
8
9
10
11
FLUSH TABLES;
# test with ALTER TABLE ... CHECK/REPAIR PARTITION
# replacing t1_will_crash#P#p1.MYI with a corrupt + unclosed one
ALTER TABLE t1_will_crash CHECK PARTITION p0, p2;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	status	OK
ALTER TABLE t1_will_crash CHECK PARTITION p0, p1;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	error	Size of indexfile is: 1024        Should be: 2048
test.t1_will_crash	check	warning	Size of datafile is: 28       Should be: 7
test.t1_will_crash	check	error	Partition p1 returned error
test.t1_will_crash	check	error	Corrupt
ALTER TABLE t1_will_crash CHECK PARTITION p1, p2;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	Table is marked as crashed
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	error	Size of indexfile is: 1024        Should be: 2048
test.t1_will_crash	check	warning	Size of datafile is: 28       Should be: 7
test.t1_will_crash	check	error	Partition p1 returned error
test.t1_will_crash	check	error	Corrupt
ALTER TABLE t1_will_crash REPAIR PARTITION p0, p2;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	status	OK
ALTER TABLE t1_will_crash REPAIR PARTITION p0, p1;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	warning	Number of rows changed from 1 to 4
test.t1_will_crash	repair	status	OK
SELECT * FROM t1_will_crash;
a
1
2
3
4
5
6
7
8
9
10
11
DROP TABLE t1_will_crash;
# test of check/repair of a damaged subpartition's MYI-file
CREATE TABLE t1_will_crash (a INT, KEY (a))
ENGINE=MyISAM
PARTITION BY RANGE (a)
SUBPARTITION BY HASH (a)
SUBPARTITIONS 2
(PARTITION p0 VALUES LESS THAN (7),
PARTITION p1 VALUES LESS THAN MAXVALUE);
INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11);
SELECT * FROM t1_will_crash;
a
1
2
3
4
5
6
7
8
9
10
11
FLUSH TABLES;
# test with CHECK/REPAIR TABLE
# replacing t1_will_crash#P#p1#SP#p1sp0.MYI with a corrupt + unclosed one
CHECK TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	error	Size of indexfile is: 1024        Should be: 2048
test.t1_will_crash	check	warning	Size of datafile is: 14       Should be: 7
test.t1_will_crash	check	error	Subpartition p1sp0 returned error
test.t1_will_crash	check	error	Corrupt
REPAIR TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	warning	Number of rows changed from 1 to 2
test.t1_will_crash	repair	status	OK
SELECT * FROM t1_will_crash;
a
1
2
3
4
5
6
7
8
9
10
11
FLUSH TABLES;
# test with ALTER TABLE ... CHECK/REPAIR PARTITION
# replacing t1_will_crash#P#p1#SP#p1sp0.MYI with a corrupt + unclosed one
ALTER TABLE t1_will_crash CHECK PARTITION p0;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	status	OK
ALTER TABLE t1_will_crash CHECK PARTITION all;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	error	Size of indexfile is: 1024        Should be: 2048
test.t1_will_crash	check	warning	Size of datafile is: 14       Should be: 7
test.t1_will_crash	check	error	Subpartition p1sp0 returned error
test.t1_will_crash	check	error	Corrupt
ALTER TABLE t1_will_crash CHECK PARTITION p1;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	Table is marked as crashed
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	error	Size of indexfile is: 1024        Should be: 2048
test.t1_will_crash	check	warning	Size of datafile is: 14       Should be: 7
test.t1_will_crash	check	error	Subpartition p1sp0 returned error
test.t1_will_crash	check	error	Corrupt
ALTER TABLE t1_will_crash REPAIR PARTITION p0;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	status	OK
ALTER TABLE t1_will_crash REPAIR PARTITION p0, p1;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	warning	Number of rows changed from 1 to 2
test.t1_will_crash	repair	status	OK
SELECT * FROM t1_will_crash;
a
1
2
3
4
5
6
7
8
9
10
11
DROP TABLE t1_will_crash;
# test of check/repair of crashed partitions in variuos states
CREATE TABLE t1_will_crash (
a VARCHAR(255),
b INT,
c LONGTEXT,
PRIMARY KEY (a, b))
ENGINE=MyISAM
PARTITION BY HASH (b)
PARTITIONS 7;
SELECT COUNT(*) FROM t1_will_crash;
COUNT(*)
33
SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7);
partition	rows
0	2
1	5
2	5
3	5
4	4
5	4
6	8
SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a;
partition	b	a	length(c)
0	0	 lost	64
0	7	z lost	64
1	1	abc	64
1	8	tuw	64
1	29	kkkkkkkkKkk	64
1	71	1 broken when head -c1024 on datafile	1024
1	71	eee	64
2	2	def	64
2	9	vxy	64
2	23	lll	64
2	30	2 crashed after _mi_mark_changed	64
2	79	ccc	64
3	3	ghi	64
3	10	aaa	64
3	17	nnn	64
3	24	3 crashed after write_record	64
3	73	ddd	64
4	4	pqr	64
4	11	bbb	64
4	18	4 crashed after flush_cached_blocks	64
4	67	fff	64
5	5	mno	64
5	19	mmm	64
5	40	5 still here since crash in next row in multirow insert?	64
5	89	a	64
6	6	jkl	64
6	13	ooo	64
6	27	6 row 7 (crash before completely written to datafile)	128
6	34	6 row 2	64
6	48	6 row 4	64
6	62	6 row 6	64
6	83	 	64
6	97	zzzzzZzzzzz	64
FLUSH TABLES;
# truncating p0 to simulate an empty datafile (not recovered!)
# replacing p1 with only the first 1024 bytes (not recovered!)
# replacing p3 with a crashed one at the last row in first insert
# (crashed right after *share->write_record())
# replacing p6 with a crashed MYD file (1) (splitted dynamic record)
ANALYZE TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	analyze	status	OK
OPTIMIZE TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	optimize	warning	Number of rows changed from 8 to 7
test.t1_will_crash	optimize	status	OK
CHECK TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	error	Size of datafile is: 0         Should be: 164
test.t1_will_crash	check	error	Partition p0 returned error
test.t1_will_crash	check	error	Corrupt
REPAIR TABLE t1_will_crash;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	warning	Number of rows changed from 2 to 0
test.t1_will_crash	repair	info	Found block that points outside data file at 344
test.t1_will_crash	repair	warning	Number of rows changed from 5 to 4
test.t1_will_crash	repair	warning	Number of rows changed from 0 to 5
test.t1_will_crash	repair	status	OK
SELECT COUNT(*) FROM t1_will_crash;
COUNT(*)
29
SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7);
partition	rows
1	4
2	5
3	5
4	4
5	4
6	7
SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a;
partition	b	a	length(c)
1	1	abc	64
1	8	tuw	64
1	29	kkkkkkkkKkk	64
1	71	eee	64
2	2	def	64
2	9	vxy	64
2	23	lll	64
2	30	2 crashed after _mi_mark_changed	64
2	79	ccc	64
3	3	ghi	64
3	10	aaa	64
3	17	nnn	64
3	24	3 crashed after write_record	64
3	73	ddd	64
4	4	pqr	64
4	11	bbb	64
4	18	4 crashed after flush_cached_blocks	64
4	67	fff	64
5	5	mno	64
5	19	mmm	64
5	40	5 still here since crash in next row in multirow insert?	64
5	89	a	64
6	6	jkl	64
6	13	ooo	64
6	34	6 row 2	64
6	48	6 row 4	64
6	62	6 row 6	64
6	83	 	64
6	97	zzzzzZzzzzz	64
FLUSH TABLES;
#
# replacing p2 with crashed files (after _mi_mark_changed)
ALTER TABLE t1_will_crash CHECK PARTITION p2;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	status	OK
# crash was when index only marked as opened, no real corruption
ALTER TABLE t1_will_crash CHECK PARTITION p2;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	status	OK
FLUSH TABLES;
#
# replacing p4 with updated but not closed index file
ALTER TABLE t1_will_crash OPTIMIZE PARTITION p4;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	optimize	error	Found key at page 2048 that points to record outside datafile
test.t1_will_crash	optimize	error	Partition p4 returned error
test.t1_will_crash	optimize	status	Operation failed
ALTER TABLE t1_will_crash CHECK PARTITION p4;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	Table is marked as crashed and last repair failed
test.t1_will_crash	check	warning	1 client is using or hasn't closed the table properly
test.t1_will_crash	check	warning	Size of datafile is: 368       Should be: 252
test.t1_will_crash	check	error	Found 4 keys of 3
test.t1_will_crash	check	error	Partition p4 returned error
test.t1_will_crash	check	error	Corrupt
ALTER TABLE t1_will_crash REPAIR PARTITION p4;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	warning	Number of rows changed from 3 to 4
test.t1_will_crash	repair	status	OK
FLUSH TABLES;
#
# replacing p6 with a crashed MYD file (2) (splitted dynamic record)
ALTER TABLE t1_will_crash CHECK PARTITION p6;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	Size of datafile is: 868       Should be: 604
test.t1_will_crash	check	error	Unexpected byte: 0 at link: 340
test.t1_will_crash	check	error	Partition p6 returned error
test.t1_will_crash	check	error	Corrupt
ALTER TABLE t1_will_crash REPAIR PARTITION p6;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	info	Delete link points outside datafile at 340
test.t1_will_crash	repair	info	Delete link points outside datafile at 340
test.t1_will_crash	repair	status	OK
SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash
WHERE (b % 7) = 6
ORDER BY partition, b, a;
partition	b	a	length(c)
6	6	jkl	64
6	13	ooo	64
6	34	6 row 2	64
6	48	6 row 4	64
6	62	6 row 6	64
6	83	 	64
6	97	zzzzzZzzzzz	64
FLUSH TABLES;
#
# replacing p6 with a crashed MYD file (3) (splitted dynamic record)
# Different results from the corrupt table, which can lead to dropping
# of the not completely written rows when using REBUILD on a corrupt
# table, depending if one reads via index or direct on datafile.
# Since crash when reuse of deleted row space, CHECK MEDIUM or EXTENDED
# is required (MEDIUM is default) to verify correct behavior!
SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash
WHERE (b % 7) = 6
ORDER BY partition, b, a;
partition	b	a	length(c)
6	6	jkl	64
6	13	ooo	64
6	34	6 row 2	64
6	83	 	64
6	97	zzzzzZzzzzz	64
SELECT (b % 7) AS partition, b, a FROM (SELECT b,a FROM t1_will_crash) q
WHERE (b % 7) = 6
ORDER BY partition, b, a;
partition	b	a
6	6	jkl
6	13	ooo
6	34	6 row 2
6	48	6 row 4
6	62	6 row 6
6	83	 
6	97	zzzzzZzzzzz
ALTER TABLE t1_will_crash CHECK PARTITION p6;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	warning	Size of datafile is: 868       Should be: 604
test.t1_will_crash	check	error	Record-count is not ok; is 8   Should be: 7
test.t1_will_crash	check	warning	Found 10 key parts. Should be: 7
test.t1_will_crash	check	error	Partition p6 returned error
test.t1_will_crash	check	error	Corrupt
ALTER TABLE t1_will_crash REPAIR PARTITION p6;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	repair	warning	Number of rows changed from 7 to 8
test.t1_will_crash	repair	status	OK
SELECT COUNT(*) FROM t1_will_crash;
COUNT(*)
29
SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7);
partition	rows
1	4
2	4
3	5
4	4
5	4
6	8
SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a;
partition	b	a	length(c)
1	1	abc	64
1	8	tuw	64
1	29	kkkkkkkkKkk	64
1	71	eee	64
2	2	def	64
2	9	vxy	64
2	23	lll	64
2	79	ccc	64
3	3	ghi	64
3	10	aaa	64
3	17	nnn	64
3	24	3 crashed after write_record	64
3	73	ddd	64
4	4	pqr	64
4	11	bbb	64
4	18	4 crashed after flush_cached_blocks	64
4	67	fff	64
5	5	mno	64
5	19	mmm	64
5	40	5 still here since crash in next row in multirow insert?	64
5	89	a	64
6	6	jkl	64
6	13	ooo	64
6	27	6 row 7 (crash before completely written to datafile)	128
6	34	6 row 2	64
6	48	6 row 4	64
6	62	6 row 6	64
6	83	 	64
6	97	zzzzzZzzzzz	64
ALTER TABLE t1_will_crash CHECK PARTITION all EXTENDED;
Table	Op	Msg_type	Msg_text
test.t1_will_crash	check	status	OK
DROP TABLE t1_will_crash;
