Loading mysql-test/r/xa.result +12 −2 Original line number Diff line number Diff line Loading @@ -9,10 +9,10 @@ select * from t1; a xa start 'test2'; xa start 'test-bad'; ERROR XAE07: XAER_RMFAIL: The command cannot be executed in the ACTIVE state 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 in the ACTIVE state 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'; Loading @@ -21,13 +21,23 @@ 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 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` Loading mysql-test/t/xa.test +14 −0 Original line number Diff line number Diff line Loading @@ -26,13 +26,24 @@ select * from t1; xa start 'testa','testb'; insert t1 values (30); --error 1399 commit; xa end 'testa','testb'; --error 1399 begin; --error 1399 create table t2 (a int); connect (con1,localhost,,,); connection con1; --error 1440 xa start 'testa','testb'; --error 1440 xa start 'testa','testb', 123; # gtrid [ , bqual [ , formatID ] ] xa start 0x7465737462, 0x2030405060, 0xb; Loading @@ -40,6 +51,9 @@ insert t1 values (40); xa end 'testb',' 0@P`',11; xa prepare 'testb',0x2030405060,11; --error 1399 start transaction; xa recover; # uncomment the line below when binlog will be able to prepare Loading sql/handler.h +9 −1 Original line number Diff line number Diff line Loading @@ -228,7 +228,7 @@ struct xid_t { char data[XIDDATASIZE]; // not \0-terminated ! bool eq(struct xid_t *xid) { return !memcmp(this, xid, length()); } { return eq(xid->gtrid_length, xid->bqual_length, xid->data); } bool eq(long g, long b, const char *d) { return g == gtrid_length && b == bqual_length && !memcmp(d, data, g+b); } void set(struct xid_t *xid) Loading Loading @@ -276,6 +276,14 @@ struct xid_t { return sizeof(formatID)+sizeof(gtrid_length)+sizeof(bqual_length)+ gtrid_length+bqual_length; } byte *key() { return (byte *)>rid_length; } uint key_length() { return sizeof(gtrid_length)+sizeof(bqual_length)+gtrid_length+bqual_length; } }; typedef struct xid_t XID; Loading sql/share/errmsg.txt +2 −1 Original line number Diff line number Diff line Loading @@ -5311,7 +5311,8 @@ ER_XAER_NOTA XAE04 ER_XAER_INVAL XAE05 eng "XAER_INVAL: Invalid arguments (or unsupported command)" ER_XAER_RMFAIL XAE07 eng "XAER_RMFAIL: The command cannot be executed in the %.64s state" eng "XAER_RMFAIL: The command cannot be executed when global transaction is in the %.64s state" rus "XAER_RMFAIL: '%.64s'" ER_XAER_OUTSIDE XAE09 eng "XAER_OUTSIDE: Some work is done outside global transaction" ER_XAER_RMERR XAE03 Loading sql/sql_class.cc +6 −6 Original line number Diff line number Diff line Loading @@ -1982,8 +1982,8 @@ HASH xid_cache; static byte *xid_get_hash_key(const byte *ptr,uint *length, my_bool not_used __attribute__((unused))) { *length=((XID_STATE*)ptr)->xid.length(); return (byte *)&((XID_STATE*)ptr)->xid; *length=((XID_STATE*)ptr)->xid.key_length(); return ((XID_STATE*)ptr)->xid.key(); } static void xid_free_hash (void *ptr) Loading Loading @@ -2011,7 +2011,7 @@ void xid_cache_free() XID_STATE *xid_cache_search(XID *xid) { pthread_mutex_lock(&LOCK_xid_cache); XID_STATE *res=(XID_STATE *)hash_search(&xid_cache, (byte *)xid, xid->length()); XID_STATE *res=(XID_STATE *)hash_search(&xid_cache, xid->key(), xid->key_length()); pthread_mutex_unlock(&LOCK_xid_cache); return res; } Loading @@ -2022,7 +2022,7 @@ bool xid_cache_insert(XID *xid, enum xa_states xa_state) XID_STATE *xs; my_bool res; pthread_mutex_lock(&LOCK_xid_cache); if (hash_search(&xid_cache, (byte *)xid, xid->length())) if (hash_search(&xid_cache, xid->key(), xid->key_length())) res=0; else if (!(xs=(XID_STATE *)my_malloc(sizeof(*xs), MYF(MY_WME)))) res=1; Loading @@ -2041,8 +2041,8 @@ bool xid_cache_insert(XID *xid, enum xa_states xa_state) bool xid_cache_insert(XID_STATE *xid_state) { pthread_mutex_lock(&LOCK_xid_cache); DBUG_ASSERT(hash_search(&xid_cache, (byte *)&xid_state->xid, xid_state->xid.length())==0); DBUG_ASSERT(hash_search(&xid_cache, xid_state->xid.key(), xid_state->xid.key_length())==0); my_bool res=my_hash_insert(&xid_cache, (byte*)xid_state); pthread_mutex_unlock(&LOCK_xid_cache); return res; Loading Loading
mysql-test/r/xa.result +12 −2 Original line number Diff line number Diff line Loading @@ -9,10 +9,10 @@ select * from t1; a xa start 'test2'; xa start 'test-bad'; ERROR XAE07: XAER_RMFAIL: The command cannot be executed in the ACTIVE state 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 in the ACTIVE state 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'; Loading @@ -21,13 +21,23 @@ 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 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` Loading
mysql-test/t/xa.test +14 −0 Original line number Diff line number Diff line Loading @@ -26,13 +26,24 @@ select * from t1; xa start 'testa','testb'; insert t1 values (30); --error 1399 commit; xa end 'testa','testb'; --error 1399 begin; --error 1399 create table t2 (a int); connect (con1,localhost,,,); connection con1; --error 1440 xa start 'testa','testb'; --error 1440 xa start 'testa','testb', 123; # gtrid [ , bqual [ , formatID ] ] xa start 0x7465737462, 0x2030405060, 0xb; Loading @@ -40,6 +51,9 @@ insert t1 values (40); xa end 'testb',' 0@P`',11; xa prepare 'testb',0x2030405060,11; --error 1399 start transaction; xa recover; # uncomment the line below when binlog will be able to prepare Loading
sql/handler.h +9 −1 Original line number Diff line number Diff line Loading @@ -228,7 +228,7 @@ struct xid_t { char data[XIDDATASIZE]; // not \0-terminated ! bool eq(struct xid_t *xid) { return !memcmp(this, xid, length()); } { return eq(xid->gtrid_length, xid->bqual_length, xid->data); } bool eq(long g, long b, const char *d) { return g == gtrid_length && b == bqual_length && !memcmp(d, data, g+b); } void set(struct xid_t *xid) Loading Loading @@ -276,6 +276,14 @@ struct xid_t { return sizeof(formatID)+sizeof(gtrid_length)+sizeof(bqual_length)+ gtrid_length+bqual_length; } byte *key() { return (byte *)>rid_length; } uint key_length() { return sizeof(gtrid_length)+sizeof(bqual_length)+gtrid_length+bqual_length; } }; typedef struct xid_t XID; Loading
sql/share/errmsg.txt +2 −1 Original line number Diff line number Diff line Loading @@ -5311,7 +5311,8 @@ ER_XAER_NOTA XAE04 ER_XAER_INVAL XAE05 eng "XAER_INVAL: Invalid arguments (or unsupported command)" ER_XAER_RMFAIL XAE07 eng "XAER_RMFAIL: The command cannot be executed in the %.64s state" eng "XAER_RMFAIL: The command cannot be executed when global transaction is in the %.64s state" rus "XAER_RMFAIL: '%.64s'" ER_XAER_OUTSIDE XAE09 eng "XAER_OUTSIDE: Some work is done outside global transaction" ER_XAER_RMERR XAE03 Loading
sql/sql_class.cc +6 −6 Original line number Diff line number Diff line Loading @@ -1982,8 +1982,8 @@ HASH xid_cache; static byte *xid_get_hash_key(const byte *ptr,uint *length, my_bool not_used __attribute__((unused))) { *length=((XID_STATE*)ptr)->xid.length(); return (byte *)&((XID_STATE*)ptr)->xid; *length=((XID_STATE*)ptr)->xid.key_length(); return ((XID_STATE*)ptr)->xid.key(); } static void xid_free_hash (void *ptr) Loading Loading @@ -2011,7 +2011,7 @@ void xid_cache_free() XID_STATE *xid_cache_search(XID *xid) { pthread_mutex_lock(&LOCK_xid_cache); XID_STATE *res=(XID_STATE *)hash_search(&xid_cache, (byte *)xid, xid->length()); XID_STATE *res=(XID_STATE *)hash_search(&xid_cache, xid->key(), xid->key_length()); pthread_mutex_unlock(&LOCK_xid_cache); return res; } Loading @@ -2022,7 +2022,7 @@ bool xid_cache_insert(XID *xid, enum xa_states xa_state) XID_STATE *xs; my_bool res; pthread_mutex_lock(&LOCK_xid_cache); if (hash_search(&xid_cache, (byte *)xid, xid->length())) if (hash_search(&xid_cache, xid->key(), xid->key_length())) res=0; else if (!(xs=(XID_STATE *)my_malloc(sizeof(*xs), MYF(MY_WME)))) res=1; Loading @@ -2041,8 +2041,8 @@ bool xid_cache_insert(XID *xid, enum xa_states xa_state) bool xid_cache_insert(XID_STATE *xid_state) { pthread_mutex_lock(&LOCK_xid_cache); DBUG_ASSERT(hash_search(&xid_cache, (byte *)&xid_state->xid, xid_state->xid.length())==0); DBUG_ASSERT(hash_search(&xid_cache, xid_state->xid.key(), xid_state->xid.key_length())==0); my_bool res=my_hash_insert(&xid_cache, (byte*)xid_state); pthread_mutex_unlock(&LOCK_xid_cache); return res; Loading