mirror of
https://github.com/MariaDB/server.git
synced 2025-08-23 02:42:01 +02:00

Remove one of the major sources of race condiitons in mariadb-test. Normally, mariadb_close() sends COM_QUIT to the server and immediately disconnects. In mariadb-test it means the test can switch to another connection and sends queries to the server before the server even started parsing the COM_QUIT packet and these queries can see the connection as fully active, as it didn't reach dispatch_command yet. This is a major source of instability in tests and many - but not all, still less than a half - tests employ workarounds. The correct one is a pair count_sessions.inc/wait_until_count_sessions.inc. Also very popular was wait_until_disconnected.inc, which was completely useless, because it verifies that the connection is closed, and after disconnect it always is, it didn't verify whether the server processed COM_QUIT. Sadly the placebo was as widely used as the real thing. Let's fix this by making mariadb-test `disconnect` command _to wait_ for the server to confirm. This makes almost all workarounds redundant. In some cases count_sessions.inc/wait_until_count_sessions.inc is still needed, though, as only `disconnect` command is changed: * after external tools, like `exec $MYSQL` * after failed `connect` command * replication, after `STOP SLAVE` * Federated/CONNECT/SPIDER/etc after `DROP TABLE` and also in some XA tests, because an XA transaction is dissociated from the THD very late, after the server has closed the client connection. Collateral cleanups: fix comments, remove some redundant statements: * DROP IF EXISTS if nothing is known to exist * DROP table/view before DROP DATABASE * REVOKE privileges before DROP USER etc
175 lines
4.5 KiB
Text
175 lines
4.5 KiB
Text
create table t0 SELECT 1,"table 1";
|
|
create table t2 SELECT 2,"table 2";
|
|
create table t3 SELECT 3,"table 3";
|
|
rename table t0 to t1;
|
|
rename table t3 to t4, t2 to t3, t1 to t2, t4 to t1;
|
|
select * from t1;
|
|
3 table 3
|
|
3 table 3
|
|
rename table t3 to t4, t2 to t3, t1 to t2, t4 to t1;
|
|
rename table t3 to t4, t2 to t3, t1 to t2, t4 to t1;
|
|
select * from t1;
|
|
1 table 1
|
|
1 table 1
|
|
rename table t1 to t2;
|
|
ERROR 42S01: Table 't2' already exists
|
|
rename table t1 to t1;
|
|
ERROR 42S01: Table 't1' already exists
|
|
rename table t3 to t4, t2 to t3, t1 to t2, t4 to t2;
|
|
ERROR 42S01: Table 't2' already exists
|
|
show tables like "t_";
|
|
Tables_in_test (t_)
|
|
t1
|
|
t2
|
|
t3
|
|
rename table t3 to t1, t2 to t3, t1 to t2, t4 to t1;
|
|
ERROR 42S01: Table 't1' already exists
|
|
rename table t3 to t4, t5 to t3, t1 to t2, t4 to t1;
|
|
ERROR 42S02: Table 'test.t5' doesn't exist
|
|
select * from t1;
|
|
1 table 1
|
|
1 table 1
|
|
select * from t2;
|
|
2 table 2
|
|
2 table 2
|
|
select * from t3;
|
|
3 table 3
|
|
3 table 3
|
|
drop table if exists t1,t2,t3,t4;
|
|
Warnings:
|
|
Note 1051 Unknown table 'test.t4'
|
|
connect con1,localhost,root,,;
|
|
connect con2,localhost,root,,;
|
|
connection con1;
|
|
CREATE TABLE t1 (a int);
|
|
CREATE TABLE t3 (a int);
|
|
connection con2;
|
|
FLUSH TABLES WITH READ LOCK;
|
|
connection con1;
|
|
RENAME TABLE t1 TO t2, t3 to t4;
|
|
connection con2;
|
|
show tables;
|
|
Tables_in_test
|
|
t1
|
|
t3
|
|
UNLOCK TABLES;
|
|
connection con1;
|
|
connection con2;
|
|
show tables;
|
|
Tables_in_test
|
|
t2
|
|
t4
|
|
drop table t2, t4;
|
|
disconnect con2;
|
|
disconnect con1;
|
|
connection default;
|
|
End of 4.1 tests
|
|
#
|
|
# Bug#14959: "ALTER TABLE isn't able to rename a view"
|
|
# Bug#53976: "ALTER TABLE RENAME is allowed on views
|
|
# (not documented, broken)"
|
|
#
|
|
create table t1(f1 int);
|
|
create view v1 as select * from t1;
|
|
alter table v1 rename to v2;
|
|
ERROR HY000: 'test.v1' is not of type 'BASE TABLE'
|
|
drop view v1;
|
|
drop table t1;
|
|
# End of 5.0 tests
|
|
CREATE OR REPLACE TABLE t1 (a INT);
|
|
CREATE OR REPLACE TABLE t2 (a INT);
|
|
CREATE OR REPLACE TEMPORARY TABLE t1_tmp (b INT);
|
|
CREATE OR REPLACE TEMPORARY TABLE t2_tmp (b INT);
|
|
rename table t1 to t2;
|
|
ERROR 42S01: Table 't2' already exists
|
|
rename table t1 to tmp, tmp to t2;
|
|
ERROR 42S01: Table 't2' already exists
|
|
rename table t1_tmp to t2_tmp;
|
|
ERROR 42S01: Table 't2_tmp' already exists
|
|
rename table t1_tmp to tmp, tmp to t2_tmp;
|
|
ERROR 42S01: Table 't2_tmp' already exists
|
|
show create table t1_tmp;
|
|
Table Create Table
|
|
t1_tmp CREATE TEMPORARY TABLE `t1_tmp` (
|
|
`b` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
|
show create table t2_tmp;
|
|
Table Create Table
|
|
t2_tmp CREATE TEMPORARY TABLE `t2_tmp` (
|
|
`b` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
|
rename table t1 to t1_tmp;
|
|
rename table t2_tmp to t2;
|
|
rename table t2 to tmp, tmp to t2;
|
|
rename table t1_tmp to tmp, tmp to t1_tmp;
|
|
show tables;
|
|
Tables_in_test
|
|
t2
|
|
t1_tmp
|
|
t1_tmp
|
|
t2
|
|
SHOW CREATE TABLE t1_tmp;
|
|
Table Create Table
|
|
t1_tmp CREATE TEMPORARY TABLE `t1_tmp` (
|
|
`b` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
|
drop table t1_tmp;
|
|
SHOW CREATE TABLE t1_tmp;
|
|
Table Create Table
|
|
t1_tmp CREATE TABLE `t1_tmp` (
|
|
`a` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
|
drop table t1_tmp;
|
|
SHOW CREATE TABLE t2;
|
|
Table Create Table
|
|
t2 CREATE TEMPORARY TABLE `t2` (
|
|
`b` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
|
drop table t2;
|
|
SHOW CREATE TABLE t2;
|
|
Table Create Table
|
|
t2 CREATE TABLE `t2` (
|
|
`a` int(11) DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
|
drop table t2;
|
|
CREATE TABLE t1 (a INT);
|
|
insert into t1 values (1);
|
|
CREATE TEMPORARY TABLE t1 (b INT);
|
|
insert into t1 values (2);
|
|
RENAME TABLE t1 TO tmp, t1 TO t2;
|
|
select * from tmp;
|
|
b
|
|
2
|
|
select * from t2;
|
|
a
|
|
1
|
|
drop table tmp,t2;
|
|
create table t1 (a int) engine=memory;
|
|
rename table t1 to non_existent.t2;
|
|
ERROR 42000: Unknown database 'non_existent'
|
|
drop table t1;
|
|
#
|
|
# Test rename IF EXISTS
|
|
#
|
|
rename table if exists t1 to t2;
|
|
Warnings:
|
|
Note 1146 Table 'test.t1' doesn't exist
|
|
alter table if exists t1 rename to t2;
|
|
Warnings:
|
|
Error 1146 Table 'test.t1' doesn't exist
|
|
create table t2 (a int);
|
|
alter table if exists t1 rename to t2;
|
|
Warnings:
|
|
Error 1146 Table 'test.t1' doesn't exist
|
|
rename table if exists t1 to t2;
|
|
Warnings:
|
|
Note 1146 Table 'test.t1' doesn't exist
|
|
create table t1 (a int);
|
|
rename table if exists t1 to t2;
|
|
ERROR 42S01: Table 't2' already exists
|
|
alter table if exists t1 rename to t2;
|
|
ERROR 42S01: Table 't2' already exists
|
|
drop table t2;
|
|
rename table if exists t1 to t2;
|
|
alter table if exists t2 rename to t1;
|
|
drop table t1;
|