用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

819 lines
19 KiB

#
# WL#1756
#
# Save the initial number of concurrent sessions
--source include/count_sessions.inc
--disable_warnings
drop table if exists t1, t2;
--enable_warnings
create table t1 (a int) engine=innodb;
xa start 'test1';
insert t1 values (10);
xa end 'test1';
xa prepare 'test1';
xa rollback 'test1';
select * from t1;
xa start 'test2';
--error ER_XAER_RMFAIL
xa start 'test-bad';
insert t1 values (20);
--error ER_XAER_RMFAIL
xa prepare 'test2';
xa end 'test2';
xa prepare 'test2';
xa commit 'test2';
select * from t1;
xa start 'testa','testb';
insert t1 values (30);
--error ER_XAER_RMFAIL
commit;
xa end 'testa','testb';
--error ER_XAER_RMFAIL
begin;
--error ER_XAER_RMFAIL
create table t2 (a int);
connect (con1,localhost,root,,);
connection con1;
--error ER_XAER_DUPID
xa start 'testa','testb';
--error ER_XAER_DUPID
xa start 'testa','testb', 123;
# gtrid [ , bqual [ , formatID ] ]
xa start 0x7465737462, 0x2030405060, 0xb;
insert t1 values (40);
xa end 'testb',' 0@P`',11;
xa prepare 'testb',0x2030405060,11;
--error ER_XAER_RMFAIL
start transaction;
--sorted_result
xa recover;
# uncomment the line below when binlog will be able to prepare
#disconnect con1;
connection default;
xa prepare 'testa','testb';
--sorted_result
xa recover;
# When this connection has already started an own XA transaction
# it cannot execute XA COMMIT for another XA.
--error ER_XAER_RMFAIL
xa commit 'testb',0x2030405060,11;
# nor XA ROLLBACK on "foreign" XA.
--error ER_XAER_RMFAIL
xa rollback 'testb',0x2030405060,11;
xa rollback 'testa','testb';
# "Foreign" XA is not in an allowed state to be committed
--error ER_XAER_NOTA
xa commit 'testb',0x2030405060,11;
# nor be rolled back
--error ER_XAER_NOTA
xa rollback 'testb',0x2030405060,11;
--error ER_PARSE_ERROR
xa start 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
select * from t1;
--connection con1
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
xa recover;
xa rollback 'testb',0x2030405060,11;
drop table t1;
#
# Bug#28323: Server crashed in xid cache operations
#
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1(a int, b int, c varchar(20), primary key(a)) engine = innodb;
insert into t1 values(1, 1, 'a');
insert into t1 values(2, 2, 'b');
connect (con1,localhost,root,,);
connect (con2,localhost,root,,);
--connection con1
xa start 'a','b';
update t1 set c = 'aa' where a = 1;
--connection con2
xa start 'a','c';
update t1 set c = 'bb' where a = 2;
--connection con1
--send update t1 set c = 'bb' where a = 2
--connection con2
--sleep 1
--error ER_LOCK_DEADLOCK
update t1 set c = 'aa' where a = 1;
select count(*) from t1;
--error ER_XA_RBDEADLOCK
xa end 'a','c';
xa rollback 'a','c';
--disconnect con2
connect (con3,localhost,root,,);
--connection con3
xa start 'a','c';
--connection con1
--reap
--disconnect con1
--disconnect con3
--connection default
drop table t1;
--echo #
--echo # BUG#51342 - more xid crashing
--echo #
CREATE TABLE t1(a INT) ENGINE=InnoDB;
XA START 'x';
SET SESSION autocommit=0;
INSERT INTO t1 VALUES(1);
--error ER_XAER_RMFAIL
SET SESSION autocommit=1;
SELECT @@autocommit;
INSERT INTO t1 VALUES(1);
XA END 'x';
XA COMMIT 'x' ONE PHASE;
DROP TABLE t1;
SET SESSION autocommit=1;
--echo End of 5.0 tests
#
# Bug#44672: Assertion failed: thd->transaction.xid_state.xid.is_null()
#
xa start 'a';
xa end 'a';
xa rollback 'a';
xa start 'a';
xa end 'a';
xa rollback 'a';
#
# Bug#45548: XA transaction without access to InnoDB tables crashes the server
#
xa start 'a';
xa end 'a';
xa prepare 'a';
xa commit 'a';
xa start 'a';
xa end 'a';
xa prepare 'a';
xa commit 'a';
#
# BUG#43171 - Assertion failed: thd->transaction.xid_state.xid.is_null()
#
CREATE TABLE t1(a INT, KEY(a)) ENGINE=InnoDB;
INSERT INTO t1 VALUES(1),(2);
connect(con1,localhost,root,,);
# Part 1: Prepare to test XA START after regular transaction deadlock
BEGIN;
UPDATE t1 SET a=3 WHERE a=1;
connection default;
BEGIN;
UPDATE t1 SET a=4 WHERE a=2;
connection con1;
let $conn_id= `SELECT CONNECTION_ID()`;
SEND UPDATE t1 SET a=5 WHERE a=2;
connection default;
let $wait_timeout= 2;
let $wait_condition= SELECT 1 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE ID=$conn_id AND STATE='Searching rows for update';
--source include/wait_condition.inc
--error ER_LOCK_DEADLOCK
UPDATE t1 SET a=5 WHERE a=1;
ROLLBACK;
# Part 2: Prepare to test XA START after XA transaction deadlock
connection con1;
REAP;
ROLLBACK;
BEGIN;
UPDATE t1 SET a=3 WHERE a=1;
connection default;
XA START 'xid1';
UPDATE t1 SET a=4 WHERE a=2;
connection con1;
SEND UPDATE t1 SET a=5 WHERE a=2;
connection default;
let $wait_timeout= 2;
let $wait_condition= SELECT 1 FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE ID=$conn_id AND STATE='Searching rows for update';
--source include/wait_condition.inc
--error ER_LOCK_DEADLOCK
UPDATE t1 SET a=5 WHERE a=1;
--error ER_XA_RBDEADLOCK
XA END 'xid1';
XA ROLLBACK 'xid1';
XA START 'xid1';
XA END 'xid1';
XA ROLLBACK 'xid1';
connection con1;
REAP;
disconnect con1;
connection default;
DROP TABLE t1;
--echo #
--echo # Bug#56448 Assertion failed: ! is_set() with second xa end
--echo #
XA START 'x';
XA END 'x';
# Second XA END caused an assertion.
--error ER_XAER_RMFAIL
XA END 'x';
XA PREPARE 'x';
# Second XA PREPARE also caused an assertion.
--error ER_XAER_RMFAIL
XA PREPARE 'x';
XA ROLLBACK 'x';
--echo #
--echo # Bug#59986 Assert in Diagnostics_area::set_ok_status() for XA COMMIT
--echo #
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a)) engine=InnoDB;
INSERT INTO t1 VALUES (1, 1), (2, 2);
--echo # Connection con1
connect (con1, localhost, root);
XA START 'a';
UPDATE t1 SET b= 3 WHERE a=1;
--echo # Connection default
connection default;
XA START 'b';
UPDATE t1 SET b=4 WHERE a=2;
--echo # Sending:
--send UPDATE t1 SET b=5 WHERE a=1
--echo # Connection con1
connection con1;
--sleep 1
--error ER_LOCK_DEADLOCK
UPDATE t1 SET b=6 WHERE a=2;
# This used to trigger the assert
--error ER_XA_RBDEADLOCK
XA COMMIT 'a';
--echo # Connection default
connection default;
--echo # Reaping: UPDATE t1 SET b=5 WHERE a=1
--reap
XA END 'b';
XA ROLLBACK 'b';
DROP TABLE t1;
disconnect con1;
--echo #
--echo # Bug#11766752 59936: multiple xa assertions - transactional
--echo # statement fuzzer
--echo #
CREATE TABLE t1 (a INT) engine=InnoDB;
XA START 'a';
INSERT INTO t1 VALUES (1);
SAVEPOINT savep;
XA END 'a';
--error ER_XAER_RMFAIL
SELECT * FROM t1;
--error ER_XAER_RMFAIL
INSERT INTO t1 VALUES (2);
--error ER_XAER_RMFAIL
SAVEPOINT savep;
--error ER_XAER_RMFAIL
SET @a=(SELECT * FROM t1);
XA PREPARE 'a';
--error ER_XAER_RMFAIL
SELECT * FROM t1; # used to cause InnoDB assert
--error ER_XAER_RMFAIL
INSERT INTO t1 VALUES (2); # used to cause InnoDB assert
--error ER_XAER_RMFAIL
SAVEPOINT savep;
--error ER_XAER_RMFAIL
SET @a=(SELECT * FROM t1); # used to cause InnoDB assert
--error ER_XAER_RMFAIL
UPDATE t1 SET a=1 WHERE a=2;
XA COMMIT 'a';
SELECT * FROM t1;
DROP TABLE t1;
--echo #
--echo # Bug#12352846 - TRANS_XA_START(THD*):
--echo # ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL()
--echo # FAILED
--echo #
# We need to create a deadlock in which xa transaction will be chosen as
# a victim and rolled back. To keep it simple we will use this scenario:
# 1. connection default obtains LOCK_S on a record
# 2. connection con2 waits for LOCK_X on the same record
# 3. connection default tries to obtain LOCK_X on the record which causes
# a cycle, which is resolved by choosing con2 as a victim.
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1);
START TRANSACTION;
# Step 1.
SELECT a FROM t1 WHERE a=1 FOR SHARE;
--echo # Connection con2
--connect (con2,localhost,root)
XA START 'xid1';
--echo # Sending:
# Step 2.
--send SELECT a FROM t1 WHERE a=1 FOR UPDATE
--echo # Connection default
--connection default
--echo # Waiting for until a transaction with 'SELECT...FOR UPDATE'
--echo # will be locked inside innodb subsystem.
let $wait_condition=
SELECT COUNT(*) = 1 FROM information_schema.innodb_trx
WHERE trx_query = 'SELECT a FROM t1 WHERE a=1 FOR UPDATE' AND
trx_operation_state = 'starting index read' AND
trx_state = 'LOCK WAIT';
--source include/wait_condition.inc
# Step 3.
SELECT a FROM t1 WHERE a=1 FOR UPDATE;
--echo # Connection con2
--connection con2
--echo # Reaping: SELECT a FROM t1 WHERE a=1 FOR UPDATE
--error ER_LOCK_DEADLOCK
--reap
--error ER_XA_RBDEADLOCK
XA COMMIT 'xid1';
--echo # Connection default
connection default;
COMMIT;
--echo # Connection con2
connection con2;
# This caused the assert to be triggered
XA START 'xid1';
XA END 'xid1';
XA PREPARE 'xid1';
XA ROLLBACK 'xid1';
--echo # Connection default
connection default;
DROP TABLE t1;
disconnect con2;
# Wait till all disconnects are completed
--source include/wait_until_count_sessions.inc
--echo #
--echo # Bug#14670465 PLEASE PRINT HUMAN READABLE, ESCAPED
--echo # XID DATA IN XA RECOVER OUTPUT
--echo #
--echo #
--echo # xa Recover command was not diplaying non printable ASCII
--echo # characters in the XID previosuly. Now there is another column
--echo # in the result set which is a Hex Encoded String of the XID.
--echo #
--echo # Check that XIDs which are not normally printable are displayed
--echo # in readable format when CONVERT XID clause is used.
xa start 0xABCDEF1234567890, 0x01, 0x02 ;
xa end 0xABCDEF1234567890, 0x01, 0x02 ;
xa prepare 0xABCDEF1234567890, 0x01, 0x02 ;
--sorted_result
xa recover convert xid;
xa rollback 0xABCDEF1234567890, 0x01, 0x02 ;
--echo # Check that XID which has only printable characters are displayed
--echo # correctly without using of CONVERT XID clause
xa start 0x4142434445, 0x46, 0x02 ;
xa end 0x4142434445, 0x46, 0x02 ;
xa prepare 0x4142434445, 0x46, 0x02 ;
--sorted_result
xa recover;
xa rollback 0x4142434445, 0x46, 0x02 ;
--disable_query_log
call mtr.add_suppression("Found 1 prepared XA transactions");
--enable_query_log
--echo #
--echo # WL#7155: Test 1: check that if a thread of control terminates then
--echo # the Resource Manager dissociate and rollback any associated
--echo # transaction branch (see ref. 3.6 on page 18 of XA spec)
--echo #
connect (con1,localhost,root,,);
CREATE TABLE t1 (a INT) ENGINE=INNODB;
XA START 'xid1';
INSERT INTO t1 VALUES (1);
XA END 'xid1';
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
SELECT * FROM t1;
DROP TABLE t1;
--echo #
--echo # WL#7155: Test 2: Check that if the Resource Manager is doing work outside
--echo # any global transaction on behalf of the application,
--echo # xa_start() returns XAER_OUTSIDE (see xa_start description on page 52 of XA spec)
--echo #
connect (con1,localhost,root,,);
SET SESSION autocommit=0;
START TRANSACTION;
--error ER_XAER_OUTSIDE
XA START 'xid1';
COMMIT;
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
--echo #
--echo # WL#7155: Test 3: Check that the Resource Manager returns error
--echo # if the Transaction Manager tries to resume non-existent transaction.
--echo #
--error ER_XAER_INVAL
XA START 'xid1' RESUME;
--echo #
--echo # WL#7155: Test 4: Check that the Resource Manager returns ok
--echo # if the Transaction Manager tries to resume transaction
--echo # that has been ended before.
--echo #
connect (con1,localhost,root,,);
XA START 'xid1';
XA END 'xid1';
XA START 'xid1' RESUME;
XA END 'xid1';
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
--echo #
--echo # WL#7155: Test 5: Check that the Resource Manager returns error
--echo # if the Transaction Manager ends some XA transaction and
--echo # starts another one with RESUME clause right after that.
--echo #
connect (con1,localhost,root,,);
XA START 'xid1';
XA END 'xid1';
--error ER_XAER_NOTA
XA START 'xid2' RESUME;
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
--echo #
--echo # WL#7155: Test 6: Check that the SUSPEND clause isn't supported for XA END.
--echo #
connect (con1,localhost,root,,);
XA START 'xid1';
--error ER_XAER_INVAL
XA END 'xid1' SUSPEND;
XA END 'xid1';
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
--echo #
--echo # WL#7155: Test 7: Check that attempt to end non-existent XA transaction
--echo # while another XA transaction is active leads to an error
--echo #
connect (con1,localhost,root,,);
XA START 'xid1';
--error ER_XAER_NOTA
XA END 'xid2';
XA END 'xid1';
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
--echo #
--echo # WL#7155: Test 8: Check that XA ROLLBACK can't be called for active XA transaction
--echo #
connect (con1,localhost,root,,);
XA START 'xid1';
--error ER_XAER_RMFAIL
XA ROLLBACK 'xid1';
XA END 'xid1';
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
--echo #
--echo # WL#7155: Test 9: Check that XA PREPARE returns error for unknown xid
--echo #
connect (con1,localhost,root,,);
XA START 'xid1';
XA END 'xid1';
--error ER_XAER_NOTA
XA PREPARE 'xid2';
disconnect con1;
--source include/wait_until_disconnected.inc
connection default;
--echo #
--echo # WL#7155: Test 10: Check that rollback of XA transaction with unknown xid
--echo # leads to an error when there is other prepared XA transaction.
--echo #
XA START 'xid1';
XA END 'xid1';
XA PREPARE 'xid1';
--error ER_XAER_RMFAIL
XA ROLLBACK 'xid2';
XA ROLLBACK 'xid1';
--echo #
--echo # Bug#18107853 - XA LIST GETS CORRUPT, CRASH AND/OR HANG AND/OR ASSERTION
--echo #
--echo # Check that the server reports an error in case of too long input value of
--echo # format ID overflows the type of unsigned long
--error ER_PARSE_ERROR
XA START '1', 0x01, 18446744073709551615;
--echo #
--echo # Bug#25364178 - XA PREPARE INCONSISTENT WITH XTRABACKUP
--echo #
--echo # Check XA state when lock_wait_timeout happens
--echo # More tests added to flush_read_lock.test
connect (con_tmp,localhost,root,,);
set session lock_wait_timeout=1;
create table asd (a int);
xa start 'test1';
insert into asd values(1);
xa end 'test1';
connection default;
flush table with read lock;
connection con_tmp;
--echo # PREPARE error will do auto rollback.
--ERROR ER_LOCK_WAIT_TIMEOUT
xa prepare 'test1';
show errors;
connection default;
unlock tables;
connection con_tmp;
xa start 'test1';
insert into asd values(1);
xa end 'test1';
xa prepare 'test1';
connection default;
flush tables with read lock;
connection con_tmp;
--echo # LOCK error during ROLLBACK will not alter transaction state.
--ERROR ER_LOCK_WAIT_TIMEOUT
xa rollback 'test1';
show errors;
--sorted_result
xa recover;
--echo # LOCK error during COMMIT will not alter transaction state.
--ERROR ER_LOCK_WAIT_TIMEOUT
xa commit 'test1';
show errors;
--sorted_result
xa recover;
connection default;
unlock tables;
connection con_tmp;
xa rollback 'test1';
--sorted_result
xa recover;
drop table asd;
disconnect con_tmp;
--source include/wait_until_disconnected.inc
connection default;
# Finish off disconnected survived transaction
--echo There should be practically no error, but in theory
--echo XAER_NOTA: Unknown XID can be returned if con1 disconnection
--echo took for too long.
--echo todo: consider to make this test dependent on P_S if
--echo todo: such case will be ever registered.
# There should be no prepared transactions left.
XA RECOVER;
--echo #
--echo # WL#7194 -- Define and implement authorization model to manage XA-transactions
--echo #
CREATE USER u1;
GRANT XA_RECOVER_ADMIN ON *.* TO u1;
CREATE USER u2;
XA START 'xid1';
XA END 'xid1';
XA PREPARE 'xid1';
--echo # Connect as user u1
--echo # Since the privilege XA_RECOVER_ADMIN was granted to the user u1
--echo # it is allowed to execute the statement XA RECOVER to get a list of
--echo # xids for prepared XA transactions.
--connect(con1,localhost,u1,'',)
--sorted_result
XA RECOVER;
--echo # Connect as user u2
--echo # The privilege XA_RECOVER_ADMIN wasn't granted to the user u2.
--echo # It leads to issuing the error ER_XAER_RMERR on attempt to run
--echo # the statement XA RECOVER.
--connect(con2,localhost,u2,'',)
--error ER_XAER_RMERR
XA RECOVER;
SHOW WARNINGS;
--connection con1
--disconnect con1
--source include/wait_until_disconnected.inc
--connection default
--echo # The default connection was established on behalf the user root@localhost
--echo # who has the XA_RECOVER_ADMIN privilege assigned by default.
--echo # So for the user root@localhost the statement XA RECOVER
--echo # can be executed successfully.
--sorted_result
XA RECOVER;
XA COMMIT 'xid1';
--echo # Connect as the user u2 who wasn't granted privilege XA_RECOVER_ADMIN.
--echo # Initiates a new XA transaction on behalf the user u2 and shows that
--echo # call XA RECOVER made by the user u2 is failed with error ER_XAER_RMERR.
--connection con2
XA START 'xid2';
XA END 'xid2';
XA PREPARE 'xid2';
--error ER_XAER_RMERR
XA RECOVER;
SHOW WARNINGS;
--echo # Although the user u2 can't get a list of prepared XA transaction this user
--echo # can finalize a prepared XA transaction knowing its XID value.
XA COMMIT 'xid2';
--disconnect con2
--source include/wait_until_disconnected.inc
--connection default
DROP USER u1, u2;
--echo # Check that a user who has the privilege SUPER and hasn't the privilege
--echo # XA_RECOVER_ADMIN isn't allowed to run the statement XA RECOVER
CREATE USER u1;
GRANT SUPER ON *.* TO u1;
SHOW GRANTS FOR u1;
--connect(con1,localhost,u1,'',)
XA START 'xid1';
XA END 'xid1';
XA PREPARE 'xid1';
--error ER_XAER_RMERR
XA RECOVER;
XA COMMIT 'xid1';
--disconnect con1
--source include/wait_until_disconnected.inc
--connection default
DROP USER u1;
--echo # End of tests fro WL#7194
--echo #
--echo # Bug #26848877 -- XA COMMIT/ROLLBACK REJECTED BY NON-AUTOCOMMIT SESSION
--echo # WITH NO ACTIVE TRANSACTION
--echo #
--connect(con1,localhost,root,'',)
--echo # Check that XA COMMIT finalizes XA transaction branch in case
--echo # XA transaction was prepared successfully and after session reconnect
--echo # a user turned off autocommit before running XA COMMIT
XA START 'xid1';
XA END 'xid1';
XA PREPARE 'xid1';
--disconnect con1
--source include/wait_until_disconnected.inc
--connection default
SET autocommit = 0;
XA RECOVER;
# Without patch the following statement would fail with error message:
# 'XA COMMIT 'xid1'' failed: 1399: XAER_RMFAIL: The command can't be executed
# when global transaction is in the NON-EXISTING state
XA COMMIT 'xid1';
--echo # Check that XA ROLLBACK finalizes XA transaction branch in case
--echo # XA transaction was prepared successfully and after reconnect
--echo # a user turned off autocommit before running XA ROLLBACK
--connect(con1,localhost,root,'',)
XA START 'xid1';
XA END 'xid1';
XA PREPARE 'xid1';
--disconnect con1
--source include/wait_until_disconnected.inc
--connection default
SET autocommit = 0;
XA RECOVER;
# Without patch the following statement would fail with error message:
# 'XA ROLLBACK 'xid1'' failed: 1399: XAER_RMFAIL: The command cannot be
# executed when global transaction is in the NON-EXISTING state
XA ROLLBACK 'xid1';