1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-22445 Crash on HANDLER READ NEXT after XA PREPARE

The assertion is absolutely correct since no data access is possible after
XA PREPARE.

The check is added in mysql_ha_read.
This commit is contained in:
Nikita Malyavin
2021-10-07 17:02:26 +03:00
parent 1811fd51fb
commit caebe151c1
3 changed files with 35 additions and 0 deletions

View File

@ -341,5 +341,20 @@ Message XAER_RMFAIL: The command cannot be executed when global transaction is i
xa commit 'foo'; xa commit 'foo';
drop table t1; 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 # End of 10.2 tests
# #

View File

@ -485,6 +485,23 @@ show status like 'foo';
xa commit 'foo'; xa commit 'foo';
drop table t1; drop table t1;
--echo #
--echo # MDEV-22445 Crash on HANDLER READ NEXT after XA PREPARE
--echo #
CREATE TABLE t (a INT KEY) ENGINE=InnoDB;
HANDLER t OPEN AS t;
XA START '0';
SELECT * FROM t;
XA END '0';
XA PREPARE '0';
--error ER_XAER_RMFAIL
HANDLER t READ NEXT;
--echo # Cleanup
XA COMMIT '0';
DROP TABLE t;
--echo # --echo #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #

View File

@ -697,6 +697,9 @@ retry:
if (!(handler= mysql_ha_find_handler(thd, tables->alias))) if (!(handler= mysql_ha_find_handler(thd, tables->alias)))
goto err0; goto err0;
if (thd->transaction.xid_state.check_has_uncommitted_xa())
goto err0;
table= handler->table; table= handler->table;
tables->table= table; // This is used by fix_fields tables->table= table; // This is used by fix_fields
table->pos_in_table_list= tables; table->pos_in_table_list= tables;