mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	Backport of: ------------------------------------------------------------ revno: 2630.4.1 committer: Dmitry Lenev <dlenev@mysql.com> branch nick: mysql-6.0-3726-w timestamp: Fri 2008-05-23 17:54:03 +0400 message: WL#3726 "DDL locking for all metadata objects". After review fixes in progress. ------------------------------------------------------------ This is the first patch in series. It transforms the metadata locking subsystem to use a dedicated module (mdl.h,cc). No significant changes in the locking protocol. The import passes the test suite with the exception of deprecated/removed 6.0 features, and MERGE tables. The latter are subject to a fix by WL#4144. Unfortunately, the original changeset comments got lost in a merge, thus this import has its own (largely insufficient) comments. This patch fixes Bug#25144 "replication / binlog with view breaks". Warning: this patch introduces an incompatible change: Under LOCK TABLES, it's no longer possible to FLUSH a table that was not locked for WRITE. Under LOCK TABLES, it's no longer possible to DROP a table or VIEW that was not locked for WRITE. ****** Backport of: ------------------------------------------------------------ revno: 2630.4.2 committer: Dmitry Lenev <dlenev@mysql.com> branch nick: mysql-6.0-3726-w timestamp: Sat 2008-05-24 14:03:45 +0400 message: WL#3726 "DDL locking for all metadata objects". After review fixes in progress. ****** Backport of: ------------------------------------------------------------ revno: 2630.4.3 committer: Dmitry Lenev <dlenev@mysql.com> branch nick: mysql-6.0-3726-w timestamp: Sat 2008-05-24 14:08:51 +0400 message: WL#3726 "DDL locking for all metadata objects" Fixed failing Windows builds by adding mdl.cc to the lists of files needed to build server/libmysqld on Windows. ****** Backport of: ------------------------------------------------------------ revno: 2630.4.4 committer: Dmitry Lenev <dlenev@mysql.com> branch nick: mysql-6.0-3726-w timestamp: Sat 2008-05-24 21:57:58 +0400 message: WL#3726 "DDL locking for all metadata objects". Fix for assert failures in kill.test which occured when one tried to kill ALTER TABLE statement on merge table while it was waiting in wait_while_table_is_used() for other connections to close this table. These assert failures stemmed from the fact that cleanup code in this case assumed that temporary table representing new version of table was open with adding to THD::temporary_tables list while code which were opening this temporary table wasn't always fulfilling this. This patch changes code that opens new version of table to always do this linking in. It also streamlines cleanup process for cases when error occurs while we have new version of table open. ****** WL#3726 "DDL locking for all metadata objects" Add libmysqld/mdl.cc to .bzrignore. ****** Backport of: ------------------------------------------------------------ revno: 2630.4.6 committer: Dmitry Lenev <dlenev@mysql.com> branch nick: mysql-6.0-3726-w timestamp: Sun 2008-05-25 00:33:22 +0400 message: WL#3726 "DDL locking for all metadata objects". Addition to the fix of assert failures in kill.test caused by changes for this worklog. Make sure we close the new table only once.
		
			
				
	
	
		
			751 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			751 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
# include/handler.inc
 | 
						|
#
 | 
						|
# The variables
 | 
						|
#     $engine_type       -- storage engine to be tested
 | 
						|
#     $other_engine_type -- storage engine <> $engine_type
 | 
						|
#     $other_handler_engine_type -- storage engine <> $engine_type, if possible
 | 
						|
#                           1. $other_handler_engine_type must support handler
 | 
						|
#                           2. $other_handler_engine_type must point to an all
 | 
						|
#                              time available storage engine
 | 
						|
#                              2006-08 MySQL 5.1 MyISAM and MEMORY only
 | 
						|
# have to be set before sourcing this script.
 | 
						|
-- source include/not_embedded.inc
 | 
						|
#
 | 
						|
# test of HANDLER ...
 | 
						|
#
 | 
						|
# Last update:
 | 
						|
# 2006-07-31 ML test refactored (MySQL 5.1)
 | 
						|
#               code of t/handler.test and t/innodb_handler.test united
 | 
						|
#               main testing code put into include/handler.inc
 | 
						|
#
 | 
						|
 | 
						|
eval SET SESSION STORAGE_ENGINE = $engine_type;
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1,t3,t4,t5;
 | 
						|
--enable_warnings
 | 
						|
 | 
						|
create table t1 (a int, b char(10), key a(a), key b(a,b));
 | 
						|
insert into t1 values
 | 
						|
(17,"ddd"),(18,"eee"),(19,"fff"),(19,"yyy"),
 | 
						|
(14,"aaa"),(15,"bbb"),(16,"ccc"),(16,"xxx"),
 | 
						|
(20,"ggg"),(21,"hhh"),(22,"iii");
 | 
						|
handler t1 open as t2;
 | 
						|
-- error 1064
 | 
						|
handler t2 read a=(SELECT 1);
 | 
						|
handler t2 read a first;
 | 
						|
handler t2 read a next;
 | 
						|
handler t2 read a next;
 | 
						|
handler t2 read a prev;
 | 
						|
handler t2 read a last;
 | 
						|
handler t2 read a prev;
 | 
						|
handler t2 read a prev;
 | 
						|
 | 
						|
handler t2 read a first;
 | 
						|
handler t2 read a prev;
 | 
						|
 | 
						|
handler t2 read a last;
 | 
						|
handler t2 read a prev;
 | 
						|
handler t2 read a next;
 | 
						|
handler t2 read a next;
 | 
						|
 | 
						|
handler t2 read a=(15);
 | 
						|
handler t2 read a=(16);
 | 
						|
 | 
						|
--error 1070
 | 
						|
handler t2 read a=(19,"fff");
 | 
						|
 | 
						|
handler t2 read b=(19,"fff");
 | 
						|
handler t2 read b=(19,"yyy");
 | 
						|
handler t2 read b=(19);
 | 
						|
 | 
						|
--error 1109
 | 
						|
handler t1 read a last;
 | 
						|
 | 
						|
handler t2 read a=(11);
 | 
						|
handler t2 read a>=(11);
 | 
						|
 | 
						|
handler t2 read a=(18);
 | 
						|
handler t2 read a>=(18);
 | 
						|
handler t2 read a>(18);
 | 
						|
handler t2 read a<=(18);
 | 
						|
handler t2 read a<(18);
 | 
						|
 | 
						|
handler t2 read a first limit 5;
 | 
						|
handler t2 read a next  limit 3;
 | 
						|
handler t2 read a prev  limit 10;
 | 
						|
 | 
						|
handler t2 read a>=(16) limit 4;
 | 
						|
handler t2 read a>=(16) limit 2,2;
 | 
						|
handler t2 read a last  limit 3;
 | 
						|
 | 
						|
handler t2 read a=(19);
 | 
						|
handler t2 read a=(19) where b="yyy";
 | 
						|
 | 
						|
handler t2 read first;
 | 
						|
handler t2 read next;
 | 
						|
handler t2 read next;
 | 
						|
--error 1064
 | 
						|
handler t2 read last;
 | 
						|
handler t2 close;
 | 
						|
 | 
						|
handler t1 open;
 | 
						|
handler t1 read a next; # this used to crash as a bug#5373
 | 
						|
handler t1 read a next;
 | 
						|
handler t1 close;
 | 
						|
 | 
						|
handler t1 open;
 | 
						|
handler t1 read a prev; # this used to crash as a bug#5373
 | 
						|
handler t1 read a prev;
 | 
						|
handler t1 close;
 | 
						|
 | 
						|
handler t1 open as t2;
 | 
						|
handler t2 read first;
 | 
						|
eval alter table t1 engine = $engine_type;
 | 
						|
--error 1109
 | 
						|
handler t2 read first;
 | 
						|
 | 
						|
#
 | 
						|
# DROP TABLE / ALTER TABLE
 | 
						|
#
 | 
						|
handler t1 open as t2;
 | 
						|
drop table t1;
 | 
						|
create table t1 (a int);
 | 
						|
insert into t1 values (17);
 | 
						|
--error 1109
 | 
						|
handler t2 read first;
 | 
						|
handler t1 open as t2;
 | 
						|
eval alter table t1 engine=$other_engine_type;
 | 
						|
--error 1109
 | 
						|
handler t2 read first;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
#
 | 
						|
# Test case for the bug #787
 | 
						|
#
 | 
						|
create table t1 (a int);
 | 
						|
insert into t1 values (1),(2),(3),(4),(5),(6);
 | 
						|
delete from t1 limit 2;
 | 
						|
handler t1 open;
 | 
						|
handler t1 read first;
 | 
						|
handler t1 read first limit 1,1;
 | 
						|
handler t1 read first limit 2,2;
 | 
						|
delete from t1 limit 3;
 | 
						|
handler t1 read first;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
#
 | 
						|
# Test for #751
 | 
						|
#
 | 
						|
create table t1(a int, index(a));
 | 
						|
insert into t1 values (1), (2), (3);
 | 
						|
handler t1 open;
 | 
						|
--error 1054
 | 
						|
handler t1 read a=(W);
 | 
						|
--error 1210
 | 
						|
handler t1 read a=(a);
 | 
						|
drop table t1;
 | 
						|
#
 | 
						|
# BUG#2304
 | 
						|
#
 | 
						|
create table t1 (a char(5));
 | 
						|
insert into t1 values ("Ok");
 | 
						|
handler t1 open as t;
 | 
						|
handler t read first;
 | 
						|
use mysql;
 | 
						|
handler t read first;
 | 
						|
handler t close;
 | 
						|
handler test.t1 open as t;
 | 
						|
handler t read first;
 | 
						|
handler t close;
 | 
						|
use test;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
#
 | 
						|
# BUG#3649
 | 
						|
#
 | 
						|
create table t1 ( a int, b int, INDEX a (a) );
 | 
						|
insert into t1 values (1,2), (2,1);
 | 
						|
handler t1 open;
 | 
						|
handler t1 read a=(1) where b=2;
 | 
						|
handler t1 read a=(1) where b=3;
 | 
						|
handler t1 read a=(1) where b=1;
 | 
						|
handler t1 close;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
#
 | 
						|
# Check if two database names beginning the same are seen as different.
 | 
						|
#
 | 
						|
# This database begins like the usual 'test' database.
 | 
						|
#
 | 
						|
--disable_warnings
 | 
						|
drop database if exists test_test;
 | 
						|
--enable_warnings
 | 
						|
create database test_test;
 | 
						|
use test_test;
 | 
						|
create table t1(table_id char(20) primary key);
 | 
						|
insert into t1 values ('test_test.t1');
 | 
						|
insert into t1 values ('');
 | 
						|
handler t1 open;
 | 
						|
handler t1 read first limit 9;
 | 
						|
create table t2(table_id char(20) primary key);
 | 
						|
insert into t2 values ('test_test.t2');
 | 
						|
insert into t2 values ('');
 | 
						|
handler t2 open;
 | 
						|
handler t2 read first limit 9;
 | 
						|
#
 | 
						|
# This is the usual 'test' database.
 | 
						|
#
 | 
						|
use test;
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1;
 | 
						|
--enable_warnings
 | 
						|
create table t1(table_id char(20) primary key);
 | 
						|
insert into t1 values ('test.t1');
 | 
						|
insert into t1 values ('');
 | 
						|
--error 1066
 | 
						|
handler t1 open;
 | 
						|
#
 | 
						|
# Check accesibility of all the tables.
 | 
						|
#
 | 
						|
use test;
 | 
						|
--error 1064
 | 
						|
handler test.t1 read first limit 9;
 | 
						|
--error 1064
 | 
						|
handler test_test.t1 read first limit 9;
 | 
						|
handler t1 read first limit 9;
 | 
						|
--error 1064
 | 
						|
handler test_test.t2 read first limit 9;
 | 
						|
handler t2 read first limit 9;
 | 
						|
 | 
						|
#
 | 
						|
# Cleanup.
 | 
						|
#
 | 
						|
 | 
						|
--error 1064
 | 
						|
handler test_test.t1 close;
 | 
						|
handler t1 close;
 | 
						|
drop table test_test.t1;
 | 
						|
--error 1064
 | 
						|
handler test_test.t2 close;
 | 
						|
handler t2 close;
 | 
						|
drop table test_test.t2;
 | 
						|
drop database test_test;
 | 
						|
 | 
						|
#
 | 
						|
use test;
 | 
						|
--error 1064
 | 
						|
handler test.t1 close;
 | 
						|
--error 1109
 | 
						|
handler t1 close;
 | 
						|
drop table test.t1;
 | 
						|
 | 
						|
#
 | 
						|
# BUG#4335
 | 
						|
#
 | 
						|
--disable_warnings
 | 
						|
drop database if exists test_test;
 | 
						|
drop table if exists t1;
 | 
						|
drop table if exists t2;
 | 
						|
drop table if exists t3;
 | 
						|
--enable_warnings
 | 
						|
create database test_test;
 | 
						|
use test_test;
 | 
						|
create table t1 (c1 char(20));
 | 
						|
insert into t1 values ('test_test.t1');
 | 
						|
create table t3 (c1 char(20));
 | 
						|
insert into t3 values ('test_test.t3');
 | 
						|
handler t1 open;
 | 
						|
handler t1 read first limit 9;
 | 
						|
handler t1 open h1;
 | 
						|
handler h1 read first limit 9;
 | 
						|
use test;
 | 
						|
create table t1 (c1 char(20));
 | 
						|
create table t2 (c1 char(20));
 | 
						|
create table t3 (c1 char(20));
 | 
						|
insert into t1 values ('t1');
 | 
						|
insert into t2 values ('t2');
 | 
						|
insert into t3 values ('t3');
 | 
						|
--error 1066
 | 
						|
handler t1 open;
 | 
						|
--error 1066
 | 
						|
handler t2 open t1;
 | 
						|
--error 1066
 | 
						|
handler t3 open t1;
 | 
						|
handler t1 read first limit 9;
 | 
						|
--error 1064
 | 
						|
handler test.t1 close;
 | 
						|
--error 1066
 | 
						|
handler test.t1 open h1;
 | 
						|
--error 1066
 | 
						|
handler test_test.t1 open h1;
 | 
						|
handler test_test.t3 open h3;
 | 
						|
handler test.t1 open h2;
 | 
						|
handler t1 read first limit 9;
 | 
						|
handler h1 read first limit 9;
 | 
						|
handler h2 read first limit 9;
 | 
						|
handler h3 read first limit 9;
 | 
						|
handler h2 read first limit 9;
 | 
						|
--error 1064
 | 
						|
handler test.h1 close;
 | 
						|
handler t1 close;
 | 
						|
handler h1 close;
 | 
						|
handler h2 close;
 | 
						|
--error 1109
 | 
						|
handler t1 read first limit 9;
 | 
						|
--error 1109
 | 
						|
handler h1 read first limit 9;
 | 
						|
--error 1109
 | 
						|
handler h2 read first limit 9;
 | 
						|
handler h3 read first limit 9;
 | 
						|
handler h3 read first limit 9;
 | 
						|
use test_test;
 | 
						|
handler h3 read first limit 9;
 | 
						|
--error 1064
 | 
						|
handler test.h3 read first limit 9;
 | 
						|
handler h3 close;
 | 
						|
use test;
 | 
						|
drop table t3;
 | 
						|
drop table t2;
 | 
						|
drop table t1;
 | 
						|
drop database test_test;
 | 
						|
 | 
						|
#
 | 
						|
# Test if fix for BUG#4286 correctly closes handler tables.
 | 
						|
#
 | 
						|
create table t1 (c1 char(20));
 | 
						|
insert into t1 values ("t1");
 | 
						|
handler t1 open as h1;
 | 
						|
handler h1 read first limit 9;
 | 
						|
create table t2 (c1 char(20));
 | 
						|
insert into t2 values ("t2");
 | 
						|
handler t2 open as h2;
 | 
						|
handler h2 read first limit 9;
 | 
						|
create table t3 (c1 char(20));
 | 
						|
insert into t3 values ("t3");
 | 
						|
handler t3 open as h3;
 | 
						|
handler h3 read first limit 9;
 | 
						|
create table t4 (c1 char(20));
 | 
						|
insert into t4 values ("t4");
 | 
						|
handler t4 open as h4;
 | 
						|
handler h4 read first limit 9;
 | 
						|
create table t5 (c1 char(20));
 | 
						|
insert into t5 values ("t5");
 | 
						|
handler t5 open as h5;
 | 
						|
handler h5 read first limit 9;
 | 
						|
# close first
 | 
						|
eval alter table t1 engine=$other_handler_engine_type;
 | 
						|
--error 1109
 | 
						|
handler h1 read first limit 9;
 | 
						|
handler h2 read first limit 9;
 | 
						|
handler h3 read first limit 9;
 | 
						|
handler h4 read first limit 9;
 | 
						|
handler h5 read first limit 9;
 | 
						|
# close last
 | 
						|
eval alter table t5 engine=$other_handler_engine_type;
 | 
						|
--error 1109
 | 
						|
handler h1 read first limit 9;
 | 
						|
handler h2 read first limit 9;
 | 
						|
handler h3 read first limit 9;
 | 
						|
handler h4 read first limit 9;
 | 
						|
--error 1109
 | 
						|
handler h5 read first limit 9;
 | 
						|
# close middle
 | 
						|
eval alter table t3 engine=$other_handler_engine_type;
 | 
						|
--error 1109
 | 
						|
handler h1 read first limit 9;
 | 
						|
handler h2 read first limit 9;
 | 
						|
--error 1109
 | 
						|
handler h3 read first limit 9;
 | 
						|
handler h4 read first limit 9;
 | 
						|
--error 1109
 | 
						|
handler h5 read first limit 9;
 | 
						|
handler h2 close;
 | 
						|
handler h4 close;
 | 
						|
# close all depending handler tables
 | 
						|
handler t1 open as h1_1;
 | 
						|
handler t1 open as h1_2;
 | 
						|
handler t1 open as h1_3;
 | 
						|
handler h1_1 read first limit 9;
 | 
						|
handler h1_2 read first limit 9;
 | 
						|
handler h1_3 read first limit 9;
 | 
						|
eval alter table t1 engine=$engine_type;
 | 
						|
--error 1109
 | 
						|
handler h1_1 read first limit 9;
 | 
						|
--error 1109
 | 
						|
handler h1_2 read first limit 9;
 | 
						|
--error 1109
 | 
						|
handler h1_3 read first limit 9;
 | 
						|
drop table t1;
 | 
						|
drop table t2;
 | 
						|
drop table t3;
 | 
						|
drop table t4;
 | 
						|
drop table t5;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#14397 - OPTIMIZE TABLE with an open HANDLER causes a crash
 | 
						|
#
 | 
						|
create table t1 (c1 int);
 | 
						|
insert into t1 values (1);
 | 
						|
# client 1
 | 
						|
handler t1 open;
 | 
						|
handler t1 read first;
 | 
						|
# client 2
 | 
						|
connect (con2,localhost,root,,);
 | 
						|
connection con2;
 | 
						|
--exec echo send the below to another connection, do not wait for the result
 | 
						|
send optimize table t1;
 | 
						|
--sleep 1
 | 
						|
# client 1
 | 
						|
--exec echo proceed with the normal connection
 | 
						|
connection default;
 | 
						|
handler t1 read next;
 | 
						|
handler t1 close;
 | 
						|
# client 2
 | 
						|
--exec echo read the result from the other connection
 | 
						|
connection con2;
 | 
						|
reap;
 | 
						|
# client 1
 | 
						|
--exec echo proceed with the normal connection
 | 
						|
connection default;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
CREATE TABLE t1 (  no1 smallint(5) NOT NULL default '0',  no2 int(10) NOT NULL default '0',  PRIMARY KEY  (no1,no2));
 | 
						|
INSERT INTO t1 VALUES (1,274),(1,275),(2,6),(2,8),(4,1),(4,2);
 | 
						|
HANDLER t1 OPEN;
 | 
						|
HANDLER t1 READ `primary` = (1, 1000);
 | 
						|
HANDLER t1 READ `primary` PREV;
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
# End of 4.1 tests
 | 
						|
 | 
						|
#
 | 
						|
# Addendum to Bug#14397 - OPTIMIZE TABLE with an open HANDLER causes a crash
 | 
						|
# Show that DROP TABLE can no longer deadlock against
 | 
						|
# FLUSH TABLES WITH READ LOCK. This is a 5.0 issue.
 | 
						|
#
 | 
						|
create table t1 (c1 int);
 | 
						|
insert into t1 values (14397);
 | 
						|
flush tables with read lock;
 | 
						|
# The thread with the global read lock cannot drop the table itself:
 | 
						|
--error 1223
 | 
						|
drop table t1;
 | 
						|
#
 | 
						|
# client 2
 | 
						|
# We need a second connection to try the drop.
 | 
						|
# The drop waits for the global read lock to go away.
 | 
						|
# Without the addendum fix it locked LOCK_open before entering the wait loop.
 | 
						|
connection con2;
 | 
						|
--exec echo send the below to another connection, do not wait for the result
 | 
						|
send drop table t1;
 | 
						|
--sleep 1
 | 
						|
#
 | 
						|
# client 1
 | 
						|
# Now we need something that wants LOCK_open. A simple table access which
 | 
						|
# opens the table does the trick.
 | 
						|
--exec echo proceed with the normal connection
 | 
						|
connection default;
 | 
						|
# This would hang on LOCK_open without the 5.0 addendum fix.
 | 
						|
select * from t1;
 | 
						|
# Release the read lock. This should make the DROP go through.
 | 
						|
unlock tables;
 | 
						|
#
 | 
						|
# client 2
 | 
						|
# Read the result of the drop command.
 | 
						|
connection con2;
 | 
						|
--exec echo read the result from the other connection
 | 
						|
reap;
 | 
						|
#
 | 
						|
# client 1
 | 
						|
# Now back to normal operation. The table should not exist any more.
 | 
						|
--exec echo proceed with the normal connection
 | 
						|
connection default;
 | 
						|
--error 1146
 | 
						|
select * from t1;
 | 
						|
# Just to be sure and not confuse the next test case writer.
 | 
						|
drop table if exists t1;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#25856 - HANDLER table OPEN in one connection lock DROP TABLE in another one
 | 
						|
#
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1;
 | 
						|
--enable_warnings
 | 
						|
eval create table t1 (a int) ENGINE=$other_engine_type;
 | 
						|
--echo --> client 2
 | 
						|
connection con2;
 | 
						|
--error 1031
 | 
						|
handler t1 open;
 | 
						|
--echo --> client 1
 | 
						|
connection default;
 | 
						|
drop table t1;
 | 
						|
disconnect con2;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#30632 HANDLER read failure causes hang
 | 
						|
#
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1;
 | 
						|
--enable_warnings
 | 
						|
create table t1 (a int);
 | 
						|
handler t1 open as t1_alias;
 | 
						|
--error 1176
 | 
						|
handler t1_alias read a next;
 | 
						|
--error 1054
 | 
						|
handler t1_alias READ a next where inexistent > 0;
 | 
						|
--error 1176
 | 
						|
handler t1_alias read a next;
 | 
						|
--error 1054
 | 
						|
handler t1_alias READ a next where inexistent > 0;
 | 
						|
handler t1_alias close;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#21587 FLUSH TABLES causes server crash when used with HANDLER statements
 | 
						|
#
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1,t2;
 | 
						|
--enable_warnings
 | 
						|
create table t1 (c1 int);
 | 
						|
create table t2 (c1 int);
 | 
						|
insert into t1 values (1);
 | 
						|
insert into t2 values (2);
 | 
						|
--echo connection: default
 | 
						|
handler t1 open;
 | 
						|
handler t1 read first;
 | 
						|
connect (flush,localhost,root,,);
 | 
						|
connection flush;
 | 
						|
--echo connection: flush
 | 
						|
--send flush tables;
 | 
						|
connect (waiter,localhost,root,,);
 | 
						|
connection waiter;
 | 
						|
--echo connection: waiter 
 | 
						|
let $wait_condition=
 | 
						|
  select count(*) = 1 from information_schema.processlist
 | 
						|
  where state = "Flushing tables";
 | 
						|
--source include/wait_condition.inc
 | 
						|
connection default;
 | 
						|
--echo connection: default
 | 
						|
handler t2 open;
 | 
						|
handler t2 read first;
 | 
						|
handler t1 read next;
 | 
						|
handler t1 close;
 | 
						|
handler t2 close;
 | 
						|
connection flush;
 | 
						|
reap;
 | 
						|
connection default;
 | 
						|
drop table t1,t2;
 | 
						|
disconnect flush;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#31409 RENAME TABLE causes server crash or deadlock when used with HANDLER statements
 | 
						|
#
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1,t2;
 | 
						|
--enable_warnings
 | 
						|
create table t1 (c1 int);
 | 
						|
--echo connection: default
 | 
						|
handler t1 open;
 | 
						|
handler t1 read first;
 | 
						|
connect (flush,localhost,root,,);
 | 
						|
connection flush;
 | 
						|
--echo connection: flush
 | 
						|
--send rename table t1 to t2;
 | 
						|
connection waiter;
 | 
						|
--echo connection: waiter 
 | 
						|
let $wait_condition=
 | 
						|
  select count(*) = 1 from information_schema.processlist
 | 
						|
  where state = "Waiting for table" and info = "rename table t1 to t2";
 | 
						|
--source include/wait_condition.inc
 | 
						|
connection default;
 | 
						|
--echo connection: default
 | 
						|
handler t2 open;
 | 
						|
handler t2 read first;
 | 
						|
--error ER_NO_SUCH_TABLE
 | 
						|
handler t1 read next;
 | 
						|
handler t1 close;
 | 
						|
handler t2 close;
 | 
						|
connection flush;
 | 
						|
reap;
 | 
						|
connection default;
 | 
						|
drop table t2;
 | 
						|
connection flush;
 | 
						|
disconnect flush;
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
connection waiter;
 | 
						|
disconnect waiter;
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
connection default;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#30882 Dropping a temporary table inside a stored function may cause a server crash
 | 
						|
#
 | 
						|
# Test HANDLER statements in conjunction with temporary tables. While the temporary table
 | 
						|
# is open by a HANDLER, no other statement can access it.
 | 
						|
#
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1;
 | 
						|
--enable_warnings
 | 
						|
create temporary table t1 (a int, b char(1), key a(a), key b(a,b));
 | 
						|
insert into t1 values (0,"a"),(1,"b"),(2,"c"),(3,"d"),(4,"e"),
 | 
						|
                      (5,"f"),(6,"g"),(7,"h"),(8,"i"),(9,"j");
 | 
						|
select a,b from t1;
 | 
						|
handler t1 open as a1;
 | 
						|
handler a1 read a first;
 | 
						|
handler a1 read a next;
 | 
						|
handler a1 read a next;
 | 
						|
--error ER_CANT_REOPEN_TABLE
 | 
						|
select a,b from t1;
 | 
						|
handler a1 read a prev;
 | 
						|
handler a1 read a prev;
 | 
						|
handler a1 read a=(6) where b="g";
 | 
						|
handler a1 close;
 | 
						|
select a,b from t1;
 | 
						|
handler t1 open as a2;
 | 
						|
handler a2 read a first;
 | 
						|
handler a2 read a last;
 | 
						|
handler a2 read a prev;
 | 
						|
handler a2 close;
 | 
						|
drop table t1;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#31397 Inconsistent drop table behavior of handler tables.
 | 
						|
#
 | 
						|
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1,t2;
 | 
						|
--enable_warnings
 | 
						|
create table t1 (a int);
 | 
						|
handler t1 open as t1_alias;
 | 
						|
drop table t1;
 | 
						|
create table t1 (a int);
 | 
						|
handler t1 open as t1_alias;
 | 
						|
flush tables;
 | 
						|
drop table t1;
 | 
						|
create table t1 (a int);
 | 
						|
handler t1 open as t1_alias;
 | 
						|
handler t1_alias close;
 | 
						|
drop table t1;
 | 
						|
create table t1 (a int);
 | 
						|
handler t1 open as t1_alias;
 | 
						|
handler t1_alias read first;
 | 
						|
drop table t1;
 | 
						|
--error ER_UNKNOWN_TABLE
 | 
						|
handler t1_alias read next;
 | 
						|
 | 
						|
# Test that temporary tables associated with handlers are properly dropped.
 | 
						|
 | 
						|
create table t1 (a int);
 | 
						|
create temporary table t2 (a int, key(a));
 | 
						|
handler t1 open as a1;
 | 
						|
handler t2 open as a2;
 | 
						|
handler a2 read a first;
 | 
						|
drop table t1, t2;
 | 
						|
--error ER_UNKNOWN_TABLE
 | 
						|
handler a2 read a next;
 | 
						|
--error ER_UNKNOWN_TABLE
 | 
						|
handler a1 close;
 | 
						|
 | 
						|
# Alter table drop handlers
 | 
						|
 | 
						|
create table t1 (a int, key(a));
 | 
						|
create table t2 like t1;
 | 
						|
handler t1 open as a1;
 | 
						|
handler t2 open as a2;
 | 
						|
handler a1 read a first;
 | 
						|
handler a2 read a first;
 | 
						|
alter table t1 add b int;
 | 
						|
--error ER_UNKNOWN_TABLE
 | 
						|
handler a1 close;
 | 
						|
handler a2 close;
 | 
						|
drop table t1, t2;
 | 
						|
 | 
						|
# Rename table drop handlers
 | 
						|
 | 
						|
create table t1 (a int, key(a));
 | 
						|
handler t1 open as a1;
 | 
						|
handler a1 read a first;
 | 
						|
rename table t1 to t2;
 | 
						|
--error ER_UNKNOWN_TABLE
 | 
						|
handler a1 read a first;
 | 
						|
drop table t2;
 | 
						|
 | 
						|
# Optimize table drop handlers
 | 
						|
 | 
						|
create table t1 (a int, key(a));
 | 
						|
create table t2 like t1;
 | 
						|
handler t1 open as a1;
 | 
						|
handler t2 open as a2;
 | 
						|
handler a1 read a first;
 | 
						|
handler a2 read a first;
 | 
						|
optimize table t1;
 | 
						|
--error ER_UNKNOWN_TABLE
 | 
						|
handler a1 close;
 | 
						|
handler a2 close;
 | 
						|
drop table t1, t2;
 | 
						|
 | 
						|
# Flush tables causes handlers reopen
 | 
						|
 | 
						|
create table t1 (a int, b char(1), key a(a), key b(a,b));
 | 
						|
insert into t1 values (0,"a"),(1,"b"),(2,"c"),(3,"d"),(4,"e"),
 | 
						|
                      (5,"f"),(6,"g"),(7,"h"),(8,"i"),(9,"j");
 | 
						|
handler t1 open;
 | 
						|
handler t1 read a first;
 | 
						|
handler t1 read a next;
 | 
						|
flush tables;
 | 
						|
handler t1 read a next;
 | 
						|
handler t1 read a next;
 | 
						|
flush tables with read lock;
 | 
						|
handler t1 read a next;
 | 
						|
unlock tables;
 | 
						|
drop table t1;
 | 
						|
--error ER_UNKNOWN_TABLE
 | 
						|
handler t1 read a next;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#41110: crash with handler command when used concurrently with alter table
 | 
						|
# Bug#41112: crash in mysql_ha_close_table/get_lock_data with alter table
 | 
						|
#
 | 
						|
 | 
						|
connect(con1,localhost,root,,);
 | 
						|
connect(con2,localhost,root,,);
 | 
						|
 | 
						|
connection default;
 | 
						|
--disable_warnings
 | 
						|
drop table if exists t1;
 | 
						|
--enable_warnings
 | 
						|
create table t1 (a int);
 | 
						|
insert into t1 values (1);
 | 
						|
handler t1 open;
 | 
						|
connection con1;
 | 
						|
send alter table t1 engine=memory;
 | 
						|
connection con2;
 | 
						|
let $wait_condition=
 | 
						|
  select count(*) = 1 from information_schema.processlist
 | 
						|
  where state = "Waiting for table" and info = "alter table t1 engine=memory";
 | 
						|
--source include/wait_condition.inc
 | 
						|
connection default;
 | 
						|
--error ER_ILLEGAL_HA
 | 
						|
handler t1 read a next;
 | 
						|
handler t1 close;
 | 
						|
connection con1;
 | 
						|
--reap
 | 
						|
drop table t1;
 | 
						|
disconnect con1;
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
connection con2;
 | 
						|
disconnect con2;
 | 
						|
--source include/wait_until_disconnected.inc
 | 
						|
connection default;
 | 
						|
 | 
						|
#
 | 
						|
# Bug#44151 using handler commands on information_schema tables crashes server
 | 
						|
#
 | 
						|
USE information_schema;
 | 
						|
--error ER_WRONG_USAGE
 | 
						|
HANDLER COLUMNS OPEN;
 | 
						|
USE test;
 |