drop table if exists t1,t2,t3,t4,t5,t6; drop database if exists mysqltest; create table t1 (a int not null primary key auto_increment, message char(20)); create table t2 (a int not null primary key auto_increment, message char(20)); INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1"); INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2"); create table t3 (a int not null, b char(20), key(a)) engine=MERGE UNION=(t1,t2); select * from t3; a b 1 Testing 2 table 3 t1 1 Testing 2 table 3 t2 select * from t3 order by a desc; a b 3 t1 3 t2 2 table 2 table 1 Testing 1 Testing drop table t3; insert into t1 select NULL,message from t2; insert into t2 select NULL,message from t1; insert into t1 select NULL,message from t2; insert into t2 select NULL,message from t1; insert into t1 select NULL,message from t2; insert into t2 select NULL,message from t1; insert into t1 select NULL,message from t2; insert into t2 select NULL,message from t1; insert into t1 select NULL,message from t2; insert into t2 select NULL,message from t1; insert into t1 select NULL,message from t2; create table t3 (a int not null, b char(20), key(a)) engine=MERGE UNION=(test.t1,test.t2); explain select * from t3 where a < 10; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t3 range a a 4 NULL 18 Using where explain select * from t3 where a > 10 and a < 20; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t3 range a a 4 NULL 17 Using where select * from t3 where a = 10; a b 10 Testing 10 Testing select * from t3 where a < 10; a b 1 Testing 1 Testing 2 table 2 table 3 t1 3 t2 4 Testing 4 Testing 5 table 5 table 6 t2 6 t1 7 Testing 7 Testing 8 table 8 table 9 t2 9 t2 select * from t3 where a > 10 and a < 20; a b 11 table 11 table 12 t1 12 t1 13 Testing 13 Testing 14 table 14 table 15 t2 15 t2 16 Testing 16 Testing 17 table 17 table 18 t2 18 t2 19 Testing 19 Testing explain select a from t3 order by a desc limit 10; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t3 index NULL a 4 NULL 10 Using index select a from t3 order by a desc limit 10; a 699 698 697 696 695 694 693 692 691 690 select a from t3 order by a desc limit 300,10; a 416 415 415 414 414 413 413 412 412 411 delete from t3 where a=3; select * from t3 where a < 10; a b 1 Testing 1 Testing 2 table 2 table 4 Testing 4 Testing 5 table 5 table 6 t2 6 t1 7 Testing 7 Testing 8 table 8 table 9 t2 9 t2 delete from t3 where a >= 6 and a <= 8; select * from t3 where a < 10; a b 1 Testing 1 Testing 2 table 2 table 4 Testing 4 Testing 5 table 5 table 9 t2 9 t2 update t3 set a=3 where a=9; select * from t3 where a < 10; a b 1 Testing 1 Testing 2 table 2 table 3 t2 3 t2 4 Testing 4 Testing 5 table 5 table update t3 set a=6 where a=7; select * from t3 where a < 10; a b 1 Testing 1 Testing 2 table 2 table 3 t2 3 t2 4 Testing 4 Testing 5 table 5 table show create table t3; Table Create Table t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL, `b` char(20) DEFAULT NULL, KEY `a` (`a`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t1`,`t2`) create table t4 (a int not null, b char(10), key(a)) engine=MERGE UNION=(t1,t2); select * from t4; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist alter table t4 add column c int; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist flush tables; select * from t4; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist create database mysqltest; create table mysqltest.t6 (a int not null primary key auto_increment, message char(20)); create table t5 (a int not null, b char(20), key(a)) engine=MERGE UNION=(test.t1,mysqltest.t6); show create table t5; Table Create Table t5 CREATE TABLE `t5` ( `a` int(11) NOT NULL, `b` char(20) DEFAULT NULL, KEY `a` (`a`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t1`,`mysqltest`.`t6`) alter table t5 engine=myisam; drop table t5, mysqltest.t6; drop database mysqltest; drop table t4,t3,t1,t2; create table t1 (c char(10)) engine=myisam; create table t2 (c char(10)) engine=myisam; create table t3 (c char(10)) union=(t1,t2) engine=merge; insert into t1 (c) values ('test1'); insert into t1 (c) values ('test1'); insert into t1 (c) values ('test1'); insert into t2 (c) values ('test2'); insert into t2 (c) values ('test2'); insert into t2 (c) values ('test2'); select * from t3; c test1 test1 test1 test2 test2 test2 select * from t3; c test1 test1 test1 test2 test2 test2 delete from t3 where 1=1; select * from t3; c select * from t1; c drop table t3,t2,t1; CREATE TABLE t1 (incr int not null, othr int not null, primary key(incr)); CREATE TABLE t2 (incr int not null, othr int not null, primary key(incr)); CREATE TABLE t3 (incr int not null, othr int not null, primary key(incr)) ENGINE=MERGE UNION=(t1,t2); SELECT * from t3; incr othr INSERT INTO t1 VALUES ( 1,10),( 3,53),( 5,21),( 7,12),( 9,17); INSERT INTO t2 VALUES ( 2,24),( 4,33),( 6,41),( 8,26),( 0,32); INSERT INTO t1 VALUES (11,20),(13,43),(15,11),(17,22),(19,37); INSERT INTO t2 VALUES (12,25),(14,31),(16,42),(18,27),(10,30); SELECT * from t3 where incr in (1,2,3,4) order by othr; incr othr 1 10 2 24 4 33 3 53 alter table t3 UNION=(t1); select count(*) from t3; count(*) 10 alter table t3 UNION=(t1,t2); select count(*) from t3; count(*) 20 alter table t3 ENGINE=MYISAM; select count(*) from t3; count(*) 20 drop table t3; CREATE TABLE t3 (incr int not null, othr int not null, primary key(incr)) ENGINE=MERGE UNION=(t1,t2); show create table t3; Table Create Table t3 CREATE TABLE `t3` ( `incr` int(11) NOT NULL, `othr` int(11) NOT NULL, PRIMARY KEY (`incr`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t1`,`t2`) alter table t3 drop primary key; show create table t3; Table Create Table t3 CREATE TABLE `t3` ( `incr` int(11) NOT NULL, `othr` int(11) NOT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t1`,`t2`) drop table t3,t2,t1; create table t1 (a int not null, key(a)) engine=merge; select * from t1; ERROR HY000: Got error 124 from storage engine drop table t1; create table t1 (a int not null, b int not null, key(a,b)); create table t2 (a int not null, b int not null, key(a,b)); create table t3 (a int not null, b int not null, key(a,b)) ENGINE=MERGE UNION=(t1,t2); insert into t1 values (1,2),(2,1),(0,0),(4,4),(5,5),(6,6); insert into t2 values (1,1),(2,2),(0,0),(4,4),(5,5),(6,6); flush tables; select * from t3 where a=1 order by b limit 2; a b 1 1 1 2 drop table t3,t1,t2; create table t1 (a int not null, b int not null auto_increment, primary key(a,b)); create table t2 (a int not null, b int not null auto_increment, primary key(a,b)); create table t3 (a int not null, b int not null, key(a,b)) UNION=(t1,t2) INSERT_METHOD=NO; create table t4 (a int not null, b int not null, key(a,b)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=NO; create table t5 (a int not null, b int not null auto_increment, primary key(a,b)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=FIRST; create table t6 (a int not null, b int not null auto_increment, primary key(a,b)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST; show create table t3; Table Create Table t3 CREATE TABLE `t3` ( `a` int(11) NOT NULL, `b` int(11) NOT NULL, KEY `a` (`a`,`b`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 show create table t4; Table Create Table t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL, `b` int(11) NOT NULL, KEY `a` (`a`,`b`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t1`,`t2`) show create table t5; Table Create Table t5 CREATE TABLE `t5` ( `a` int(11) NOT NULL, `b` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`a`,`b`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=FIRST UNION=(`t1`,`t2`) show create table t6; Table Create Table t6 CREATE TABLE `t6` ( `a` int(11) NOT NULL, `b` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`a`,`b`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`t1`,`t2`) insert into t1 values (1,NULL),(1,NULL),(1,NULL),(1,NULL); insert into t2 values (2,NULL),(2,NULL),(2,NULL),(2,NULL); select * from t3 order by b,a limit 3; a b select * from t4 order by b,a limit 3; a b 1 1 2 1 1 2 select * from t5 order by b,a limit 3,3; a b 2 2 1 3 2 3 select * from t6 order by b,a limit 6,3; a b 1 4 2 4 insert into t5 values (5,1),(5,2); insert into t6 values (6,1),(6,2); select * from t1 order by a,b; a b 1 1 1 2 1 3 1 4 5 1 5 2 select * from t2 order by a,b; a b 2 1 2 2 2 3 2 4 6 1 6 2 select * from t4 order by a,b; a b 1 1 1 2 1 3 1 4 2 1 2 2 2 3 2 4 5 1 5 2 6 1 6 2 insert into t3 values (3,1),(3,2),(3,3),(3,4); select * from t3 order by a,b; a b 3 1 3 2 3 3 3 4 alter table t4 UNION=(t1,t2,t3); show create table t4; Table Create Table t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL, `b` int(11) NOT NULL, KEY `a` (`a`,`b`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`t1`,`t2`,`t3`) select * from t4 order by a,b; a b 1 1 1 2 1 3 1 4 2 1 2 2 2 3 2 4 3 1 3 2 3 3 3 4 5 1 5 2 6 1 6 2 alter table t4 INSERT_METHOD=FIRST; show create table t4; Table Create Table t4 CREATE TABLE `t4` ( `a` int(11) NOT NULL, `b` int(11) NOT NULL, KEY `a` (`a`,`b`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=FIRST UNION=(`t1`,`t2`,`t3`) insert into t4 values (4,1),(4,2); select * from t1 order by a,b; a b 1 1 1 2 1 3 1 4 4 1 4 2 5 1 5 2 select * from t2 order by a,b; a b 2 1 2 2 2 3 2 4 6 1 6 2 select * from t3 order by a,b; a b 3 1 3 2 3 3 3 4 select * from t4 order by a,b; a b 1 1 1 2 1 3 1 4 2 1 2 2 2 3 2 4 3 1 3 2 3 3 3 4 4 1 4 2 5 1 5 2 6 1 6 2 select * from t5 order by a,b; a b 1 1 1 2 1 3 1 4 2 1 2 2 2 3 2 4 4 1 4 2 5 1 5 2 6 1 6 2 select 1; 1 1 insert into t5 values (1,NULL),(5,NULL); insert into t6 values (2,NULL),(6,NULL); select * from t1 order by a,b; a b 1 1 1 2 1 3 1 4 1 5 4 1 4 2 5 1 5 2 5 3 select * from t2 order by a,b; a b 2 1 2 2 2 3 2 4 2 5 6 1 6 2 6 3 select * from t5 order by a,b; a b 1 1 1 2 1 3 1 4 1 5 2 1 2 2 2 3 2 4 2 5 4 1 4 2 5 1 5 2 5 3 6 1 6 2 6 3 select * from t6 order by a,b; a b 1 1 1 2 1 3 1 4 1 5 2 1 2 2 2 3 2 4 2 5 4 1 4 2 5 1 5 2 5 3 6 1 6 2 6 3 insert into t1 values (99,NULL); select * from t4 where a+0 > 90; a b 99 1 insert t5 values (1,1); ERROR 23000: Duplicate entry '1-1' for key 'PRIMARY' insert t6 values (2,1); ERROR 23000: Duplicate entry '2-1' for key 'PRIMARY' insert t5 values (1,1) on duplicate key update b=b+10; insert t6 values (2,1) on duplicate key update b=b+20; select * from t5 where a < 3; a b 1 2 1 3 1 4 1 5 1 11 2 2 2 3 2 4 2 5 2 21 drop table t6, t5, t4, t3, t2, t1; CREATE TABLE t1 ( a int(11) NOT NULL default '0', b int(11) NOT NULL default '0', PRIMARY KEY (a,b)) ENGINE=MyISAM; INSERT INTO t1 VALUES (1,1), (2,1); CREATE TABLE t2 ( a int(11) NOT NULL default '0', b int(11) NOT NULL default '0', PRIMARY KEY (a,b)) ENGINE=MyISAM; INSERT INTO t2 VALUES (1,2), (2,2); CREATE TABLE t3 ( a int(11) NOT NULL default '0', b int(11) NOT NULL default '0', KEY a (a,b)) ENGINE=MRG_MyISAM UNION=(t1,t2); select max(b) from t3 where a = 2; max(b) 2 select max(b) from t1 where a = 2; max(b) 1 drop table t3,t1,t2; create table t1 (a int not null); create table t2 (a int not null); insert into t1 values (1); insert into t2 values (2); create temporary table t3 (a int not null) ENGINE=MERGE UNION=(t1,t2); select * from t3; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist create temporary table t4 (a int not null); create temporary table t5 (a int not null); insert into t4 values (1); insert into t5 values (2); create temporary table t6 (a int not null) ENGINE=MERGE UNION=(t4,t5); select * from t6; a 1 2 drop table t6, t3, t1, t2, t4, t5; create temporary table t1 (a int not null); create temporary table t2 (a int not null); insert into t1 values (1); insert into t2 values (2); create table t3 (a int not null) ENGINE=MERGE UNION=(t1,t2); select * from t3; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist drop table t3, t2, t1; create table t1 (a int not null); create temporary table t2 (a int not null); insert into t1 values (1); insert into t2 values (2); create table t3 (a int not null) ENGINE=MERGE UNION=(t1,t2); select * from t3; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist drop table t3; create temporary table t3 (a int not null) ENGINE=MERGE UNION=(t1,t2); select * from t3; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist drop table t3, t2, t1; # CREATE...SELECT is not implemented for MERGE tables. CREATE TEMPORARY TABLE t1 (c1 INT NOT NULL); CREATE TEMPORARY TABLE t2 (c1 INT NOT NULL); CREATE TABLE t3 (c1 INT NOT NULL); INSERT INTO t3 VALUES (3), (33); LOCK TABLES t3 READ; CREATE TEMPORARY TABLE t4 (c1 INT NOT NULL) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST SELECT * FROM t3; ERROR HY000: 'test.t4' is not BASE TABLE SELECT * FROM t4; ERROR HY000: Table 't4' was not locked with LOCK TABLES UNLOCK TABLES; CREATE TEMPORARY TABLE t4 (c1 INT NOT NULL) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST; INSERT INTO t4 SELECT * FROM t3; # Alter temporary MERGE table. ALTER TABLE t4 UNION=(t1); LOCK TABLES t4 WRITE; # Alter temporary MERGE table under LOCk tables. ALTER TABLE t4 UNION=(t1,t2); UNLOCK TABLES; # MERGE table and function. CREATE FUNCTION f1 () RETURNS INT RETURN (SELECT max(c1) FROM t3); SELECT * FROM t4 WHERE c1 < f1(); c1 3 DROP FUNCTION f1; DROP TABLE t4, t3, t2, t1; CREATE TABLE t1 ( fileset_id tinyint(3) unsigned NOT NULL default '0', file_code varchar(32) NOT NULL default '', fileset_root_id tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (fileset_id,file_code), KEY files (fileset_id,fileset_root_id) ) ENGINE=MyISAM; INSERT INTO t1 VALUES (2, '0000000111', 1), (2, '0000000112', 1), (2, '0000000113', 1), (2, '0000000114', 1), (2, '0000000115', 1), (2, '0000000116', 1), (2, '0000000117', 1), (2, '0000000118', 1), (2, '0000000119', 1), (2, '0000000120', 1); CREATE TABLE t2 ( fileset_id tinyint(3) unsigned NOT NULL default '0', file_code varchar(32) NOT NULL default '', fileset_root_id tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (fileset_id,file_code), KEY files (fileset_id,fileset_root_id) ) ENGINE=MRG_MyISAM UNION=(t1); EXPLAIN SELECT * FROM t2 IGNORE INDEX (files) WHERE fileset_id = 2 AND file_code BETWEEN '0000000115' AND '0000000120' LIMIT 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 range PRIMARY PRIMARY 35 NULL 5 Using where EXPLAIN SELECT * FROM t2 WHERE fileset_id = 2 AND file_code BETWEEN '0000000115' AND '0000000120' LIMIT 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 range PRIMARY,files PRIMARY 35 NULL 5 Using where EXPLAIN SELECT * FROM t1 WHERE fileset_id = 2 AND file_code BETWEEN '0000000115' AND '0000000120' LIMIT 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range PRIMARY,files PRIMARY 35 NULL 5 Using where EXPLAIN SELECT * FROM t2 WHERE fileset_id = 2 AND file_code = '0000000115' LIMIT 1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 const PRIMARY,files PRIMARY 35 const,const 1 DROP TABLE t2, t1; create table t1 (x int, y int, index xy(x, y)); create table t2 (x int, y int, index xy(x, y)); create table t3 (x int, y int, index xy(x, y)) engine=merge union=(t1,t2); insert into t1 values(1, 2); insert into t2 values(1, 3); select * from t3 where x = 1 and y < 5 order by y; x y 1 2 1 3 select * from t3 where x = 1 and y < 5 order by y desc; x y 1 3 1 2 drop table t1,t2,t3; create table t1 (a int); create table t2 (a int); insert into t1 values (0); insert into t2 values (1); create table t3 engine=merge union=(t1, t2) select * from t1; ERROR HY000: 'test.t3' is not BASE TABLE create table t3 engine=merge union=(t1, t2) select * from t2; ERROR HY000: 'test.t3' is not BASE TABLE create table t3 engine=merge union=(t1, t2) select (select max(a) from t2); ERROR HY000: 'test.t3' is not BASE TABLE drop table t1, t2; create table t1 ( a double(14,4), b varchar(10), index (a,b) ) engine=merge union=(t2,t3); create table t2 ( a double(14,4), b varchar(10), index (a,b) ) engine=myisam; create table t3 ( a double(14,4), b varchar(10), index (a,b) ) engine=myisam; insert into t2 values ( null, ''); insert into t2 values ( 9999999999.999, ''); insert into t3 select * from t2; select min(a), max(a) from t1; min(a) max(a) 9999999999.9990 9999999999.9990 flush tables; select min(a), max(a) from t1; min(a) max(a) 9999999999.9990 9999999999.9990 drop table t1, t2, t3; create table t1 (a int,b int,c int, index (a,b,c)); create table t2 (a int,b int,c int, index (a,b,c)); create table t3 (a int,b int,c int, index (a,b,c)) engine=merge union=(t1 ,t2); insert into t1 (a,b,c) values (1,1,0),(1,2,0); insert into t2 (a,b,c) values (1,1,1),(1,2,1); explain select a,b,c from t3 force index (a) where a=1 order by a,b,c; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t3 ref a a 5 const 2 Using where; Using index select a,b,c from t3 force index (a) where a=1 order by a,b,c; a b c 1 1 0 1 1 1 1 2 0 1 2 1 explain select a,b,c from t3 force index (a) where a=1 order by a desc, b desc, c desc; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t3 ref a a 5 const 2 Using where; Using index select a,b,c from t3 force index (a) where a=1 order by a desc, b desc, c desc; a b c 1 2 1 1 2 0 1 1 1 1 1 0 show index from t3; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t3 1 a 1 a A NULL NULL NULL YES BTREE t3 1 a 2 b A NULL NULL NULL YES BTREE t3 1 a 3 c A NULL NULL NULL YES BTREE drop table t1, t2, t3; CREATE TABLE t1 ( a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(10), UNIQUE (b) ) ENGINE=MyISAM; CREATE TABLE t2 ( a INT AUTO_INCREMENT, b VARCHAR(10), INDEX (a), INDEX (b) ) ENGINE=MERGE UNION (t1) INSERT_METHOD=FIRST; INSERT INTO t2 (b) VALUES (1) ON DUPLICATE KEY UPDATE b=2; INSERT INTO t2 (b) VALUES (1) ON DUPLICATE KEY UPDATE b=3; SELECT b FROM t2; b 3 DROP TABLE t1, t2; create table t1(a int); create table t2(a int); insert into t1 values (1); insert into t2 values (2); create table t3 (a int) engine=merge union=(t1, t2) insert_method=first; select * from t3; a 1 2 insert t2 select * from t2; select * from t2; a 2 2 insert t3 select * from t1; select * from t3; a 1 1 2 2 insert t1 select * from t3; select * from t1; a 1 1 1 1 2 2 select * from t2; a 2 2 select * from t3; a 1 1 1 1 2 2 2 2 check table t1, t2; Table Op Msg_type Msg_text test.t1 check status OK test.t2 check status OK drop table t1, t2, t3; CREATE TABLE t1(a INT); INSERT INTO t1 VALUES(2),(1); CREATE TABLE t2(a INT, KEY(a)) ENGINE=MERGE UNION=(t1); SELECT * FROM t2 WHERE a=2; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, t2; CREATE TABLE t1(a INT) ENGINE=MEMORY; CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t1); SELECT * FROM t2; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, t2; CREATE TABLE t2(a INT) ENGINE=MERGE UNION=(t3); SELECT * FROM t2; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t2; CREATE TABLE t1(a INT, b TEXT); CREATE TABLE tm1(a TEXT, b INT) ENGINE=MERGE UNION=(t1); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, tm1; CREATE TABLE t1(a SMALLINT, b SMALLINT); CREATE TABLE tm1(a INT) ENGINE=MERGE UNION=(t1); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, tm1; CREATE TABLE t1(a SMALLINT, b SMALLINT, KEY(a, b)); CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, tm1; CREATE TABLE t1(a SMALLINT, b SMALLINT, KEY(b)); CREATE TABLE tm1(a SMALLINT, b SMALLINT, KEY(a)) ENGINE=MERGE UNION=(t1); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, tm1; CREATE TABLE t1(c1 VARCHAR(1)); CREATE TABLE m1 LIKE t1; ALTER TABLE m1 ENGINE=MERGE UNION=(t1); SELECT * FROM m1; c1 DROP TABLE t1, m1; CREATE TABLE t1(c1 VARCHAR(4), c2 TINYINT, c3 TINYINT, c4 TINYINT, c5 TINYINT, c6 TINYINT, c7 TINYINT, c8 TINYINT, c9 TINYINT); CREATE TABLE m1 LIKE t1; ALTER TABLE m1 ENGINE=MERGE UNION=(t1); SELECT * FROM m1; c1 c2 c3 c4 c5 c6 c7 c8 c9 DROP TABLE t1, m1; CREATE TABLE t1 (a VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_german2_ci, b INT, INDEX(a,b)); CREATE TABLE t2 LIKE t1; CREATE TABLE t3 LIKE t1; ALTER TABLE t3 ENGINE=MERGE UNION=(t1,t2); INSERT INTO t1 VALUES ('ss',1); INSERT INTO t2 VALUES ('ss',2),(0xDF,2); SELECT COUNT(*) FROM t3 WHERE a=0xDF AND b=2; COUNT(*) 2 DROP TABLE t1,t2,t3; create table t1 (b bit(1)); create table t2 (b bit(1)); create table tm (b bit(1)) engine = merge union = (t1,t2); select * from tm; b drop table tm, t1, t2; create table t1 (a int) insert_method = last engine = merge; insert into t1 values (1); ERROR HY000: Table 't1' is read only create table t2 (a int) engine = myisam; alter table t1 union (t2); insert into t1 values (1); alter table t1 insert_method = no; insert into t1 values (1); ERROR HY000: Table 't1' is read only drop table t2; drop table t1; CREATE TABLE tm1(a INT) ENGINE=MERGE UNION=(t1, t2); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist CHECK TABLE tm1; Table Op Msg_type Msg_text test.tm1 check Error Table 'test.t1' doesn't exist test.tm1 check Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist test.tm1 check error Corrupt CREATE TABLE t1(a INT); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist CHECK TABLE tm1; Table Op Msg_type Msg_text test.tm1 check Error Table 'test.t2' doesn't exist test.tm1 check Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist test.tm1 check error Corrupt CREATE TABLE t2(a BLOB); SELECT * FROM tm1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist CHECK TABLE tm1; Table Op Msg_type Msg_text test.tm1 check Warning Table 'test.t2' is differently defined or of non-MyISAM type or doesn't exist test.tm1 check Error Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist test.tm1 check error Corrupt ALTER TABLE t2 MODIFY a INT; SELECT * FROM tm1; a CHECK TABLE tm1; Table Op Msg_type Msg_text test.tm1 check status OK DROP TABLE tm1, t1, t2; CREATE TABLE t1(c1 INT); CREATE TABLE t2 (c1 INT) ENGINE=MERGE UNION=(t1) INSERT_METHOD=FIRST; CREATE TABLE IF NOT EXISTS t1 SELECT * FROM t2; ERROR HY000: You can't specify target table 't1' for update in FROM clause DROP TABLE t1, t2; CREATE TABLE t1 (id INT NOT NULL, ref INT NOT NULL, INDEX (id)) ENGINE=MyISAM; CREATE TABLE t2 LIKE t1; INSERT INTO t2 (id, ref) VALUES (1,3), (2,1), (3,2), (4,5), (4,4); INSERT INTO t1 SELECT * FROM t2; INSERT INTO t1 SELECT * FROM t2; CREATE TABLE t3 (id INT NOT NULL, ref INT NOT NULL, INDEX (id)) ENGINE=MERGE UNION(t1); SELECT * FROM t3 AS a INNER JOIN t3 AS b USING (id) WHERE a.ref < b.ref; id ref ref 4 4 5 4 4 5 4 4 5 4 4 5 SELECT * FROM t3; id ref 1 3 2 1 3 2 4 5 4 4 1 3 2 1 3 2 4 5 4 4 DELETE FROM a USING t3 AS a INNER JOIN t3 AS b USING (id) WHERE a.ref < b.ref; SELECT * FROM t3; id ref 1 3 2 1 3 2 4 5 1 3 2 1 3 2 4 5 DROP TABLE t1, t2, t3; CREATE TABLE t1(a INT); CREATE TABLE m1(a INT) ENGINE=MERGE; SHOW CREATE TABLE m1; Table Create Table m1 CREATE TABLE `m1` ( `a` int(11) DEFAULT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 DROP TABLE m1; CREATE TABLE m1(a INT) ENGINE=MERGE UNION=(); SHOW CREATE TABLE m1; Table Create Table m1 CREATE TABLE `m1` ( `a` int(11) DEFAULT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 ALTER TABLE m1 UNION=(t1); ALTER TABLE m1 UNION=(); SHOW CREATE TABLE m1; Table Create Table m1 CREATE TABLE `m1` ( `a` int(11) DEFAULT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1, m1; CREATE TABLE t1(a INT); CREATE TABLE t2(a VARCHAR(10)); CREATE TABLE m1(a INT) ENGINE=MERGE UNION=(t1, t2); CREATE TABLE m2(a INT) ENGINE=MERGE UNION=(t1); SELECT * FROM t1; a SELECT * FROM m1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist SELECT * FROM m2; a DROP TABLE t1, t2, m1, m2; End of 5.0 tests create table t1 (c1 int, index(c1)); create table t2 (c1 int, index(c1)) engine=merge union=(t1); insert into t1 values (1); flush tables; select * from t2; c1 1 flush tables; truncate table t1; insert into t1 values (1); flush tables; select * from t2; c1 1 truncate table t1; insert into t1 values (1); drop table t1,t2; # # Extra tests for TRUNCATE. # # Truncate MERGE table. CREATE TABLE t1 (c1 INT, INDEX(c1)); CREATE TABLE t2 (c1 INT, INDEX(c1)); CREATE TABLE t3 (c1 INT, INDEX(c1)) ENGINE=MRG_MYISAM UNION=(t1,t2); INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (2); SELECT * FROM t3; c1 1 2 TRUNCATE TABLE t3; SELECT * FROM t3; c1 # # Truncate child table. INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (2); TRUNCATE TABLE t1; SELECT * FROM t3; c1 2 # # Truncate MERGE table under locked tables. LOCK TABLE t1 WRITE, t2 WRITE, t3 WRITE; INSERT INTO t1 VALUES (1); TRUNCATE TABLE t3; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3; c1 1 2 # # Truncate child table under locked tables. TRUNCATE TABLE t1; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3; c1 1 2 UNLOCK TABLES; DROP TABLE t1, t2, t3; # # Truncate temporary MERGE table. CREATE TEMPORARY TABLE t1 (c1 INT, INDEX(c1)); CREATE TEMPORARY TABLE t2 (c1 INT, INDEX(c1)); CREATE TEMPORARY TABLE t3 (c1 INT, INDEX(c1)) ENGINE=MRG_MYISAM UNION=(t1,t2); INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (2); SELECT * FROM t3; c1 1 2 TRUNCATE TABLE t3; SELECT * FROM t3; c1 # # Truncate temporary child table. INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (2); TRUNCATE TABLE t1; SELECT * FROM t3; c1 2 # # Truncate temporary MERGE table under locked tables. INSERT INTO t1 VALUES (1); CREATE TABLE t4 (c1 INT, INDEX(c1)); LOCK TABLE t4 WRITE; TRUNCATE TABLE t3; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3; c1 1 2 # # Truncate temporary child table under locked tables. TRUNCATE TABLE t1; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3; c1 1 2 UNLOCK TABLES; DROP TABLE t1, t2, t3, t4; CREATE TABLE t1 (c1 INT) ENGINE= MyISAM; CREATE TABLE t2 (c1 INT) ENGINE= MRG_MYISAM UNION= (t1) INSERT_METHOD= LAST; REPAIR TABLE t1; INSERT INTO t2 VALUES (1); Table Op Msg_type Msg_text test.t1 repair status OK DROP TABLE t1, t2; CREATE TABLE t1 (c1 INT) ENGINE= MyISAM; CREATE TABLE t2 (c1 INT) ENGINE= MRG_MYISAM UNION= (t1) INSERT_METHOD= LAST; LOCK TABLE t1 WRITE; INSERT INTO t2 VALUES (1); REPAIR TABLE t1; Table Op Msg_type Msg_text test.t1 repair status OK UNLOCK TABLES; DROP TABLE t1, t2; CREATE TABLE t1 (c1 INT) ENGINE= MyISAM; LOCK TABLE t1 WRITE; INSERT INTO t1 VALUES (1); FLUSH TABLES; FLUSH TABLES; SELECT * FROM t1; c1 UNLOCK TABLES; DROP TABLE t1; # # Extra tests for Bug#26379 - Combination of FLUSH TABLE and # REPAIR TABLE corrupts a MERGE table # # CREATE ... SELECT is disabled for MERGE tables. # CREATE TABLE t1(c1 INT); INSERT INTO t1 VALUES (1); CREATE TABLE t2 (c1 INT) ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=LAST; CREATE TABLE t3 ENGINE=MRG_MYISAM INSERT_METHOD=LAST SELECT * FROM t2; ERROR HY000: Table 't3' is read only SHOW CREATE TABLE t3; ERROR 42S02: Table 'test.t3' doesn't exist CREATE TABLE t3 ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=LAST SELECT * FROM t2; ERROR HY000: 'test.t3' is not BASE TABLE SHOW CREATE TABLE t3; ERROR 42S02: Table 'test.t3' doesn't exist DROP TABLE t1, t2; # # CREATE ... LIKE # # 1. Create like. CREATE TABLE t1 (c1 INT); CREATE TABLE t2 (c1 INT); CREATE TABLE t3 (c1 INT) ENGINE=MRG_MYISAM UNION=(t1,t2) INSERT_METHOD=LAST; INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (2); INSERT INTO t3 VALUES (3); CREATE TABLE t4 LIKE t3; SHOW CREATE TABLE t4; Table Create Table t4 CREATE TABLE `t4` ( `c1` int(11) DEFAULT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT INTO t4 VALUES (4); ERROR HY000: Table 't4' is read only DROP TABLE t4; # # 1. Create like with locked tables. LOCK TABLES t3 WRITE, t2 WRITE, t1 WRITE; CREATE TABLE t4 LIKE t3; SHOW CREATE TABLE t4; ERROR HY000: Table 't4' was not locked with LOCK TABLES INSERT INTO t4 VALUES (4); ERROR HY000: Table 't4' was not locked with LOCK TABLES UNLOCK TABLES; SHOW CREATE TABLE t4; Table Create Table t4 CREATE TABLE `t4` ( `c1` int(11) DEFAULT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT INTO t4 VALUES (4); ERROR HY000: Table 't4' is read only DROP TABLE t4; # # Rename child. # # 1. Normal rename of non-MERGE table. CREATE TABLE t4 (c1 INT); INSERT INTO t4 VALUES (4); SELECT * FROM t4 ORDER BY c1; c1 4 RENAME TABLE t4 TO t5; SELECT * FROM t5 ORDER BY c1; c1 4 RENAME TABLE t5 TO t4; SELECT * FROM t4 ORDER BY c1; c1 4 DROP TABLE t4; # # 2. Normal rename. SELECT * FROM t3 ORDER BY c1; c1 1 2 3 RENAME TABLE t2 TO t5; SELECT * FROM t3 ORDER BY c1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist RENAME TABLE t5 TO t2; SELECT * FROM t3 ORDER BY c1; c1 1 2 3 # # 3. Normal rename with locked tables. LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE; SELECT * FROM t3 ORDER BY c1; c1 1 2 3 RENAME TABLE t2 TO t5; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3 ORDER BY c1; c1 1 2 3 RENAME TABLE t5 TO t2; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # # 4. Alter table rename. ALTER TABLE t2 RENAME TO t5; SELECT * FROM t3 ORDER BY c1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist ALTER TABLE t5 RENAME TO t2; SELECT * FROM t3 ORDER BY c1; c1 1 2 3 # # 5. Alter table rename with locked tables. LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE; ALTER TABLE t2 RENAME TO t5; SELECT * FROM t3 ORDER BY c1; ERROR HY000: Table 't3' was not locked with LOCK TABLES ALTER TABLE t5 RENAME TO t2; ERROR HY000: Table 't5' was not locked with LOCK TABLES UNLOCK TABLES; ALTER TABLE t5 RENAME TO t2; SELECT * FROM t3 ORDER BY c1; c1 1 2 3 # # Rename parent. # # 1. Normal rename with locked tables. LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE; SELECT * FROM t3 ORDER BY c1; c1 1 2 3 RENAME TABLE t3 TO t5; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3 ORDER BY c1; c1 1 2 3 RENAME TABLE t5 TO t3; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SELECT * FROM t3 ORDER BY c1; c1 1 2 3 # # 5. Alter table rename with locked tables. ALTER TABLE t3 RENAME TO t5; SELECT * FROM t5 ORDER BY c1; ERROR HY000: Table 't5' was not locked with LOCK TABLES ALTER TABLE t5 RENAME TO t3; ERROR HY000: Table 't5' was not locked with LOCK TABLES UNLOCK TABLES; ALTER TABLE t5 RENAME TO t3; SELECT * FROM t3 ORDER BY c1; c1 1 2 3 DROP TABLE t1, t2, t3; # # Drop locked tables. # # 1. Drop parent. CREATE TABLE t1 (c1 INT, INDEX(c1)); CREATE TABLE t2 (c1 INT, INDEX(c1)) ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=LAST; LOCK TABLES t1 WRITE, t2 WRITE; INSERT INTO t1 VALUES (1); DROP TABLE t2; SELECT * FROM t2; ERROR HY000: Table 't2' was not locked with LOCK TABLES SELECT * FROM t1; c1 1 UNLOCK TABLES; # 2. Drop child. CREATE TABLE t2 (c1 INT, INDEX(c1)) ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=LAST; LOCK TABLES t1 WRITE, t2 WRITE; INSERT INTO t1 VALUES (1); DROP TABLE t1; SELECT * FROM t2; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist SELECT * FROM t1; ERROR 42S02: Table 'test.t1' doesn't exist UNLOCK TABLES; DROP TABLE t2; # # ALTER TABLE. Change child list. # CREATE TABLE t1 (c1 INT, INDEX(c1)); CREATE TABLE t2 (c1 INT, INDEX(c1)); CREATE TABLE t3 (c1 INT, INDEX(c1)); INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (2); INSERT INTO t3 VALUES (3); CREATE TABLE t4 (c1 INT, INDEX(c1)) ENGINE=MRG_MYISAM UNION=(t3,t2) INSERT_METHOD=LAST; # Shrink child list. ALTER TABLE t4 UNION=(t3); SHOW CREATE TABLE t4; Table Create Table t4 CREATE TABLE `t4` ( `c1` int(11) DEFAULT NULL, KEY `c1` (`c1`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`t3`) SELECT * FROM t4 ORDER BY c1; c1 3 # Extend child list. ALTER TABLE t4 UNION=(t3,t2); SHOW CREATE TABLE t4; Table Create Table t4 CREATE TABLE `t4` ( `c1` int(11) DEFAULT NULL, KEY `c1` (`c1`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`t3`,`t2`) SELECT * FROM t4 ORDER BY c1; c1 2 3 # # ALTER TABLE under LOCK TABLES. Change child list. # LOCK TABLES t4 WRITE, t3 WRITE, t2 WRITE; # Shrink child list. ALTER TABLE t4 UNION=(t3); ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction # Extend child list within locked tables. ALTER TABLE t4 UNION=(t3,t2); ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction # Extend child list beyond locked tables. ALTER TABLE t4 UNION=(t3,t2,t1); ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction SHOW CREATE TABLE t4; Table Create Table t4 CREATE TABLE `t4` ( `c1` int(11) DEFAULT NULL, KEY `c1` (`c1`) ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`t3`,`t2`) SELECT * FROM t4 ORDER BY c1; c1 2 3 UNLOCK TABLES; DROP TABLE t4; # # ALTER TABLE under LOCK TABLES. Grave change, table re-creation. # CREATE TABLE t4 (c1 INT, INDEX(c1)) ENGINE=MRG_MYISAM UNION=(t1,t2,t3) INSERT_METHOD=LAST; # Lock parent first and then children. LOCK TABLES t4 WRITE, t3 WRITE, t2 WRITE, t1 WRITE; ALTER TABLE t4 DROP INDEX c1, ADD UNIQUE INDEX (c1); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 ALTER TABLE t2 DROP INDEX c1, ADD UNIQUE INDEX (c1); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # Lock children first and then parent. LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE, t4 WRITE; ALTER TABLE t4 DROP INDEX c1, ADD UNIQUE INDEX (c1); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 ALTER TABLE t2 DROP INDEX c1, ADD UNIQUE INDEX (c1); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # Lock parent between children. LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; ALTER TABLE t4 DROP INDEX c1, ADD UNIQUE INDEX (c1); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 ALTER TABLE t2 DROP INDEX c1, ADD UNIQUE INDEX (c1); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; DROP TABLE t1, t2, t3, t4; # # ALTER TABLE under LOCK TABLES. Simple change, no re-creation. # CREATE TABLE t1 (c1 INT); CREATE TABLE t2 (c1 INT); CREATE TABLE t3 (c1 INT); CREATE TABLE t4 (c1 INT) ENGINE=MRG_MYISAM UNION=(t1,t2,t3) INSERT_METHOD=LAST; INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (2); INSERT INTO t3 VALUES (3); # Lock parent first and then children. LOCK TABLES t4 WRITE, t3 WRITE, t2 WRITE, t1 WRITE; ALTER TABLE t4 ALTER COLUMN c1 SET DEFAULT 44; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 ALTER TABLE t2 ALTER COLUMN c1 SET DEFAULT 22; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # Lock children first and then parent. LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE, t4 WRITE; ALTER TABLE t4 ALTER COLUMN c1 SET DEFAULT 44; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 ALTER TABLE t2 ALTER COLUMN c1 SET DEFAULT 22; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # Lock parent between children. LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; ALTER TABLE t4 ALTER COLUMN c1 SET DEFAULT 44; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 ALTER TABLE t2 ALTER COLUMN c1 SET DEFAULT 22; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # # FLUSH TABLE under LOCK TABLES. # # Lock parent first and then children. LOCK TABLES t4 WRITE, t3 WRITE, t2 WRITE, t1 WRITE; FLUSH TABLE t4; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 FLUSH TABLE t2; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 FLUSH TABLES; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # Lock children first and then parent. LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE, t4 WRITE; FLUSH TABLE t4; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 FLUSH TABLE t2; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 FLUSH TABLES; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # Lock parent between children. LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; FLUSH TABLE t4; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 FLUSH TABLE t2; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 FLUSH TABLES; SELECT * FROM t4 ORDER BY c1; c1 1 2 3 UNLOCK TABLES; # # Triggers # # Trigger on parent DELETE FROM t4 WHERE c1 = 4; CREATE TRIGGER t4_ai AFTER INSERT ON t4 FOR EACH ROW SET @a=1; SET @a=0; INSERT INTO t4 VALUES (4); SELECT @a; @a 1 SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 DROP TRIGGER t4_ai; # Trigger on parent under LOCK TABLES LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; CREATE TRIGGER t4_ai AFTER INSERT ON t4 FOR EACH ROW SET @a=1; SET @a=0; INSERT INTO t4 VALUES (4); SELECT @a; @a 1 SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 DROP TRIGGER t4_ai; UNLOCK TABLES; # # Trigger on child DELETE FROM t4 WHERE c1 = 4; CREATE TRIGGER t3_ai AFTER INSERT ON t3 FOR EACH ROW SET @a=1; SET @a=0; INSERT INTO t4 VALUES (4); SELECT @a; @a 0 INSERT INTO t3 VALUES (33); SELECT @a; @a 1 SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 33 DROP TRIGGER t3_ai; # Trigger on child under LOCK TABLES LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; CREATE TRIGGER t3_ai AFTER INSERT ON t3 FOR EACH ROW SET @a=1; SET @a=0; INSERT INTO t4 VALUES (4); SELECT @a; @a 0 INSERT INTO t3 VALUES (33); SELECT @a; @a 1 SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 33 33 DELETE FROM t4 WHERE c1 = 33; DROP TRIGGER t3_ai; # # Trigger with table use on child DELETE FROM t4 WHERE c1 = 4; CREATE TRIGGER t3_ai AFTER INSERT ON t3 FOR EACH ROW INSERT INTO t2 VALUES(22); INSERT INTO t4 VALUES (4); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 INSERT INTO t3 VALUES (33); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 22 33 DELETE FROM t4 WHERE c1 = 22; DELETE FROM t4 WHERE c1 = 33; DROP TRIGGER t3_ai; # Trigger with table use on child under LOCK TABLES LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; CREATE TRIGGER t3_ai AFTER INSERT ON t3 FOR EACH ROW INSERT INTO t2 VALUES(22); INSERT INTO t4 VALUES (4); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 INSERT INTO t3 VALUES (33); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 22 33 DROP TRIGGER t3_ai; DELETE FROM t4 WHERE c1 = 22; DELETE FROM t4 WHERE c1 = 33; UNLOCK TABLES; # # Repair # REPAIR TABLE t4; Table Op Msg_type Msg_text test.t4 repair note The storage engine for the table doesn't support repair REPAIR TABLE t2; Table Op Msg_type Msg_text test.t2 repair status OK SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; REPAIR TABLE t4; Table Op Msg_type Msg_text test.t4 repair note The storage engine for the table doesn't support repair REPAIR TABLE t2; Table Op Msg_type Msg_text test.t2 repair status OK SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 UNLOCK TABLES; # # Optimize # OPTIMIZE TABLE t4; Table Op Msg_type Msg_text test.t4 optimize note The storage engine for the table doesn't support optimize OPTIMIZE TABLE t2; Table Op Msg_type Msg_text test.t2 optimize status OK SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; OPTIMIZE TABLE t4; Table Op Msg_type Msg_text test.t4 optimize note The storage engine for the table doesn't support optimize OPTIMIZE TABLE t2; Table Op Msg_type Msg_text test.t2 optimize status Table is already up to date SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 UNLOCK TABLES; # # Checksum # CHECKSUM TABLE t4; Table Checksum test.t4 46622073 CHECKSUM TABLE t2; Table Checksum test.t2 3700403066 SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; CHECKSUM TABLE t4; Table Checksum test.t4 46622073 CHECKSUM TABLE t2; Table Checksum test.t2 3700403066 SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 UNLOCK TABLES; # # Insert delayed # INSERT DELAYED INTO t4 VALUES(44); DELETE FROM t4 WHERE c1 = 44; INSERT DELAYED INTO t3 VALUES(33); SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 33 LOCK TABLES t3 WRITE, t2 WRITE, t4 WRITE, t1 WRITE; INSERT DELAYED INTO t4 VALUES(444); Got one of the listed errors INSERT DELAYED INTO t3 VALUES(333); Got one of the listed errors SELECT * FROM t4 ORDER BY c1; c1 1 2 3 4 4 33 UNLOCK TABLES; DROP TABLE t1, t2, t3, t4; # # Recursive inclusion of merge tables in their union clauses. # CREATE TABLE t1 (c1 INT, INDEX(c1)); CREATE TABLE t2 (c1 INT, INDEX(c1)) ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=LAST; CREATE TABLE t3 (c1 INT, INDEX(c1)) ENGINE=MRG_MYISAM UNION=(t2,t1) INSERT_METHOD=LAST; ALTER TABLE t2 UNION=(t3,t1); SELECT * FROM t2; ERROR HY000: Table 't3' is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, t2, t3; CREATE TABLE t1 (c1 INT) ENGINE= MyISAM; CREATE TABLE t2 (c1 INT) ENGINE= MyISAM; CREATE TABLE t3 (c1 INT) ENGINE= MRG_MYISAM UNION= (t1, t2); INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (2); SELECT * FROM t3; c1 1 2 TRUNCATE TABLE t1; SELECT * FROM t3; c1 2 DROP TABLE t1, t2, t3; CREATE TABLE t1 (id INTEGER, grp TINYINT, id_rev INTEGER); SET @rnd_max= 2147483647; SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); SET @rnd= RAND(); SET @id = CAST(@rnd * @rnd_max AS UNSIGNED); SET @id_rev= @rnd_max - @id; SET @grp= CAST(127.0 * @rnd AS UNSIGNED); INSERT INTO t1 (id, grp, id_rev) VALUES (@id, @grp, @id_rev); set @@read_buffer_size=2*1024*1024; CREATE TABLE t2 SELECT * FROM t1; INSERT INTO t1 (id, grp, id_rev) SELECT id, grp, id_rev FROM t2; INSERT INTO t2 (id, grp, id_rev) SELECT id, grp, id_rev FROM t1; INSERT INTO t1 (id, grp, id_rev) SELECT id, grp, id_rev FROM t2; INSERT INTO t2 (id, grp, id_rev) SELECT id, grp, id_rev FROM t1; INSERT INTO t1 (id, grp, id_rev) SELECT id, grp, id_rev FROM t2; CREATE TABLE t3 (id INTEGER, grp TINYINT, id_rev INTEGER) ENGINE= MRG_MYISAM UNION= (t1, t2); SELECT COUNT(*) FROM t1; COUNT(*) 130 SELECT COUNT(*) FROM t2; COUNT(*) 80 SELECT COUNT(*) FROM t3; COUNT(*) 210 SELECT COUNT(DISTINCT a1.id) FROM t3 AS a1, t3 AS a2 WHERE a1.id = a2.id GROUP BY a2.grp; TRUNCATE TABLE t1; SELECT COUNT(*) FROM t1; COUNT(*) 0 SELECT COUNT(*) FROM t2; COUNT(*) 80 SELECT COUNT(*) FROM t3; COUNT(*) 80 DROP TABLE t1, t2, t3; CREATE TABLE t1 (c1 INT) ENGINE=MyISAM; CREATE TABLE t2 (c1 INT) ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=LAST; INSERT INTO t2 VALUES (1); SELECT * FROM t2; c1 1 LOCK TABLES t2 WRITE, t1 WRITE; FLUSH TABLES; REPAIR TABLE t1; Table Op Msg_type Msg_text test.t1 repair status OK CHECK TABLE t1; Table Op Msg_type Msg_text test.t1 check status OK REPAIR TABLE t1; Table Op Msg_type Msg_text test.t1 repair status OK UNLOCK TABLES; CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check status OK LOCK TABLES t2 WRITE, t1 WRITE; REPAIR TABLE t1; Table Op Msg_type Msg_text test.t1 repair status OK CHECK TABLE t1; Table Op Msg_type Msg_text test.t1 check status OK REPAIR TABLE t1; Table Op Msg_type Msg_text test.t1 repair status OK UNLOCK TABLES; CHECK TABLE t1 EXTENDED; Table Op Msg_type Msg_text test.t1 check status OK DROP TABLE t1, t2; CREATE TABLE t1 ( a INT ) ENGINE=MyISAM; CREATE TABLE m1 ( a INT ) ENGINE=MRG_MYISAM UNION=(t1); LOCK TABLES t1 WRITE, m1 WRITE; FLUSH TABLE t1; UNLOCK TABLES; DROP TABLE m1, t1; CREATE TABLE t1 ( a INT ) ENGINE=MyISAM; CREATE TABLE m1 ( a INT ) ENGINE=MRG_MYISAM UNION=(t1); LOCK TABLES m1 WRITE, t1 WRITE; FLUSH TABLE t1; UNLOCK TABLES; DROP TABLE m1, t1; CREATE TABLE t1 (c1 INT, c2 INT) ENGINE= MyISAM; CREATE TABLE t2 (c1 INT, c2 INT) ENGINE= MyISAM; CREATE TABLE t3 (c1 INT, c2 INT) ENGINE= MRG_MYISAM UNION(t1, t2); INSERT INTO t1 VALUES (1, 1); INSERT INTO t2 VALUES (2, 2); SELECT * FROM t3; c1 c2 1 1 2 2 ALTER TABLE t1 ENGINE= MEMORY; INSERT INTO t1 VALUES (0, 0); SELECT * FROM t3; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE t1, t2, t3; CREATE TABLE t1 (c1 INT, KEY(c1)); CREATE TABLE t2 (c1 INT, KEY(c1)) ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=FIRST; LOCK TABLE t1 WRITE, t2 WRITE; FLUSH TABLES t2, t1; OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status Table is already up to date FLUSH TABLES t1; UNLOCK TABLES; FLUSH TABLES; INSERT INTO t1 VALUES (1); LOCK TABLE t1 WRITE, t2 WRITE; FLUSH TABLES t2, t1; OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status OK FLUSH TABLES t1; UNLOCK TABLES; DROP TABLE t1, t2; CREATE TABLE t1 (ID INT) ENGINE=MYISAM; CREATE TABLE m1 (ID INT) ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=FIRST; INSERT INTO t1 VALUES (); INSERT INTO m1 VALUES (); LOCK TABLE t1 WRITE, m1 WRITE; FLUSH TABLES m1, t1; OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status OK FLUSH TABLES m1, t1; UNLOCK TABLES; DROP TABLE t1, m1; CREATE TABLE tm1 (c1 INT) ENGINE=MRG_MYISAM UNION=(t1) INSERT_METHOD=FIRST; SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test' and TABLE_NAME='tm1'; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT NULL test tm1 BASE TABLE NULL NULL NULL # # # # # # # # # # NULL # # Unable to open underlying table which is differently defined or of non-MyISAM ty DROP TABLE tm1; CREATE TABLE t1(C1 INT, C2 INT, KEY C1(C1), KEY C2(C2)) ENGINE=MYISAM; CREATE TABLE t2(C1 INT, C2 INT, KEY C1(C1), KEY C2(C2)) ENGINE=MYISAM; CREATE TABLE t3(C1 INT, C2 INT, KEY C1(C1), KEY C2(C2)) ENGINE=MYISAM; CREATE TABLE t4(C1 INT, C2 INT, KEY C1(C1), KEY C2(C2)) ENGINE=MRG_MYISAM UNION=(t1, t2, t3); INSERT INTO t1 VALUES (1,1), (1,2),(1,3), (1,4); INSERT INTO t2 VALUES (2,1), (2,2),(2,3), (2,4); INSERT INTO t3 VALUES (3,1), (3,2),(3,3), (3,4); EXPLAIN SELECT COUNT(*) FROM t1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away EXPLAIN SELECT COUNT(*) FROM t4; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away DROP TABLE t1, t2, t3, t4; CREATE TABLE t1(a INT, KEY(a)); INSERT INTO t1 VALUES(0),(1),(2),(3),(4); ANALYZE TABLE t1; Table Op Msg_type Msg_text test.t1 analyze status OK CREATE TABLE m1(a INT, KEY(a)) ENGINE=MERGE UNION=(t1); SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; CARDINALITY 5 SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; CARDINALITY 5 SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; CARDINALITY 5 SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='m1'; CARDINALITY 5 DROP TABLE t1, m1; # # Bug #40675 MySQL 5.1 crash with index merge algorithm and Merge tables # # create MYISAM table t1 and insert values into it CREATE TABLE t1(a INT); INSERT INTO t1 VALUES(1); # create MYISAM table t2 and insert values into it CREATE TABLE t2(a INT, b INT, dummy CHAR(16) DEFAULT '', KEY(a), KEY(b)); INSERT INTO t2(a,b) 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,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0), (1,2); # Create the merge table t3 CREATE TABLE t3(a INT, b INT, dummy CHAR(16) DEFAULT '', KEY(a), KEY(b)) ENGINE=MERGE UNION=(t2) INSERT_METHOD=FIRST; # Lock tables t1 and t3 for write LOCK TABLES t1 WRITE, t3 WRITE; # Insert values into the merge table t3 INSERT INTO t3(a,b) VALUES(1,2); # select from the join of t2 and t3 (The merge table) SELECT t3.a FROM t1,t3 WHERE t3.b=2 AND t3.a=1; a 1 1 # Unlock the tables UNLOCK TABLES; # drop the created tables DROP TABLE t1, t2, t3; # insert duplicate value in child table while merge table doesn't have key create table t1 ( col1 int(10), primary key (col1) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE m1 ( col1 int(10) NOT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(t1); insert into m1 (col1) values (1); insert into m1 (col1) values (1); ERROR 23000: Duplicate entry '' for key '*UNKNOWN*' drop table m1, t1; # # Bug#45800 crash when replacing into a merge table and there is a duplicate # # Replace duplicate value in child table when merge table doesn't have key CREATE TABLE t1 (c1 INT PRIMARY KEY) ENGINE=MyISAM; CREATE TABLE m1 (c1 INT NOT NULL) ENGINE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1); INSERT INTO m1 VALUES (666); SELECT * FROM m1; c1 666 # insert the duplicate value into the merge table REPLACE INTO m1 VALUES (666); SELECT * FROM m1; c1 666 DROP TABLE m1, t1; # Insert... on duplicate key update (with duplicate values in the table) CREATE TABLE t1 (c1 INT PRIMARY KEY) ENGINE=MyISAM; CREATE TABLE m1 (c1 INT NOT NULL) ENGINE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1); INSERT INTO m1 VALUES (666); SELECT * FROM m1; c1 666 # insert the duplicate value into the merge table INSERT INTO m1 VALUES (666) ON DUPLICATE KEY UPDATE c1=c1+1; SELECT * FROM m1; c1 667 DROP TABLE m1, t1; # Insert duplicate value on MERGE table, where, MERGE has a key but MyISAM has more keys CREATE TABLE t1 (c1 INT, c2 INT, UNIQUE (c1), UNIQUE (c2)); CREATE TABLE m1 (c1 INT, c2 INT, UNIQUE (c1)) ENGINE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1); INSERT INTO m1 VALUES (1,2); # insert the duplicate value into the merge table INSERT INTO m1 VALUES (3,2); ERROR 23000: Duplicate entry '' for key '*UNKNOWN*' DROP TABLE m1,t1; # Try to define MERGE and MyISAM with keys on different columns CREATE TABLE t1 (c1 INT, c2 INT, UNIQUE (c1)); CREATE TABLE m1 (c1 INT, c2 INT, UNIQUE (c2)) ENGINE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1); # Try accessing the merge table for inserts (error occurs) INSERT INTO m1 VALUES (1,2); ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist INSERT INTO m1 VALUES (1,4); ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP TABLE m1,t1; CREATE TABLE t1 ( col1 INT(10) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE VIEW v1 as SELECT * FROM t1; CREATE TABLE m1 ( col1 INT(10) )ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(v1); #Select should detect that the child table is a view and fail. SELECT * FROM m1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist DROP VIEW v1; DROP TABLE m1, t1; # # Bug #45796: invalid memory reads and writes when altering merge and # base tables # CREATE TABLE t1(c1 INT) ENGINE=MyISAM; CREATE TABLE m1(c1 INT) ENGINE=MERGE UNION=(t1); ALTER TABLE m1 ADD INDEX idx_c1(c1); SELECT * FROM m1; ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist ALTER TABLE t1 ADD INDEX idx_c1(c1); SELECT * FROM m1; c1 DROP TABLE m1; DROP TABLE t1; # # Bug45781 infinite hang/crash in "opening tables" after handler tries to # open merge table # DROP TABLE IF EXISTS m1,t1; CREATE TABLE t1(a int)engine=myisam; CREATE TABLE t2(a int)engine=myisam; CREATE TABLE t3(a int)engine=myisam; CREATE TABLE t4(a int)engine=myisam; CREATE TABLE t5(a int)engine=myisam; CREATE TABLE t6(a int)engine=myisam; CREATE TABLE t7(a int)engine=myisam; CREATE TABLE m1(a int)engine=merge union=(t1,t2,t3,t4,t5,t6,t7); SELECT 1 FROM m1; 1 HANDLER m1 OPEN; ERROR HY000: Table storage engine for 'm1' doesn't have this option DROP TABLE m1,t1,t2,t3,t4,t5,t6,t7; SELECT 1 FROM m1; ERROR 42S02: Table 'test.m1' doesn't exist # # Bug #46614: Assertion in show_create_trigger() # CREATE TABLE t1(a int); CREATE TABLE t2(a int); CREATE TABLE t3(a int) ENGINE = MERGE UNION(t1, t2); CREATE TRIGGER tr1 AFTER INSERT ON t3 FOR EACH ROW CALL foo(); SHOW CREATE TRIGGER tr1; Trigger sql_mode SQL Original Statement character_set_client collation_connection Database Collation tr1 CREATE DEFINER=`root`@`localhost` TRIGGER tr1 AFTER INSERT ON t3 FOR EACH ROW CALL foo() latin1 latin1_swedish_ci latin1_swedish_ci DROP TRIGGER tr1; DROP TABLE t1, t2, t3; End of 5.1 tests # # An additional test case for Bug#27430 Crash in subquery code # when in PS and table DDL changed after PREPARE # # Test merge table with too many merge children. # drop table if exists t_parent; set @save_table_definition_cache=@@global.table_definition_cache; # # Set @@global.table_definition_cache to minimum # set @@global.table_definition_cache=400; set @a=null; # # Create 400 merge children # set @a=concat("create table t_parent (a int) union(", @a, ") insert_method=first engine=mrg_myisam"); prepare stmt from @a; execute stmt; prepare stmt from "select * from t_parent"; execute stmt; ERROR HY000: Prepared statement needs to be re-prepared execute stmt; ERROR HY000: Prepared statement needs to be re-prepared execute stmt; ERROR HY000: Prepared statement needs to be re-prepared deallocate prepare stmt; # # Create merge parent # # # Cleanup # drop table t_parent; set @@global.table_definition_cache=@save_table_definition_cache;