diff options
author | Sergei Golubchik <sergii@pisem.net> | 2013-11-20 09:20:48 +0100 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2013-11-20 09:20:48 +0100 |
commit | 45f81d4dcfb1d24787af1a003a8cee073a8e09d0 (patch) | |
tree | e7cb0c3ffa93a365f5a582261c293732474c75d9 /sql/sql_prepare.cc | |
parent | bc956c004622700d907af290a24fec7931b04fd3 (diff) | |
parent | af2848a4237b94f783f275b29c590d5318c4b375 (diff) | |
download | mariadb-git-45f81d4dcfb1d24787af1a003a8cee073a8e09d0.tar.gz |
merge
Diffstat (limited to 'sql/sql_prepare.cc')
-rw-r--r-- | sql/sql_prepare.cc | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 0446e8bf18c..ad1e291a9d7 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2002, 2012, Oracle and/or its affiliates. - Copyright (c) 2008, 2011, Monty Program Ab +/* Copyright (c) 2002, 2013, Oracle and/or its affiliates. + Copyright (c) 2008, 2013, Monty Program Ab This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -115,6 +115,7 @@ When one supplies long data for a placeholder: #endif #include "lock.h" // MYSQL_OPEN_FORCE_SHARED_MDL #include "sql_handler.h" +#include "transaction.h" // trans_rollback_implicit /** A result class used to send cursor rows using the binary protocol. @@ -3399,6 +3400,22 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) close_thread_tables(thd); thd->mdl_context.rollback_to_savepoint(mdl_savepoint); + + /* + Transaction rollback was requested since MDL deadlock was discovered + while trying to open tables. Rollback transaction in all storage + engines including binary log and release all locks. + + Once dynamic SQL is allowed as substatements the below if-statement + has to be adjusted to not do rollback in substatement. + */ + DBUG_ASSERT(! thd->in_sub_stmt); + if (thd->transaction_rollback_request) + { + trans_rollback_implicit(thd); + thd->mdl_context.release_transactional_locks(); + } + lex_end(lex); cleanup_stmt(); thd->restore_backup_statement(this, &stmt_backup); |