diff options
author | unknown <knielsen@knielsen-hq.org> | 2013-06-07 09:31:11 +0200 |
---|---|---|
committer | unknown <knielsen@knielsen-hq.org> | 2013-06-07 09:31:11 +0200 |
commit | dbe2c5060edec13d591d176df08d0fc07c3aa6dd (patch) | |
tree | cad304799b2c4a53b41b71985ce83ab9d2f1c192 /sql/sys_vars.cc | |
parent | 7b6ab5638ac8bd4bb604e3c39d5f21218ab17688 (diff) | |
download | mariadb-git-dbe2c5060edec13d591d176df08d0fc07c3aa6dd.tar.gz |
MDEV-4591:Setting gtid* values from inside a transaction might cause unexpected results
Now we give an error on attempts to set @@SESSION.gtid_domain_id or
@@SESSION.gtid_seq_no when a transaction is active.
Diffstat (limited to 'sql/sys_vars.cc')
-rw-r--r-- | sql/sys_vars.cc | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index b25f979cf79..4066a04aea7 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -1203,6 +1203,21 @@ static Sys_var_ulong Sys_pseudo_thread_id( BLOCK_SIZE(1), NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(check_has_super)); +static bool +check_gtid_domain_id(sys_var *self, THD *thd, set_var *var) +{ + if (check_has_super(self, thd, var)) + return true; + if (var->type != OPT_GLOBAL && + error_if_in_trans_or_substatement(thd, + ER_STORED_FUNCTION_PREVENTS_SWITCH_GTID_DOMAIN_ID_SEQ_NO, + ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_GTID_DOMAIN_ID_SEQ_NO)) + return true; + + return false; +} + + static Sys_var_uint Sys_gtid_domain_id( "gtid_domain_id", "Used with global transaction ID to identify logically independent " @@ -1213,7 +1228,7 @@ static Sys_var_uint Sys_gtid_domain_id( SESSION_VAR(gtid_domain_id), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, UINT_MAX32), DEFAULT(0), BLOCK_SIZE(1), NO_MUTEX_GUARD, NOT_IN_BINLOG, - ON_CHECK(check_has_super)); + ON_CHECK(check_gtid_domain_id)); static bool check_gtid_seq_no(sys_var *self, THD *thd, set_var *var) @@ -1223,6 +1238,11 @@ static bool check_gtid_seq_no(sys_var *self, THD *thd, set_var *var) if (check_has_super(self, thd, var)) return true; + if (error_if_in_trans_or_substatement(thd, + ER_STORED_FUNCTION_PREVENTS_SWITCH_GTID_DOMAIN_ID_SEQ_NO, + ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_GTID_DOMAIN_ID_SEQ_NO)) + return true; + domain_id= thd->variables.gtid_domain_id; server_id= thd->variables.server_id; seq_no= (uint64)var->value->val_uint(); |