summaryrefslogtreecommitdiff
path: root/mysql-test/suite/innodb/t/innodb_bug14147491.test
blob: c6e4f01a642f925eef0d097fdff623400c8e1ca4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#
# Test opening a corrupted table.
#
# Restarting is not supported under embedded
-- source include/not_embedded.inc
# Require InnoDB
-- source include/have_innodb.inc
-- source include/not_encrypted.inc

--disable_query_log
call mtr.add_suppression("InnoDB: Table `test`\\.`t1` is corrupted\\. Please drop the table and recreate\\.");
call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed read of file '.*test.t1\\.ibd' page");
call mtr.add_suppression("InnoDB: We detected index corruption in an InnoDB type table");
call mtr.add_suppression("Index for table 't1' is corrupt; try to repair it");
--enable_query_log

--echo # Ensure that purge will not crash on the table after we corrupt it.
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
SET GLOBAL innodb_fast_shutdown=0;

--echo # Create and populate the table to be corrupted

set global innodb_file_per_table=ON;

CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB;
INSERT INTO t1 (b) VALUES ('corrupt me');
--disable_query_log
--let $i = 10
while ($i)
{
  INSERT INTO t1 (b) VALUES (REPEAT('abcdefghijklmnopqrstuvwxyz', 100));
  dec $i;
}
--enable_query_log
INSERT INTO t1 (b) VALUES ('corrupt me');

let $MYSQLD_DATADIR=`select @@datadir`;
let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd;

--source include/shutdown_mysqld.inc

--echo # Corrupt the table

perl;
use strict;
use warnings;
use Fcntl qw(:DEFAULT :seek);

my $ibd_file = $ENV{'t1_IBD'};

my $chunk;
my $len;

sysopen IBD_FILE, $ibd_file, O_RDWR || die "Unable to open $ibd_file";

while ($len = sysread IBD_FILE, $chunk, 1024)
{
  if ($chunk =~ s/corrupt me/korrupt me/)
  {
    print "Munged a string.\n";
    sysseek IBD_FILE, -$len, SEEK_CUR;
    syswrite IBD_FILE, $chunk, $len;
  }
}

close IBD_FILE;
EOF

--source include/start_mysqld.inc

--echo # Now t1 is corrupted but we should not crash

--error 1030,1712,1932
SELECT * FROM t1;

--error 126,1030,1034,1712,1932
INSERT INTO t1(b) VALUES('abcdef');

--error 1030,1712,1932
UPDATE t1 set b = 'deadbeef' where a = 1;

--echo # Cleanup, this must be possible
DROP TABLE t1;