summaryrefslogtreecommitdiffstats
path: root/mysql-test/suite/innodb/t/innodb_bug14147491.test
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/suite/innodb/t/innodb_bug14147491.test')
-rw-r--r--mysql-test/suite/innodb/t/innodb_bug14147491.test83
1 files changed, 83 insertions, 0 deletions
diff --git a/mysql-test/suite/innodb/t/innodb_bug14147491.test b/mysql-test/suite/innodb/t/innodb_bug14147491.test
new file mode 100644
index 00000000..c6e4f01a
--- /dev/null
+++ b/mysql-test/suite/innodb/t/innodb_bug14147491.test
@@ -0,0 +1,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;