call mtr.add_suppression("Deadlock found when trying to get lock; try restarting transaction");
drop table if exists t1, t2;
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;
a
xa start 'test2';
xa start 'test-bad';
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  ACTIVE state
insert t1 values (20);
xa prepare 'test2';
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  ACTIVE state
xa end 'test2';
xa prepare 'test2';
xa commit 'test2';
select * from t1;
a
20
xa start 'testa','testb';
insert t1 values (30);
commit;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  ACTIVE state
xa end 'testa','testb';
begin;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  IDLE state
create table t2 (a int);
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  IDLE state
connect  con1,localhost,root,,;
connection con1;
xa start 'testa','testb';
ERROR XAE08: XAER_DUPID: The XID already exists
xa start 'testa','testb', 123;
ERROR XAE08: XAER_DUPID: The XID already exists
xa start 0x7465737462, 0x2030405060, 0xb;
insert t1 values (40);
xa end 'testb',' 0@P`',11;
xa prepare 'testb',0x2030405060,11;
start transaction;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
xa recover;
formatID	gtrid_length	bqual_length	data
11	5	5	testb 0@P`
connection default;
xa prepare 'testa','testb';
xa recover;
formatID	gtrid_length	bqual_length	data
11	5	5	testb 0@P`
1	5	5	testatestb
xa commit 'testb',0x2030405060,11;
ERROR XAE09: XAER_OUTSIDE: Some work is done outside global transaction
xa rollback 'testa','testb';
xa start 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
select * from t1;
a
20
disconnect con1;
xa rollback 'testb',0x2030405060,11;
xa recover;
formatID	gtrid_length	bqual_length	data
connection default;
xa start 'tr1';
insert t1 values (40);
xa end 'tr1';
xa prepare 'tr1';
xa recover format='SQL';
formatID	gtrid_length	bqual_length	data
1	3	0	'tr1'
xa rollback 'tr1';
xa start 'tr1', 'bq';
insert t1 values (40);
xa end 'tr1', 'bq';
xa prepare 'tr1', 'bq';
xa recover format='SQL';
formatID	gtrid_length	bqual_length	data
1	3	2	'tr1','bq'
xa rollback 'tr1', 'bq';
xa start 'tr1', 'bq', 3;
insert t1 values (40);
xa end 'tr1', 'bq', 3;
xa prepare 'tr1', 'bq', 3;
xa recover format='SQL';
formatID	gtrid_length	bqual_length	data
3	3	2	'tr1','bq',3
xa rollback 'tr1', 'bq', 3;
xa start 'tr1#$';
insert t1 values (40);
xa end 'tr1#$';
xa prepare 'tr1#$';
xa recover format='SQL';
formatID	gtrid_length	bqual_length	data
1	5	0	X'7472312324'
xa rollback 'tr1#$';
xa start 'tr1#$', 'bq';
insert t1 values (40);
xa end 'tr1#$', 'bq';
xa prepare 'tr1#$', 'bq';
xa recover format='SQL';
formatID	gtrid_length	bqual_length	data
1	5	2	X'7472312324',X'6271'
xa rollback 'tr1#$', 'bq';
xa start 'tr1#$', 'bq', 3;
insert t1 values (40);
xa end 'tr1#$', 'bq', 3;
xa prepare 'tr1#$', 'bq', 3;
xa recover format='RAW';
formatID	gtrid_length	bqual_length	data
3	5	2	tr1#$bq
xa recover format='PLAIN';
ERROR HY000: Unknown XA RECOVER format name: 'PLAIN'
xa recover format='SQL';
formatID	gtrid_length	bqual_length	data
3	5	2	X'7472312324',X'6271',3
xa rollback 'tr1#$', 'bq', 3;
drop table t1;
drop table if exists t1;
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;
update t1 set c = 'bb' where a = 2;
connection con2;
update t1 set c = 'aa' where a = 1;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
select count(*) from t1;
count(*)
2
xa end 'a','c';
ERROR XA102: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected
xa rollback 'a','c';
disconnect con2;
connect  con3,localhost,root,,;
connection con3;
xa start 'a','c';
disconnect con1;
disconnect con3;
connection default;
drop table t1;
#
# BUG#51342 - more xid crashing
#
CREATE TABLE t1(a INT) ENGINE=InnoDB;
XA START 'x';
SET SESSION autocommit=0;
INSERT INTO t1 VALUES(1);
SET SESSION autocommit=1;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  ACTIVE state
SELECT @@autocommit;
@@autocommit
0
INSERT INTO t1 VALUES(1);
XA END 'x';
XA COMMIT 'x' ONE PHASE;
DROP TABLE t1;
SET SESSION autocommit=1;
End of 5.0 tests
xa start 'a';
xa end 'a';
xa rollback 'a';
xa start 'a';
xa end 'a';
xa rollback 'a';
xa start 'a';
xa end 'a';
xa prepare 'a';
xa commit 'a';
xa start 'a';
xa end 'a';
xa prepare 'a';
xa commit 'a';
CREATE TABLE t1(a INT, KEY(a)) ENGINE=InnoDB;
INSERT INTO t1 VALUES(1),(2);
connect con1,localhost,root,,;
BEGIN;
UPDATE t1 SET a=3 WHERE a=1;
connection default;
BEGIN;
UPDATE t1 SET a=4 WHERE a=2;
connection con1;
UPDATE t1 SET a=5 WHERE a=2;
connection default;
UPDATE t1 SET a=5 WHERE a=1;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
ROLLBACK;
connection con1;
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;
UPDATE t1 SET a=5 WHERE a=2;
connection default;
UPDATE t1 SET a=5 WHERE a=1;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
XA END 'xid1';
ERROR XA102: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected
XA ROLLBACK 'xid1';
XA START 'xid1';
XA END 'xid1';
XA ROLLBACK 'xid1';
disconnect con1;
DROP TABLE t1;
#
# Bug#56448 Assertion failed: ! is_set() with second xa end
#
XA START 'x';
XA END 'x';
XA END 'x';
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  IDLE state
XA PREPARE 'x';
XA PREPARE 'x';
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
XA ROLLBACK 'x';
#
# Bug#59986 Assert in Diagnostics_area::set_ok_status() for XA COMMIT
#
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a INT, b INT, PRIMARY KEY(a)) engine=InnoDB;
INSERT INTO t1 VALUES (1, 1), (2, 2);
connect  con1, localhost, root;
XA START 'a';
UPDATE t1 SET b= 3 WHERE a=1;
connection default;
XA START 'b';
UPDATE t1 SET b=4 WHERE a=2;
# Sending:
UPDATE t1 SET b=5 WHERE a=1;
connection con1;
UPDATE t1 SET b=6 WHERE a=2;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
XA COMMIT 'a';
ERROR XA102: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected
connection default;
# Reaping: UPDATE t1 SET b=5 WHERE a=1
XA END 'b';
XA ROLLBACK 'b';
DROP TABLE t1;
disconnect con1;
#
# Bug#11766752 59936: multiple xa assertions - transactional
#              statement fuzzer
#
CREATE TABLE t1 (a INT) engine=InnoDB;
XA START 'a';
INSERT INTO t1 VALUES (1);
SAVEPOINT savep;
XA END 'a';
SELECT * FROM t1;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  IDLE state
INSERT INTO t1 VALUES (2);
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  IDLE state
SAVEPOINT savep;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  IDLE state
SET @a=(SELECT * FROM t1);
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  IDLE state
XA PREPARE 'a';
SELECT * FROM t1;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
INSERT INTO t1 VALUES (2);
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
SAVEPOINT savep;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
SET @a=(SELECT * FROM t1);
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
UPDATE t1 SET a=1 WHERE a=2;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
XA COMMIT 'a';
SELECT * FROM t1;
a
1
DROP TABLE t1;
#
# MDEV-14609 XA Transction unable to ROLLBACK TO SAVEPOINT
#
CREATE TABLE t1 (c1 INT) ENGINE=INNODB;
XA START 'xa1';
SAVEPOINT savepoint1;
INSERT INTO t1 (c1) VALUES (1),(2),(3),(4);
ROLLBACK TO SAVEPOINT savepoint1;
XA END 'xa1';
XA ROLLBACK 'xa1';
DROP TABLE t1;
#
# Bug#12352846 - TRANS_XA_START(THD*):
#                ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL()
#                FAILED
#
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
INSERT INTO t2 VALUES (1);
COMMIT;
BEGIN;
INSERT INTO t2 VALUES (2);
UPDATE t2 SET a=a+2;
UPDATE t2 SET a=a-1;
connect  con2,localhost,root;
XA START 'xid1';
INSERT INTO t1 VALUES (1);
# Sending:
DELETE FROM t2;
connection default;
DELETE FROM t1;
connection con2;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
XA COMMIT 'xid1';
ERROR XA102: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected
connection default;
COMMIT;
connection con2;
XA START 'xid1';
XA END 'xid1';
XA PREPARE 'xid1';
XA ROLLBACK 'xid1';
connection default;
DROP TABLE t1, t2;
disconnect con2;
CREATE TABLE t1 (pk INT PRIMARY KEY) ENGINE=InnoDB;
CREATE TABLE t2 (pk INT PRIMARY KEY) ENGINE=InnoDB;
INSERT INTO t2 VALUES (1),(2);
CREATE TABLE t3 (i INT) ENGINE=InnoDB;
XA BEGIN 'xid1';
REPLACE INTO t1 SELECT * FROM t2;
connect  con1,localhost,root,,test;
XA BEGIN 'xid2';
INSERT INTO t1 SELECT * FROM t2;
connection default;
REPLACE INTO t2 SELECT * FROM t2;
connection con1;
disconnect con1;
connect  con2,localhost,root,,test;
INSERT INTO t3 VALUES (1);
XA BEGIN 'xid3';
disconnect con2;
connection default;
XA END 'xid1';
XA ROLLBACK 'xid1';
DROP TABLE t1, t2, t3;
#
# MDEV 15532 XA: Assertion `!log->same_pk' failed in
# row_log_table_apply_delete
#
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1),(2);
connect  con1,localhost,root,,test;
XA START 'xid';
UPDATE t1 SET a = 5;
connection default;
SET innodb_lock_wait_timeout= 2, lock_wait_timeout= 2;
ALTER TABLE non_existing_table1;
ERROR 42S02: Table 'test.non_existing_table1' doesn't exist
ALTER TABLE t1 FORCE;;
connection con1;
ALTER TABLE non_existing_table2;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  ACTIVE state
DELETE FROM t1 LIMIT 1;
connection default;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
connection con1;
XA END 'xid';
XA ROLLBACK 'xid';
DROP TABLE t1;
disconnect con1;
connection default;
#
# MDEV-21766 - Forbid XID with empty 'gtrid'
#
CREATE TABLE t1(a INT) ENGINE=InnoDB;
XA BEGIN '';
ERROR XAE05: XAER_INVAL: Invalid arguments (or unsupported command)
XA BEGIN '8bytes1x8bytes2x8bytes3x8bytes4x8bytes5x8bytes6x8bytes7x8bytes8x',
'8bytes1x8bytes2x8bytes3x8bytes4x8bytes5x8bytes6x8bytes7x8bytes8x';
INSERT INTO t1 VALUES(1);
XA END '8bytes1x8bytes2x8bytes3x8bytes4x8bytes5x8bytes6x8bytes7x8bytes8x',
'8bytes1x8bytes2x8bytes3x8bytes4x8bytes5x8bytes6x8bytes7x8bytes8x';
XA PREPARE '8bytes1x8bytes2x8bytes3x8bytes4x8bytes5x8bytes6x8bytes7x8bytes8x',
'8bytes1x8bytes2x8bytes3x8bytes4x8bytes5x8bytes6x8bytes7x8bytes8x';
XA ROLLBACK '8bytes1x8bytes2x8bytes3x8bytes4x8bytes5x8bytes6x8bytes7x8bytes8x',
'8bytes1x8bytes2x8bytes3x8bytes4x8bytes5x8bytes6x8bytes7x8bytes8x';
SET NAMES utf8;
XA BEGIN 'Я_упала_с_сеновала_тормозила_головой';
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
XA BEGIN 'Я_упaлa_c_сеновала_тормозила_головой';
XA END 'Я_упaлa_c_сеновала_тормозила_головой';
XA PREPARE 'Я_упaлa_c_сеновала_тормозила_головой';
XA ROLLBACK 'Я_упaлa_c_сеновала_тормозила_головой';
SET NAMES default;
DROP TABLE t1;
#
# MDEV-21659 XA rollback foreign_xid is allowed inside active XA
# MDEV-21854 - xa commit  one phase for already prepared transaction
#              must always error out
#
BEGIN;
XA COMMIT 'unknown';
ERROR XAE09: XAER_OUTSIDE: Some work is done outside global transaction
XA COMMIT 'unknown' ONE PHASE;
ERROR XAE09: XAER_OUTSIDE: Some work is done outside global transaction
BEGIN;
XA ROLLBACK 'unknown';
ERROR XAE09: XAER_OUTSIDE: Some work is done outside global transaction
ROLLBACK;
XA START 'xid1';
XA COMMIT 'unknown';
ERROR XAE09: XAER_OUTSIDE: Some work is done outside global transaction
XA COMMIT 'unknown' ONE PHASE;
ERROR XAE09: XAER_OUTSIDE: Some work is done outside global transaction
XA ROLLBACK 'unknown';
ERROR XAE09: XAER_OUTSIDE: Some work is done outside global transaction
XA END 'xid1';
XA PREPARE 'xid1';
XA COMMIT 'xid1' ONE PHASE;
ERROR XAE05: XAER_INVAL: Invalid arguments (or unsupported command)
XA ROLLBACK 'xid1';
#
# MDEV-21856 - xid_t::formatID has to be constrained to 4 byte size
#
XA START 'gtrid', 'bqual', 0x80000000;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '0x80000000' at line 1
#
# XA states and SHOW commands
#
create table t1 (pk int primary key) engine=innodb;
xa start 'foo';
insert t1 set pk=1;
xa end 'foo';
xa prepare 'foo';
show status like 'foo';
Variable_name	Value
select table_name,table_comment from information_schema.tables where table_schema='test';
table_name	t1
table_comment	
select table_name,table_rows,table_comment from information_schema.tables where table_schema='test';
table_name	t1
table_rows	NULL
table_comment	XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
Warnings:
Level	Warning
Code	1399
Message	XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
xa commit 'foo';
drop table t1;
#
# MDEV-22445 Crash on HANDLER READ NEXT after XA PREPARE
#
CREATE TABLE t (a INT KEY) ENGINE=InnoDB;
HANDLER t OPEN AS t;
XA START '0';
SELECT * FROM t;
a
XA END '0';
XA PREPARE '0';
HANDLER t READ NEXT;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  PREPARED state
# Cleanup
XA COMMIT '0';
DROP TABLE t;
#
# End of 10.2 tests
#
XA BEGIN 'xid';
CREATE TEMPORARY SEQUENCE s;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  ACTIVE state
XA END 'xid';
XA ROLLBACK 'xid';
XA BEGIN 'xid';
CREATE SEQUENCE s;
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the  ACTIVE state
XA END 'xid';
XA ROLLBACK 'xid';
#
# End of 10.3 tests
#
#
# Start of 10.5 tests
#
# MDEV-7974 related
# Check XA state when lock_wait_timeout happens
# More tests added to flush_read_lock.test
connect  con_tmp,localhost,root,,;
set session lock_wait_timeout=1;
create table asd (a int) engine=innodb;
xa start 'test1';
insert into asd values(1);
xa end 'test1';
connection default;
flush table with read lock;
connection con_tmp;
# PREPARE error will do auto rollback.
xa prepare 'test1';
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
show errors;
Level	Code	Message
Error	1205	Lock wait timeout exceeded; try restarting transaction
Error	1402	XA_RBROLLBACK: Transaction branch was rolled back
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;
# LOCK error during ROLLBACK will not alter transaction state.
xa rollback 'test1';
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
show errors;
Level	Code	Message
Error	1205	Lock wait timeout exceeded; try restarting transaction
Error	1401	XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency
xa recover;
formatID	gtrid_length	bqual_length	data
1	5	0	test1
# LOCK error during COMMIT will not alter transaction state.
xa commit 'test1';
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
show errors;
Level	Code	Message
Error	1205	Lock wait timeout exceeded; try restarting transaction
Error	1401	XAER_RMERR: Fatal error occurred in the transaction branch - check your data for consistency
xa recover;
formatID	gtrid_length	bqual_length	data
1	5	0	test1
connection default;
unlock tables;
connection con_tmp;
xa rollback 'test1';
xa recover;
formatID	gtrid_length	bqual_length	data
drop table asd;
disconnect con_tmp;
connection default;
# MDEV-30978: a read-only server should still allow the commit of
#             read-only XA transactions
set @sav_read_only=@@global.read_only;
set global read_only=1;
xa start '1';
select 0;
0
0
xa end '1';
xa prepare '1';
xa commit '1';
xa start '2';
select 0;
0
0
xa end '2';
xa prepare '2';
xa rollback '2';
# Read-only disconnect case
connect  con1_ro,localhost,root,,;
xa start '3';
select 0;
0
0
xa end '3';
xa prepare '3';
disconnect con1_ro;
connection default;
xa recover;
formatID	gtrid_length	bqual_length	data
1	1	0	3
xa commit '3';
ERROR XA100: XA_RBROLLBACK: Transaction branch was rolled back
connect  con2_ro,localhost,root,,;
xa start '4';
select 0;
0
0
xa end '4';
xa prepare '4';
disconnect con2_ro;
connection default;
xa recover;
formatID	gtrid_length	bqual_length	data
1	1	0	4
xa rollback '4';
ERROR XA100: XA_RBROLLBACK: Transaction branch was rolled back
set @@global.read_only=@sav_read_only;
#
# End of 10.5 tests
#