Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions mysql-test/suite/rpl/include/sql_out_of_order_gtid.inc
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ INSERT INTO t3 values (4,'c4');
SET @@session.gtid_seq_no= 7;
BEGIN;
INSERT INTO t2 values (3, 'b3');

COMMIT;
SET @@session.server_id= 1;
BEGIN;
INSERT INTO t1 values (2, 'a2');

COMMIT;
FLUSH LOGS;

--eval SET @@session.gtid_domain_id= $ORIG_GTID_DOMAIN_ID
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
#
# Test that SET @@session.server_id fails inside explicit transaction
#
BEGIN;
INSERT INTO t1 VALUES (1);
SET @@session.server_id = 100;
ERROR HY000: Cannot set @@session.server_id within a transaction
ROLLBACK;
#
# Test that SET @@session.server_id works outside transaction
#
SET @@session.server_id = 100;
SELECT @@session.server_id;
@@session.server_id
100
#
# Test that SET @@session.server_id fails with autocommit=0
#
SET autocommit = 0;
INSERT INTO t1 VALUES (2);
SET @@session.server_id = 200;
ERROR HY000: Cannot set @@session.server_id within a transaction
ROLLBACK;
SET autocommit = 1;
#
# Test that SET @@session.server_id works after COMMIT
#
BEGIN;
INSERT INTO t1 VALUES (3);
COMMIT;
SET @@session.server_id = 300;
SELECT @@session.server_id;
@@session.server_id
300
#
# Test that SET @@session.server_id fails inside a trigger
#
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
CREATE TRIGGER tr1 BEFORE INSERT ON t2 FOR EACH ROW
SET @@session.server_id = 100;
INSERT INTO t2 VALUES (1);
ERROR HY000: Cannot set @@session.server_id within a trigger or stored program
DROP TRIGGER tr1;
DROP TABLE t2;
#
# Test that SET @@session.server_id fails inside a stored procedure
# called within a transaction
#
CREATE PROCEDURE sp1()
BEGIN
SET @@session.server_id = 100;
END//
BEGIN;
CALL sp1();
ERROR HY000: Cannot set @@session.server_id within a transaction
ROLLBACK;
DROP PROCEDURE sp1;
#
# Test that SET @@session.server_id fails inside a stored procedure
# that starts its own transaction
#
CREATE PROCEDURE sp2()
BEGIN
START TRANSACTION;
INSERT INTO t1 VALUES (1);
SET @@session.server_id = 100;
COMMIT;
END//
CALL sp2();
ERROR HY000: Cannot set @@session.server_id within a transaction
DROP PROCEDURE sp2;
#
# Cleanup
#
DROP TABLE t1;
94 changes: 94 additions & 0 deletions mysql-test/suite/sys_vars/t/set_server_id_inside_transaction.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
--source include/have_innodb.inc

#
# MDEV-27837: Disallow SET @@session.server_id within transaction
#

CREATE TABLE t1 (a INT) ENGINE=InnoDB;

--echo #
--echo # Test that SET @@session.server_id fails inside explicit transaction
--echo #
BEGIN;
INSERT INTO t1 VALUES (1);
--error ER_CANT_SET_SERVER_ID_IN_TRANSACTION

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this fails as follows in buildbot:

sys_vars.set_server_id_inside_transaction w6 [ fail ]
        Test ended at 2026-07-14 00:52:24
CURRENT_TEST: sys_vars.set_server_id_inside_transaction
mysqltest: At line 14: Unknown SQL error name 'ER_CANT_SET_SERVER_ID_IN_TRANSACTION'

SET @@session.server_id = 100;
ROLLBACK;

--echo #
--echo # Test that SET @@session.server_id works outside transaction
--echo #
SET @@session.server_id = 100;
SELECT @@session.server_id;

--echo #
--echo # Test that SET @@session.server_id fails with autocommit=0
--echo #
SET autocommit = 0;
INSERT INTO t1 VALUES (2);
--error ER_CANT_SET_SERVER_ID_IN_TRANSACTION
SET @@session.server_id = 200;
ROLLBACK;
SET autocommit = 1;

--echo #
--echo # Test that SET @@session.server_id works after COMMIT
--echo #
BEGIN;
INSERT INTO t1 VALUES (3);
COMMIT;
SET @@session.server_id = 300;
SELECT @@session.server_id;

--echo #
--echo # Test that SET @@session.server_id fails inside a trigger
--echo #
CREATE TABLE t2 (a INT) ENGINE=InnoDB;
CREATE TRIGGER tr1 BEFORE INSERT ON t2 FOR EACH ROW
SET @@session.server_id = 100;
--error ER_CANT_SET_SERVER_ID_IN_SUBSTATEMENT
INSERT INTO t2 VALUES (1);
DROP TRIGGER tr1;
DROP TABLE t2;

--echo #
--echo # Test that SET @@session.server_id fails inside a stored procedure
--echo # called within a transaction
--echo #
--delimiter //

CREATE PROCEDURE sp1()
BEGIN
SET @@session.server_id = 100;
END//

--delimiter ;

BEGIN;
--error ER_CANT_SET_SERVER_ID_IN_TRANSACTION
CALL sp1();
ROLLBACK;
DROP PROCEDURE sp1;

--echo #
--echo # Test that SET @@session.server_id fails inside a stored procedure
--echo # that starts its own transaction
--echo #
--delimiter //
CREATE PROCEDURE sp2()
BEGIN
START TRANSACTION;
INSERT INTO t1 VALUES (1);
SET @@session.server_id = 100;
COMMIT;
END//
--delimiter ;
--error ER_CANT_SET_SERVER_ID_IN_TRANSACTION
CALL sp2();
DROP PROCEDURE sp2;

--echo #
--echo # Cleanup
--echo #
DROP TABLE t1;

2 changes: 2 additions & 0 deletions sql/share/errmsg-utf8.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12406,3 +12406,5 @@ ER_WARN_QB_NAME_PATH_VIEW_NOT_FOUND
eng "Hint %s is ignored. `%s` required at element #%u of the path is not found in the target query block."
ER_WARN_QB_NAME_PATH_NOT_SUPPORTED_INSIDE_VIEW
eng "Hint %s is ignored. QB_NAME hints with path are not supported inside view definitions."
ER_CANT_SET_IN_SUBSTATEMENT
eng "Cannot set %s within a trigger or stored program"
13 changes: 13 additions & 0 deletions sql/sys_vars.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3638,6 +3638,19 @@ static bool check_server_id(sys_var *self, THD *thd, set_var *var)
return true;
}
#endif /* WITH_WSREP */

if (unlikely(thd->in_sub_stmt))
{
my_error(ER_CANT_SET_IN_SUBSTATEMENT, MYF(0), "@@session.server_id");
return true;
}

if (unlikely(thd->in_active_multi_stmt_transaction()))
{
my_error(ER_CANT_SET_IN_TRANSACTION, MYF(0), "@@session.server_id");
return true;
}

return false;
}

Expand Down