summaryrefslogtreecommitdiff
path: root/mysql-test/suite/innodb
diff options
context:
space:
mode:
Diffstat (limited to 'mysql-test/suite/innodb')
-rw-r--r--mysql-test/suite/innodb/include/show_i_s_tablespaces.inc2
-rw-r--r--mysql-test/suite/innodb/r/alter_missing_tablespace.result16
-rw-r--r--mysql-test/suite/innodb/r/blob-crash.result149
-rw-r--r--mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result22
-rw-r--r--mysql-test/suite/innodb/r/innodb_mysql.result43
-rw-r--r--mysql-test/suite/innodb/r/missing_tablespaces.result11
-rw-r--r--mysql-test/suite/innodb/r/page_id_innochecksum.result6
-rw-r--r--mysql-test/suite/innodb/r/purge.result121
-rw-r--r--mysql-test/suite/innodb/r/truncate_missing.result4
-rw-r--r--mysql-test/suite/innodb/t/alter_missing_tablespace.test13
-rw-r--r--mysql-test/suite/innodb/t/blob-crash.test209
-rw-r--r--mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test99
-rw-r--r--mysql-test/suite/innodb/t/innodb_mysql.test46
-rw-r--r--mysql-test/suite/innodb/t/missing_tablespaces.test37
-rw-r--r--mysql-test/suite/innodb/t/page_id_innochecksum.test54
-rw-r--r--mysql-test/suite/innodb/t/purge.test117
-rw-r--r--mysql-test/suite/innodb/t/truncate_missing.test4
17 files changed, 930 insertions, 23 deletions
diff --git a/mysql-test/suite/innodb/include/show_i_s_tablespaces.inc b/mysql-test/suite/innodb/include/show_i_s_tablespaces.inc
index 90288bb2913..50267852fb0 100644
--- a/mysql-test/suite/innodb/include/show_i_s_tablespaces.inc
+++ b/mysql-test/suite/innodb/include/show_i_s_tablespaces.inc
@@ -9,12 +9,10 @@ SELECT s.name 'Space_Name',
s.space_type 'Space_Type',
s.page_size 'Page_Size',
s.zip_page_size 'Zip_Size',
- s.row_format 'Formats_Permitted',
d.path 'Path'
FROM information_schema.innodb_sys_tablespaces s,
information_schema.innodb_sys_datafiles d
WHERE s.space = d.space
AND s.name NOT LIKE 'mysql/%'
- AND s.name NOT LIKE 'sys/%'
ORDER BY s.space;
--enable_query_log
diff --git a/mysql-test/suite/innodb/r/alter_missing_tablespace.result b/mysql-test/suite/innodb/r/alter_missing_tablespace.result
index 935b8199ab9..5de5d0dfc44 100644
--- a/mysql-test/suite/innodb/r/alter_missing_tablespace.result
+++ b/mysql-test/suite/innodb/r/alter_missing_tablespace.result
@@ -9,23 +9,23 @@ CREATE TABLE t1(a SERIAL)ENGINE=InnoDB;
INSERT INTO t1 VALUES(1),(2),(3);
# restart
SELECT * FROM t;
-ERROR 42S02: Table 'test.t' doesn't exist in engine
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
ALTER TABLE t ADD INDEX (a), ALGORITHM=INPLACE;
-ERROR 42S02: Table 'test.t' doesn't exist in engine
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t'
-Error 1932 Table 'test.t' doesn't exist in engine
+Error 1030 Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
ALTER TABLE t ADD INDEX (a), ALGORITHM=COPY;
-ERROR 42S02: Table 'test.t' doesn't exist in engine
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
SHOW WARNINGS;
Level Code Message
Warning 1812 Tablespace is missing for table 'test/t'
-Error 1932 Table 'test.t' doesn't exist in engine
+Error 1030 Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
ALTER TABLE t AUTO_INCREMENT=1, ALGORITHM=INPLACE;
-ERROR 42S02: Table 'test.t' doesn't exist in engine
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
ALTER TABLE t AUTO_INCREMENT=1, ALGORITHM=COPY;
-ERROR 42S02: Table 'test.t' doesn't exist in engine
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
ALTER TABLE t ALGORITHM=INPLACE, DISCARD TABLESPACE;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DISCARD TABLESPACE' at line 1
ALTER TABLE t ALGORITHM=COPY, DISCARD TABLESPACE;
@@ -38,7 +38,7 @@ Warning 1812 Tablespace is missing for table 'test/t'
Warning 1812 Tablespace is missing for table 'test/t'
DROP TABLE t;
SELECT * FROM `x..d`;
-ERROR 42S02: Table 'test.x..d' doesn't exist in engine
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
DROP TABLE `x..d`;
ALTER TABLE t1 DISCARD TABLESPACE;
ALTER TABLE t1 AUTO_INCREMENT=1, ALGORITHM=INPLACE;
diff --git a/mysql-test/suite/innodb/r/blob-crash.result b/mysql-test/suite/innodb/r/blob-crash.result
new file mode 100644
index 00000000000..85d12ff49b5
--- /dev/null
+++ b/mysql-test/suite/innodb/r/blob-crash.result
@@ -0,0 +1,149 @@
+#
+# Bug #16963396 INNODB: USE OF LARGE EXTERNALLY-STORED FIELDS MAKES
+# CRASH RECOVERY LOSE DATA
+#
+#
+# Uncompressed Table - Insert Operation - Crash Test
+# Fresh insert with blobs
+#
+CREATE TABLE t1 (a BIGINT PRIMARY KEY, b LONGBLOB) ENGINE=InnoDB;
+INSERT INTO t1 (a, b) VALUES (1, repeat('^', 40000));
+INSERT INTO t1 (a, b) VALUES (2, '2');
+INSERT INTO t1 (a, b) VALUES (3, '3');
+INSERT INTO t1 (a, b) VALUES (4, '4');
+INSERT INTO t1 (a, b) VALUES (5, '5');
+begin;
+INSERT INTO t1 (a, b) VALUES (6, REPEAT('a', 4*1024*1024));
+SELECT a, right(b, 50) FROM t1;
+a right(b, 50)
+1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+2 2
+3 3
+4 4
+5 5
+#
+# Uncompressed Table - UPDATE Operation - Crash Test
+# Update of non-blob column so that blob is needed.
+#
+begin;
+UPDATE t1 set b = REPEAT('a', 4*1024*1024) where a = 5 ;
+SELECT a, right(b, 50) FROM t1;
+a right(b, 50)
+1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+2 2
+3 3
+4 4
+5 5
+#
+# Uncompressed Table - UPDATE Operation - Crash Test
+# Update of blob column to blob.
+#
+connect con1,localhost,root,,;
+begin;
+UPDATE t1 set b = REPEAT('$', 50000) where a = 1;
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+UPDATE t1 SET b='five' WHERE a=5;
+disconnect con1;
+SELECT a, right(b, 50) FROM t1;
+a right(b, 50)
+1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+2 2
+3 3
+4 4
+5 five
+#
+# Uncompressed Table - Rollback of UPDATE operation
+# Update moves offpage data to inline data.
+#
+create table t2 (f1 bigint primary key, f2 longblob, f3 longblob,
+index(f2(10), f3(10))) engine=innodb;
+insert into t2 values (10, repeat('.', 40000), repeat('?', 40000));
+connect con1,localhost,root,,;
+begin;
+update t2 set f2 = '=';
+select f1, right(f2, 20), right(f3, 20) from t2;
+f1 right(f2, 20) right(f3, 20)
+10 = ????????????????????
+update t2 set f3 = '&';
+select f1, right(f2, 20), right(f3, 20) from t2;
+f1 right(f2, 20) right(f3, 20)
+10 = &
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t1 WHERE a=1;
+disconnect con1;
+select f1, right(f2, 20), right(f3, 20) from t2;
+f1 right(f2, 20) right(f3, 20)
+10 .................... ????????????????????
+check table t2;
+Table Op Msg_type Msg_text
+test.t2 check status OK
+drop table t2;
+#
+# Compressed Table - Insert Operation - Crash Test
+# fresh insert with BLOBs
+#
+set global innodb_compression_level = 0;
+create table t3 (f1 bigint primary key, f2 longblob, f3 longblob,
+index(f2(10), f3(10))) engine=innodb row_format=compressed;
+connect con1,localhost,root,,;
+begin;
+INSERT INTO t3 (f1, f2, f3) VALUES (6, repeat('/', 40000), repeat('<', 40000));
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t1 WHERE a=2;
+disconnect con1;
+select f1, length(f2), length(f3) from t3;
+f1 length(f2) length(f3)
+select f1, right(f2, 30), right(f3, 20) from t3;
+f1 right(f2, 30) right(f3, 20)
+check table t3;
+Table Op Msg_type Msg_text
+test.t3 check status OK
+#
+# Compressed Table - Update Operation - Crash Test
+# update of a non-BLOB column so that BLOB is needed
+#
+set global innodb_compression_level = 0;
+insert into t3 values (2, repeat('!', 30), repeat('+', 30));
+connect con1,localhost,root,,;
+begin;
+UPDATE t3 set f2 = repeat('>', 40000) where f1 = 2;
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t1 WHERE a=3;
+disconnect con1;
+select f1, length(f2), length(f3) from t3;
+f1 length(f2) length(f3)
+2 30 30
+select f1, right(f2, 30), right(f3, 20) from t3;
+f1 right(f2, 30) right(f3, 20)
+2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ++++++++++++++++++++
+check table t3;
+Table Op Msg_type Msg_text
+test.t3 check status OK
+#
+# Compressed Table - Update Operation - Crash Test
+# update blob to blob
+#
+set global innodb_compression_level = 0;
+insert into t3 values (3, repeat('%', 40000), repeat('~', 40000));
+connect con1,localhost,root,,;
+begin;
+UPDATE t3 set f2 = concat(f2, repeat(',', 10)) where f1 = 3;
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t1 WHERE a=4;
+select f1, length(f2), length(f3) from t3;
+f1 length(f2) length(f3)
+2 30 30
+3 40000 40000
+select f1, right(f2, 30), right(f3, 20) from t3;
+f1 right(f2, 30) right(f3, 20)
+2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ++++++++++++++++++++
+3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ~~~~~~~~~~~~~~~~~~~~
+check table t3;
+Table Op Msg_type Msg_text
+test.t3 check status OK
+DROP TABLE t1,t3;
diff --git a/mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result b/mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result
new file mode 100644
index 00000000000..d9f5e4dfeed
--- /dev/null
+++ b/mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result
@@ -0,0 +1,22 @@
+CREATE TABLE tab5 (col1 int auto_increment primary key,
+col2 VARCHAR(25), col3 varchar(25)) ENGINE=InnoDB;
+CREATE INDEX idx1 ON tab5(col2(10));
+CREATE INDEX idx2 ON tab5(col3(10));
+SET GLOBAL innodb_buffer_pool_filename=ib_buffer_pool100;
+SET GLOBAL innodb_buffer_pool_dump_pct=100;
+SELECT variable_value INTO @IBPDS
+FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS';
+SET GLOBAL innodb_buffer_pool_dump_now=ON;
+SET GLOBAL innodb_buffer_pool_filename=ib_buffer_pool1;
+SET GLOBAL innodb_buffer_pool_dump_pct=1;
+SELECT @@global.innodb_buffer_pool_dump_pct;
+@@global.innodb_buffer_pool_dump_pct
+1
+SELECT variable_value INTO @IBPDS
+FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS';
+SET GLOBAL innodb_buffer_pool_dump_now=ON;
+SET GLOBAL innodb_buffer_pool_dump_pct=DEFAULT;
+SET GLOBAL innodb_buffer_pool_filename=DEFAULT;
+DROP TABLE tab5;
diff --git a/mysql-test/suite/innodb/r/innodb_mysql.result b/mysql-test/suite/innodb/r/innodb_mysql.result
index 7a164da41b5..b78988e08a8 100644
--- a/mysql-test/suite/innodb/r/innodb_mysql.result
+++ b/mysql-test/suite/innodb/r/innodb_mysql.result
@@ -3133,8 +3133,49 @@ ERROR 22007: Truncated incorrect datetime value: ''
DROP TABLE t1;
SET SQL_MODE=DEFAULT;
#
-# Bug#56862 Moved to innodb_16k.test
+# Bug#56862 Execution of a query that uses index merge returns a wrong result
#
+CREATE TABLE t1 (
+pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
+a int,
+b int,
+INDEX idx(a))
+ENGINE=INNODB;
+INSERT INTO t1(a,b) VALUES
+(11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500),
+(3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800),
+(6, 600), (18, 1800), (9, 900), (10, 1000), (7, 700),
+(13, 1300), (15, 1500), (19, 1900), (16, 1600), (20, 2000);
+INSERT INTO t1(a,b) SELECT a+20, b+2000 FROM t1;
+INSERT INTO t1(a,b) SELECT a+40, b+4000 FROM t1;
+INSERT INTO t1(a,b) SELECT a+80, b+8000 FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1 VALUES (1000000, 0, 0);
+set @optimizer_switch_saved=@@optimizer_switch;
+SET SESSION optimizer_switch='derived_merge=off';
+SET SESSION sort_buffer_size = 1024*36;
+EXPLAIN
+SELECT COUNT(*) FROM
+(SELECT * FROM t1 FORCE INDEX (idx,PRIMARY)
+WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1537
+2 DERIVED t1 index_merge PRIMARY,idx idx,PRIMARY 5,4 NULL 1537 Using sort_union(idx,PRIMARY); Using where
+SELECT COUNT(*) FROM
+(SELECT * FROM t1 FORCE INDEX (idx,PRIMARY)
+WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
+COUNT(*)
+1537
+set @@optimizer_switch=@optimizer_switch_saved;
+SET SESSION sort_buffer_size = DEFAULT;
+DROP TABLE t1;
#
# Test for bug #39932 "create table fails if column for FK is in different
# case than in corr index".
diff --git a/mysql-test/suite/innodb/r/missing_tablespaces.result b/mysql-test/suite/innodb/r/missing_tablespaces.result
new file mode 100644
index 00000000000..11b79273498
--- /dev/null
+++ b/mysql-test/suite/innodb/r/missing_tablespaces.result
@@ -0,0 +1,11 @@
+#
+# Bug#19419026 WHEN A TABLESPACE IS NOT FOUND, DO NOT REPORT "TABLE NOT FOUND"
+#
+CREATE DATABASE `..................................................`;
+USE `..................................................`;
+CREATE TABLE `..................................................` (ID INT)
+ENGINE=INNODB;
+select * from `..................................................`;
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
+DROP TABLE `..................................................`;
+DROP DATABASE `..................................................`;
diff --git a/mysql-test/suite/innodb/r/page_id_innochecksum.result b/mysql-test/suite/innodb/r/page_id_innochecksum.result
new file mode 100644
index 00000000000..e2c13442fe6
--- /dev/null
+++ b/mysql-test/suite/innodb/r/page_id_innochecksum.result
@@ -0,0 +1,6 @@
+# Set the environmental variables
+create table t1(f1 int not null)engine=innodb;
+insert into t1 values(1), (2), (3);
+# Change the page offset
+FOUND 1 /page id mismatch/ in result.log
+drop table t1;
diff --git a/mysql-test/suite/innodb/r/purge.result b/mysql-test/suite/innodb/r/purge.result
new file mode 100644
index 00000000000..fe10ca1f4d5
--- /dev/null
+++ b/mysql-test/suite/innodb/r/purge.result
@@ -0,0 +1,121 @@
+SET @save_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
+SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
+# Bug #12429576 - Test an assertion failure on purge.
+CREATE TABLE t1_purge (
+A int,
+B blob, C blob, D blob, E blob,
+F blob, G blob, H blob,
+PRIMARY KEY (B(767), C(767), D(767), E(767), A),
+INDEX (A)
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+INSERT INTO t1_purge VALUES (1,
+REPEAT('b', 766), REPEAT('c', 766), REPEAT('d', 766), REPEAT('e', 766),
+REPEAT('f', 766), REPEAT('g', 766), REPEAT('h', 766));
+CREATE TABLE t2_purge (
+A int PRIMARY KEY,
+B blob, C blob, D blob, E blob,
+F blob, G blob, H blob, I blob,
+J blob, K blob, L blob,
+INDEX (B(767))) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+INSERT INTO t2_purge VALUES (1,
+REPEAT('b', 766), REPEAT('c', 766), REPEAT('d', 766), REPEAT('e', 766),
+REPEAT('f', 766), REPEAT('g', 766), REPEAT('h', 766), REPEAT('i', 766),
+REPEAT('j', 766), REPEAT('k', 766), REPEAT('l', 766));
+CREATE TABLE t3_purge (
+A int,
+B varchar(800), C varchar(800), D varchar(800), E varchar(800),
+F varchar(800), G varchar(800), H varchar(800),
+PRIMARY KEY (B(767), C(767), D(767), E(767), A),
+INDEX (A)
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+INSERT INTO t3_purge SELECT * FROM t1_purge;
+CREATE TABLE t4_purge (
+A int PRIMARY KEY,
+B varchar(800), C varchar(800), D varchar(800), E varchar(800),
+F varchar(800), G varchar(800), H varchar(800), I varchar(800),
+J varchar(800), K varchar(800), L varchar(800),
+INDEX (B(767))) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+INSERT INTO t4_purge SELECT * FROM t2_purge;
+DELETE FROM t1_purge;
+DELETE FROM t2_purge;
+DELETE FROM t3_purge;
+DELETE FROM t4_purge;
+SET @r=REPEAT('a',500);
+CREATE TABLE t12637786(a int,
+v1 varchar(500), v2 varchar(500), v3 varchar(500),
+v4 varchar(500), v5 varchar(500), v6 varchar(500),
+v7 varchar(500), v8 varchar(500), v9 varchar(500),
+v10 varchar(500), v11 varchar(500), v12 varchar(500),
+v13 varchar(500), v14 varchar(500), v15 varchar(500),
+v16 varchar(500), v17 varchar(500), v18 varchar(500)
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+CREATE INDEX idx1 ON t12637786(a,v1);
+INSERT INTO t12637786 VALUES(9,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r);
+UPDATE t12637786 SET a=1000;
+DELETE FROM t12637786;
+# Bug#12963823 - Test that the purge thread does not crash when
+CREATE TABLE t12963823(a blob,b blob,c blob,d blob,e blob,f blob,g blob,h blob,
+i blob,j blob,k blob,l blob,m blob,n blob,o blob,p blob)
+ENGINE=innodb ROW_FORMAT=dynamic;
+SET @r = REPEAT('a', 767);
+INSERT INTO t12963823 VALUES (@r,@r,@r,@r, @r,@r,@r,@r, @r,@r,@r,@r, @r,@r,@r,@r);
+CREATE INDEX ndx_a ON t12963823 (a(500));
+CREATE INDEX ndx_b ON t12963823 (b(500));
+CREATE INDEX ndx_c ON t12963823 (c(500));
+CREATE INDEX ndx_d ON t12963823 (d(500));
+CREATE INDEX ndx_e ON t12963823 (e(500));
+CREATE INDEX ndx_f ON t12963823 (f(500));
+CREATE INDEX ndx_k ON t12963823 (k(500));
+CREATE INDEX ndx_l ON t12963823 (l(500));
+SET @r = REPEAT('b', 500);
+UPDATE t12963823 set a=@r,b=@r,c=@r,d=@r;
+UPDATE t12963823 set e=@r,f=@r,g=@r,h=@r;
+UPDATE t12963823 set i=@r,j=@r,k=@r,l=@r;
+UPDATE t12963823 set m=@r,n=@r,o=@r,p=@r;
+ALTER TABLE t12963823 DROP INDEX ndx_a;
+ALTER TABLE t12963823 DROP INDEX ndx_b;
+CREATE INDEX ndx_g ON t12963823 (g(500));
+CREATE INDEX ndx_h ON t12963823 (h(500));
+CREATE INDEX ndx_i ON t12963823 (i(500));
+CREATE INDEX ndx_j ON t12963823 (j(500));
+CREATE INDEX ndx_m ON t12963823 (m(500));
+CREATE INDEX ndx_n ON t12963823 (n(500));
+CREATE INDEX ndx_o ON t12963823 (o(500));
+CREATE INDEX ndx_p ON t12963823 (p(500));
+SHOW CREATE TABLE t12963823;
+Table Create Table
+t12963823 CREATE TABLE `t12963823` (
+ `a` blob DEFAULT NULL,
+ `b` blob DEFAULT NULL,
+ `c` blob DEFAULT NULL,
+ `d` blob DEFAULT NULL,
+ `e` blob DEFAULT NULL,
+ `f` blob DEFAULT NULL,
+ `g` blob DEFAULT NULL,
+ `h` blob DEFAULT NULL,
+ `i` blob DEFAULT NULL,
+ `j` blob DEFAULT NULL,
+ `k` blob DEFAULT NULL,
+ `l` blob DEFAULT NULL,
+ `m` blob DEFAULT NULL,
+ `n` blob DEFAULT NULL,
+ `o` blob DEFAULT NULL,
+ `p` blob DEFAULT NULL,
+ KEY `ndx_c` (`c`(500)),
+ KEY `ndx_d` (`d`(500)),
+ KEY `ndx_e` (`e`(500)),
+ KEY `ndx_f` (`f`(500)),
+ KEY `ndx_k` (`k`(500)),
+ KEY `ndx_l` (`l`(500)),
+ KEY `ndx_g` (`g`(500)),
+ KEY `ndx_h` (`h`(500)),
+ KEY `ndx_i` (`i`(500)),
+ KEY `ndx_j` (`j`(500)),
+ KEY `ndx_m` (`m`(500)),
+ KEY `ndx_n` (`n`(500)),
+ KEY `ndx_o` (`o`(500)),
+ KEY `ndx_p` (`p`(500))
+) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
+InnoDB 0 transactions not purged
+DROP TABLE t1_purge, t2_purge, t3_purge, t4_purge, t12637786, t12963823;
+SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;
diff --git a/mysql-test/suite/innodb/r/truncate_missing.result b/mysql-test/suite/innodb/r/truncate_missing.result
index 62a4ef5c552..938bd5f2213 100644
--- a/mysql-test/suite/innodb/r/truncate_missing.result
+++ b/mysql-test/suite/innodb/r/truncate_missing.result
@@ -12,7 +12,7 @@ t CREATE TABLE `t` (
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
# restart
SELECT * FROM t;
-ERROR 42S02: Table 'test.t' doesn't exist in engine
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
TRUNCATE TABLE t;
-ERROR 42S02: Table 'test.t' doesn't exist in engine
+ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB
DROP TABLE t;
diff --git a/mysql-test/suite/innodb/t/alter_missing_tablespace.test b/mysql-test/suite/innodb/t/alter_missing_tablespace.test
index bdcbdfb4408..287aa437d10 100644
--- a/mysql-test/suite/innodb/t/alter_missing_tablespace.test
+++ b/mysql-test/suite/innodb/t/alter_missing_tablespace.test
@@ -35,22 +35,21 @@ INSERT INTO t1 VALUES(1),(2),(3);
--source include/start_mysqld.inc
-# The ER_NO_SUCH_TABLE is being thrown by ha_innobase::open().
# The table does exist, only the tablespace does not exist.
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_GET_ERRNO
SELECT * FROM t;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_GET_ERRNO
ALTER TABLE t ADD INDEX (a), ALGORITHM=INPLACE;
SHOW WARNINGS;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_GET_ERRNO
ALTER TABLE t ADD INDEX (a), ALGORITHM=COPY;
SHOW WARNINGS;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_GET_ERRNO
ALTER TABLE t AUTO_INCREMENT=1, ALGORITHM=INPLACE;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_GET_ERRNO
ALTER TABLE t AUTO_INCREMENT=1, ALGORITHM=COPY;
--error ER_PARSE_ERROR
@@ -61,7 +60,7 @@ ALTER TABLE t ALGORITHM=COPY, DISCARD TABLESPACE;
ALTER TABLE t ALGORITHM=DEFAULT, DISCARD TABLESPACE;
ALTER TABLE t DISCARD TABLESPACE;
DROP TABLE t;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_GET_ERRNO
SELECT * FROM `x..d`;
DROP TABLE `x..d`;
diff --git a/mysql-test/suite/innodb/t/blob-crash.test b/mysql-test/suite/innodb/t/blob-crash.test
new file mode 100644
index 00000000000..beb500553ea
--- /dev/null
+++ b/mysql-test/suite/innodb/t/blob-crash.test
@@ -0,0 +1,209 @@
+--source include/maybe_debug.inc
+--source include/innodb_page_size_small.inc
+
+--echo #
+--echo # Bug #16963396 INNODB: USE OF LARGE EXTERNALLY-STORED FIELDS MAKES
+--echo # CRASH RECOVERY LOSE DATA
+--echo #
+
+# ..........................................................................
+
+--echo #
+--echo # Uncompressed Table - Insert Operation - Crash Test
+--echo # Fresh insert with blobs
+--echo #
+
+CREATE TABLE t1 (a BIGINT PRIMARY KEY, b LONGBLOB) ENGINE=InnoDB;
+
+# Insert a few rows (it doesn't really matter how many). These transactions
+# are committed once they are acked, so they should not be lost.
+INSERT INTO t1 (a, b) VALUES (1, repeat('^', 40000));
+INSERT INTO t1 (a, b) VALUES (2, '2');
+INSERT INTO t1 (a, b) VALUES (3, '3');
+INSERT INTO t1 (a, b) VALUES (4, '4');
+INSERT INTO t1 (a, b) VALUES (5, '5');
+
+# The BLOB insert will fail, and should disappear. However no data committed
+# up to this point should be lost.
+begin;
+INSERT INTO t1 (a, b) VALUES (6, REPEAT('a', 4*1024*1024));
+
+let $shutdown_timeout=0;
+let $restart_noprint=2;
+--source include/restart_mysqld.inc
+
+SELECT a, right(b, 50) FROM t1;
+
+# ..........................................................................
+
+--echo #
+--echo # Uncompressed Table - UPDATE Operation - Crash Test
+--echo # Update of non-blob column so that blob is needed.
+--echo #
+
+# The BLOB update will fail, and should disappear. However no data committed
+# up to this point should be lost.
+begin;
+UPDATE t1 set b = REPEAT('a', 4*1024*1024) where a = 5 ;
+
+let $shutdown_timeout=0;
+--source include/restart_mysqld.inc
+
+SELECT a, right(b, 50) FROM t1;
+
+# ..........................................................................
+
+--echo #
+--echo # Uncompressed Table - UPDATE Operation - Crash Test
+--echo # Update of blob column to blob.
+--echo #
+
+# The BLOB update will fail, and should disappear. However no data committed
+# up to this point should be lost.
+connect (con1,localhost,root,,);
+begin;
+UPDATE t1 set b = REPEAT('$', 50000) where a = 1;
+
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+UPDATE t1 SET b='five' WHERE a=5;
+
+let $shutdown_timeout=0;
+--source include/restart_mysqld.inc
+
+disconnect con1;
+
+SELECT a, right(b, 50) FROM t1;
+
+# ..........................................................................
+
+--echo #
+--echo # Uncompressed Table - Rollback of UPDATE operation
+--echo # Update moves offpage data to inline data.
+--echo #
+
+create table t2 (f1 bigint primary key, f2 longblob, f3 longblob,
+ index(f2(10), f3(10))) engine=innodb;
+
+insert into t2 values (10, repeat('.', 40000), repeat('?', 40000));
+
+connect (con1,localhost,root,,);
+begin;
+update t2 set f2 = '=';
+select f1, right(f2, 20), right(f3, 20) from t2;
+update t2 set f3 = '&';
+select f1, right(f2, 20), right(f3, 20) from t2;
+
+if ($have_debug) {
+--disable_query_log
+set DEBUG_SYNC='blob_rollback_middle SIGNAL stuck WAIT_FOR ever';
+send ROLLBACK;
+--enable_query_log
+}
+
+connection default;
+if ($have_debug) {
+--disable_query_log
+SET DEBUG_SYNC = 'now WAIT_FOR stuck';
+--enable_query_log
+}
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t1 WHERE a=1;
+
+let $shutdown_timeout=0;
+--source include/restart_mysqld.inc
+
+disconnect con1;
+
+select f1, right(f2, 20), right(f3, 20) from t2;
+check table t2;
+drop table t2;
+
+# ..........................................................................
+
+--echo #
+--echo # Compressed Table - Insert Operation - Crash Test
+--echo # fresh insert with BLOBs
+--echo #
+
+set global innodb_compression_level = 0;
+
+create table t3 (f1 bigint primary key, f2 longblob, f3 longblob,
+ index(f2(10), f3(10))) engine=innodb row_format=compressed;
+
+# The BLOB insert will fail, and should disappear. However no data committed
+# up to this point should be lost.
+connect (con1,localhost,root,,);
+begin;
+INSERT INTO t3 (f1, f2, f3) VALUES (6, repeat('/', 40000), repeat('<', 40000));
+
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t1 WHERE a=2;
+
+let $shutdown_timeout=0;
+--source include/restart_mysqld.inc
+
+disconnect con1;
+
+select f1, length(f2), length(f3) from t3;
+select f1, right(f2, 30), right(f3, 20) from t3;
+check table t3;
+
+# ..........................................................................
+
+--echo #
+--echo # Compressed Table - Update Operation - Crash Test
+--echo # update of a non-BLOB column so that BLOB is needed
+--echo #
+
+set global innodb_compression_level = 0;
+insert into t3 values (2, repeat('!', 30), repeat('+', 30));
+
+# The BLOB update will fail, and should disappear. However no data committed
+# up to this point should be lost.
+connect (con1,localhost,root,,);
+begin;
+UPDATE t3 set f2 = repeat('>', 40000) where f1 = 2;
+
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t1 WHERE a=3;
+
+let $shutdown_timeout=0;
+--source include/restart_mysqld.inc
+
+disconnect con1;
+
+select f1, length(f2), length(f3) from t3;
+select f1, right(f2, 30), right(f3, 20) from t3;
+check table t3;
+
+# ..........................................................................
+
+--echo #
+--echo # Compressed Table - Update Operation - Crash Test
+--echo # update blob to blob
+--echo #
+
+set global innodb_compression_level = 0;
+insert into t3 values (3, repeat('%', 40000), repeat('~', 40000));
+
+# The BLOB update will fail, and should disappear. However no data committed
+# up to this point should be lost.
+connect (con1,localhost,root,,);
+begin;
+UPDATE t3 set f2 = concat(f2, repeat(',', 10)) where f1 = 3;
+
+connection default;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t1 WHERE a=4;
+
+let $shutdown_timeout=0;
+--source include/restart_mysqld.inc
+
+select f1, length(f2), length(f3) from t3;
+select f1, right(f2, 30), right(f3, 20) from t3;
+check table t3;
+
+DROP TABLE t1,t3;
diff --git a/mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test b/mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test
new file mode 100644
index 00000000000..a7a414d61da
--- /dev/null
+++ b/mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test
@@ -0,0 +1,99 @@
+# ************************************************************
+# wl6504: This testcase is to check the functionality of the
+# innodb_buffer_pool_dump_pct flag
+# step 1.Set innodb_buffer_pool_dump_pct=100 and take the dump
+# step 2.Set innodb_buffer_pool_dump_pct=1 and take the dump
+# step 3.Compare the size of both the dump files
+#*************************************************************
+--source include/have_innodb.inc
+--source include/have_innodb_16k.inc
+
+let MYSQLD_DATADIR = `SELECT @@datadir`;
+
+CREATE TABLE tab5 (col1 int auto_increment primary key,
+col2 VARCHAR(25), col3 varchar(25)) ENGINE=InnoDB;
+CREATE INDEX idx1 ON tab5(col2(10));
+CREATE INDEX idx2 ON tab5(col3(10));
+
+SET GLOBAL innodb_buffer_pool_filename=ib_buffer_pool100;
+SET GLOBAL innodb_buffer_pool_dump_pct=100;
+
+#***********************************************************
+# SELECT *
+# FROM information_schema.global_status
+# WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS'
+# gives
+# a) VARIABLE_NAME VARIABLE_VALUE
+# INNODB_BUFFER_POOL_DUMP_STATUS not started
+# in case there was no innodb_buffer_pool_dump since server start.
+# b) Something like
+# VARIABLE_NAME VARIABLE_VALUE
+# INNODB_BUFFER_POOL_DUMP_STATUS Buffer pool(s) dump completed at 130711 13:43:24
+# in case there was a innodb_buffer_pool_dump since server start.
+# Attention:
+# - There is no guarantee that the current test is the first test which
+# made an innodb_buffer_pool_dump since server startup.
+# - The granularity of the timestamp is one second.
+# - There could have been some dump caused by some previous test
+# just a few milliseconds before.
+# In order to avoid conflict with previous tests, read the current value
+# of INNODB_BUFFER_POOL_DUMP_STATUS
+# and confirm that the timestamp is different after the dump
+#***********************************************************
+
+# Read the current value to compare with the new value.
+SELECT variable_value INTO @IBPDS
+FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS';
+SET GLOBAL innodb_buffer_pool_dump_now=ON;
+
+# Sleep one second in order to ensure that the time stamp is
+# different at next dump
+--sleep 1
+
+let $wait_condition = SELECT count(*) = 1
+FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS'
+AND variable_value != @IBPDS
+AND variable_value like 'Buffer pool(s) dump completed at%';
+--source include/wait_condition.inc
+
+--file_exists $MYSQLD_DATADIR/ib_buffer_pool100
+SET GLOBAL innodb_buffer_pool_filename=ib_buffer_pool1;
+SET GLOBAL innodb_buffer_pool_dump_pct=1;
+SELECT @@global.innodb_buffer_pool_dump_pct;
+
+# Read the current value to compare with the new value.
+--disable_warnings
+SELECT variable_value INTO @IBPDS
+FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS';
+--enable_warnings
+
+SET GLOBAL innodb_buffer_pool_dump_now=ON;
+
+# Sleep one second in order to ensure that the time stamp is
+# different at next dump
+--sleep 1
+
+let $wait_condition = SELECT count(*) = 1
+FROM information_schema.global_status
+WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS'
+AND variable_value != @IBPDS
+AND variable_value like 'Buffer pool(s) dump completed at%';
+--source include/wait_condition.inc
+
+--file_exists $MYSQLD_DATADIR/ib_buffer_pool1
+
+perl;
+my $size1 = -s "$ENV{MYSQLD_DATADIR}/ib_buffer_pool1";
+my $size100 = -s "$ENV{MYSQLD_DATADIR}/ib_buffer_pool100";
+die "$size100<=$size1\n" unless $size100 > $size1;
+EOF
+
+SET GLOBAL innodb_buffer_pool_dump_pct=DEFAULT;
+SET GLOBAL innodb_buffer_pool_filename=DEFAULT;
+
+--remove_file $MYSQLD_DATADIR/ib_buffer_pool100
+--remove_file $MYSQLD_DATADIR/ib_buffer_pool1
+DROP TABLE tab5;
diff --git a/mysql-test/suite/innodb/t/innodb_mysql.test b/mysql-test/suite/innodb/t/innodb_mysql.test
index dc247a96468..23bba81c6bd 100644
--- a/mysql-test/suite/innodb/t/innodb_mysql.test
+++ b/mysql-test/suite/innodb/t/innodb_mysql.test
@@ -818,8 +818,52 @@ DROP TABLE t1;
SET SQL_MODE=DEFAULT;
--echo #
---echo # Bug#56862 Moved to innodb_16k.test
+--echo # Bug#56862 Execution of a query that uses index merge returns a wrong result
--echo #
+
+CREATE TABLE t1 (
+ pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ a int,
+ b int,
+ INDEX idx(a))
+ENGINE=INNODB;
+
+INSERT INTO t1(a,b) VALUES
+ (11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500),
+ (3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800),
+ (6, 600), (18, 1800), (9, 900), (10, 1000), (7, 700),
+ (13, 1300), (15, 1500), (19, 1900), (16, 1600), (20, 2000);
+INSERT INTO t1(a,b) SELECT a+20, b+2000 FROM t1;
+INSERT INTO t1(a,b) SELECT a+40, b+4000 FROM t1;
+INSERT INTO t1(a,b) SELECT a+80, b+8000 FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1(a,b) SELECT a,b FROM t1;
+INSERT INTO t1 VALUES (1000000, 0, 0);
+
+set @optimizer_switch_saved=@@optimizer_switch;
+SET SESSION optimizer_switch='derived_merge=off';
+SET SESSION sort_buffer_size = 1024*36;
+
+EXPLAIN
+SELECT COUNT(*) FROM
+ (SELECT * FROM t1 FORCE INDEX (idx,PRIMARY)
+ WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
+
+SELECT COUNT(*) FROM
+ (SELECT * FROM t1 FORCE INDEX (idx,PRIMARY)
+ WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
+
+set @@optimizer_switch=@optimizer_switch_saved;
+SET SESSION sort_buffer_size = DEFAULT;
+
+DROP TABLE t1;
+
--echo #
--echo # Test for bug #39932 "create table fails if column for FK is in different
--echo # case than in corr index".
diff --git a/mysql-test/suite/innodb/t/missing_tablespaces.test b/mysql-test/suite/innodb/t/missing_tablespaces.test
new file mode 100644
index 00000000000..b4da9745ba4
--- /dev/null
+++ b/mysql-test/suite/innodb/t/missing_tablespaces.test
@@ -0,0 +1,37 @@
+--source include/have_innodb.inc
+
+#Restarting not supported in embedded
+--source include/not_embedded.inc
+#Windows has trouble creating files/directories with long names
+--source include/not_windows.inc
+
+--echo #
+--echo # Bug#19419026 WHEN A TABLESPACE IS NOT FOUND, DO NOT REPORT "TABLE NOT FOUND"
+--echo #
+
+#Create database and tablename with all special characters
+
+CREATE DATABASE `..................................................`;
+USE `..................................................`;
+CREATE TABLE `..................................................` (ID INT)
+ENGINE=INNODB;
+
+let $restart_noprint=2;
+--source include/shutdown_mysqld.inc
+
+--remove_file $MYSQLTEST_VARDIR/mysqld.1/data/@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e/@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e@002e.ibd
+
+--source include/start_mysqld.inc
+
+--disable_query_log
+call mtr.add_suppression("\\[ERROR\\] InnoDB: Operating system error number 2 in a file operation.");
+call mtr.add_suppression("\\[ERROR\\] InnoDB: The error means the system cannot find the path specified.");
+call mtr.add_suppression("\\[ERROR\\] InnoDB: If you are installing InnoDB, remember that you must create directories yourself, InnoDB does not create them.");
+call mtr.add_suppression("\\[ERROR\\] InnoDB: Cannot open datafile for read-only");
+call mtr.add_suppression("\\[Warning\\] InnoDB: Ignoring tablespace .* because it could not be opened");
+--enable_query_log
+
+--error ER_GET_ERRNO
+select * from `..................................................`;
+DROP TABLE `..................................................`;
+DROP DATABASE `..................................................`;
diff --git a/mysql-test/suite/innodb/t/page_id_innochecksum.test b/mysql-test/suite/innodb/t/page_id_innochecksum.test
new file mode 100644
index 00000000000..807185437d5
--- /dev/null
+++ b/mysql-test/suite/innodb/t/page_id_innochecksum.test
@@ -0,0 +1,54 @@
+--source include/have_innodb.inc
+--source include/not_embedded.inc
+--echo # Set the environmental variables
+let MYSQLD_BASEDIR= `SELECT @@basedir`;
+let MYSQLD_DATADIR= `SELECT @@datadir`;
+let INNODB_PAGE_SIZE=`select @@innodb_page_size`;
+
+create table t1(f1 int not null)engine=innodb;
+insert into t1 values(1), (2), (3);
+let $resultlog=$MYSQLTEST_VARDIR/tmp/result.log;
+
+let $restart_noprint=2;
+--source include/shutdown_mysqld.inc
+--echo # Change the page offset
+perl;
+use strict;
+use warnings;
+use Fcntl qw(:DEFAULT :seek);
+do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl";
+
+my $page_size = $ENV{INNODB_PAGE_SIZE};
+
+sysopen IBD_FILE, "$ENV{MYSQLD_DATADIR}/test/t1.ibd", O_RDWR
+|| die "Cannot open t1.ibd\n";
+sysread(IBD_FILE, $_, 38) || die "Cannot read t1.ibd\n";
+my $space = unpack("x[34]N", $_);
+sysseek(IBD_FILE, $page_size * 3, SEEK_SET) || die "Cannot seek t1.ibd\n";
+
+my $head = pack("Nx[18]", 4); # better to have a valid page number
+my $body = chr(0) x ($page_size - 38 - 8);
+
+# Calculate innodb_checksum_algorithm=crc32 for the unencrypted page.
+# The following bytes are excluded:
+# bytes 0..3 (the checksum is stored there)
+# bytes 26..37 (encryption key version, post-encryption checksum, tablespace id)
+# bytes $page_size-8..$page_size-1 (checksum, LSB of FIL_PAGE_LSN)
+my $polynomial = 0x82f63b78; # CRC-32C
+my $ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial);
+
+my $page= pack("N",$ck).$head.pack("NNN",1,$ck,$space).$body.pack("Nx[4]",$ck);
+die unless syswrite(IBD_FILE, $page, $page_size) == $page_size;
+close IBD_FILE;
+EOF
+
+--error 1
+exec $INNOCHECKSUM -C crc32 -l $resultlog $MYSQLD_DATADIR/test/t1.ibd;
+
+let SEARCH_FILE = $MYSQLTEST_VARDIR/tmp/result.log;
+let SEARCH_PATTERN=page id mismatch;
+--source include/search_pattern_in_file.inc
+
+--remove_file $resultlog
+--source include/start_mysqld.inc
+drop table t1;
diff --git a/mysql-test/suite/innodb/t/purge.test b/mysql-test/suite/innodb/t/purge.test
new file mode 100644
index 00000000000..63312e50fd8
--- /dev/null
+++ b/mysql-test/suite/innodb/t/purge.test
@@ -0,0 +1,117 @@
+--source include/have_innodb.inc
+--source include/have_innodb_16k.inc
+
+SET @save_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
+SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
+
+--echo # Bug #12429576 - Test an assertion failure on purge.
+CREATE TABLE t1_purge (
+A int,
+B blob, C blob, D blob, E blob,
+F blob, G blob, H blob,
+PRIMARY KEY (B(767), C(767), D(767), E(767), A),
+INDEX (A)
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+
+INSERT INTO t1_purge VALUES (1,
+REPEAT('b', 766), REPEAT('c', 766), REPEAT('d', 766), REPEAT('e', 766),
+REPEAT('f', 766), REPEAT('g', 766), REPEAT('h', 766));
+
+CREATE TABLE t2_purge (
+A int PRIMARY KEY,
+B blob, C blob, D blob, E blob,
+F blob, G blob, H blob, I blob,
+J blob, K blob, L blob,
+INDEX (B(767))) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+
+INSERT INTO t2_purge VALUES (1,
+REPEAT('b', 766), REPEAT('c', 766), REPEAT('d', 766), REPEAT('e', 766),
+REPEAT('f', 766), REPEAT('g', 766), REPEAT('h', 766), REPEAT('i', 766),
+REPEAT('j', 766), REPEAT('k', 766), REPEAT('l', 766));
+
+CREATE TABLE t3_purge (
+A int,
+B varchar(800), C varchar(800), D varchar(800), E varchar(800),
+F varchar(800), G varchar(800), H varchar(800),
+PRIMARY KEY (B(767), C(767), D(767), E(767), A),
+INDEX (A)
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+
+INSERT INTO t3_purge SELECT * FROM t1_purge;
+
+CREATE TABLE t4_purge (
+A int PRIMARY KEY,
+B varchar(800), C varchar(800), D varchar(800), E varchar(800),
+F varchar(800), G varchar(800), H varchar(800), I varchar(800),
+J varchar(800), K varchar(800), L varchar(800),
+INDEX (B(767))) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+
+INSERT INTO t4_purge SELECT * FROM t2_purge;
+
+# This would trigger the failure (Bug #12429576)
+# if purge gets a chance to run before DROP TABLE t1_purge, ....
+DELETE FROM t1_purge;
+DELETE FROM t2_purge;
+DELETE FROM t3_purge;
+DELETE FROM t4_purge;
+# We need to activate the purge thread before DROP TABLE.
+
+# Bug#12637786 - Assertion hit; ut_ad(dict_index_is_clust(index));
+# A secondary index tuple is found to be too long to fit into a page.
+# This test is not in innodb_8k or innodb_4k since the bug is not about
+# page size. It just tests the condition that caused the assertion.
+SET @r=REPEAT('a',500);
+CREATE TABLE t12637786(a int,
+ v1 varchar(500), v2 varchar(500), v3 varchar(500),
+ v4 varchar(500), v5 varchar(500), v6 varchar(500),
+ v7 varchar(500), v8 varchar(500), v9 varchar(500),
+ v10 varchar(500), v11 varchar(500), v12 varchar(500),
+ v13 varchar(500), v14 varchar(500), v15 varchar(500),
+ v16 varchar(500), v17 varchar(500), v18 varchar(500)
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
+CREATE INDEX idx1 ON t12637786(a,v1);
+INSERT INTO t12637786 VALUES(9,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r,@r);
+UPDATE t12637786 SET a=1000;
+DELETE FROM t12637786;
+# We need to activate the purge thread before DROP TABLE
+# to make sure it is able to clean up the old versions.
+
+--echo # Bug#12963823 - Test that the purge thread does not crash when
+# the number of indexes has changed since the UNDO record was logged.
+# This test is not in innodb_8k or innodb_4k since the bug is not about
+# page size. It just tests the condition that caused the crash.
+CREATE TABLE t12963823(a blob,b blob,c blob,d blob,e blob,f blob,g blob,h blob,
+ i blob,j blob,k blob,l blob,m blob,n blob,o blob,p blob)
+ ENGINE=innodb ROW_FORMAT=dynamic;
+SET @r = REPEAT('a', 767);
+INSERT INTO t12963823 VALUES (@r,@r,@r,@r, @r,@r,@r,@r, @r,@r,@r,@r, @r,@r,@r,@r);
+CREATE INDEX ndx_a ON t12963823 (a(500));
+CREATE INDEX ndx_b ON t12963823 (b(500));
+CREATE INDEX ndx_c ON t12963823 (c(500));
+CREATE INDEX ndx_d ON t12963823 (d(500));
+CREATE INDEX ndx_e ON t12963823 (e(500));
+CREATE INDEX ndx_f ON t12963823 (f(500));
+CREATE INDEX ndx_k ON t12963823 (k(500));
+CREATE INDEX ndx_l ON t12963823 (l(500));
+
+SET @r = REPEAT('b', 500);
+UPDATE t12963823 set a=@r,b=@r,c=@r,d=@r;
+UPDATE t12963823 set e=@r,f=@r,g=@r,h=@r;
+UPDATE t12963823 set i=@r,j=@r,k=@r,l=@r;
+UPDATE t12963823 set m=@r,n=@r,o=@r,p=@r;
+ALTER TABLE t12963823 DROP INDEX ndx_a;
+ALTER TABLE t12963823 DROP INDEX ndx_b;
+CREATE INDEX ndx_g ON t12963823 (g(500));
+CREATE INDEX ndx_h ON t12963823 (h(500));
+CREATE INDEX ndx_i ON t12963823 (i(500));
+CREATE INDEX ndx_j ON t12963823 (j(500));
+CREATE INDEX ndx_m ON t12963823 (m(500));
+CREATE INDEX ndx_n ON t12963823 (n(500));
+CREATE INDEX ndx_o ON t12963823 (o(500));
+CREATE INDEX ndx_p ON t12963823 (p(500));
+SHOW CREATE TABLE t12963823;
+# We need to activate the purge thread before DROP TABLE.
+
+-- source include/wait_all_purged.inc
+DROP TABLE t1_purge, t2_purge, t3_purge, t4_purge, t12637786, t12963823;
+SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;
diff --git a/mysql-test/suite/innodb/t/truncate_missing.test b/mysql-test/suite/innodb/t/truncate_missing.test
index 832b94e3a19..c357f5bae72 100644
--- a/mysql-test/suite/innodb/t/truncate_missing.test
+++ b/mysql-test/suite/innodb/t/truncate_missing.test
@@ -15,8 +15,8 @@ let $datadir=`select @@datadir`;
--remove_file $datadir/test/t.ibd
--source include/start_mysqld.inc
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_GET_ERRNO
SELECT * FROM t;
---error ER_NO_SUCH_TABLE_IN_ENGINE
+--error ER_GET_ERRNO
TRUNCATE TABLE t;
DROP TABLE t;