mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
A pre-requisite patch for the fix for Bug#52044.
This patch also fixes Bug#55452 "SET PASSWORD is replicated twice in RBR mode". The goal of this patch is to remove the release of metadata locks from close_thread_tables(). This is necessary to not mistakenly release the locks in the course of a multi-step operation that involves multiple close_thread_tables() or close_tables_for_reopen(). On the same token, move statement commit outside close_thread_tables(). Other cleanups: Cleanup COM_FIELD_LIST. Don't call close_thread_tables() in COM_SHUTDOWN -- there are no open tables there that can be closed (we leave the locked tables mode in THD destructor, and this close_thread_tables() won't leave it anyway). Make open_and_lock_tables() and open_and_lock_tables_derived() call close_thread_tables() upon failure. Remove the calls to close_thread_tables() that are now unnecessary. Simplify the back off condition in Open_table_context. Streamline metadata lock handling in LOCK TABLES implementation. Add asserts to ensure correct life cycle of statement transaction in a session. Remove a piece of dead code that has also become redundant after the fix for Bug 37521.
This commit is contained in:
@ -2203,14 +2203,21 @@ static bool fix_autocommit(sys_var *self, THD *thd, enum_var_type type)
|
||||
thd->variables.option_bits & OPTION_NOT_AUTOCOMMIT)
|
||||
{ // activating autocommit
|
||||
|
||||
if (trans_commit(thd))
|
||||
if (trans_commit_stmt(thd) || trans_commit(thd))
|
||||
{
|
||||
thd->variables.option_bits&= ~OPTION_AUTOCOMMIT;
|
||||
return true;
|
||||
}
|
||||
close_thread_tables(thd);
|
||||
thd->mdl_context.release_transactional_locks();
|
||||
|
||||
/*
|
||||
Don't close thread tables or release metadata locks: if we do so, we
|
||||
risk releasing locks/closing tables of expressions used to assign
|
||||
other variables, as in:
|
||||
set @var=my_stored_function1(), @@autocommit=1, @var2=(select max(a)
|
||||
from my_table), ...
|
||||
The locks will be released at statement end anyway, as SET
|
||||
statement that assigns autocommit is marked to commit
|
||||
transaction implicitly at the end (@sa stmt_causes_implicitcommit()).
|
||||
*/
|
||||
thd->variables.option_bits&=
|
||||
~(OPTION_BEGIN | OPTION_KEEP_LOG | OPTION_NOT_AUTOCOMMIT);
|
||||
thd->transaction.all.modified_non_trans_table= false;
|
||||
|
Reference in New Issue
Block a user