summaryrefslogtreecommitdiff
path: root/sql/sql_base.cc
diff options
context:
space:
mode:
authorMichael Widenius <monty@mariadb.org>2014-03-12 11:26:40 +0200
committerMichael Widenius <monty@mariadb.org>2014-03-12 11:26:40 +0200
commitf320b12ca52aa32e1a83130a1acbbba6496bb6f1 (patch)
tree5897482af38f74ff343506b7e3096fbf76b5594b /sql/sql_base.cc
parent49ca12a107d6a6f3e18729e6481090077b1f1bf8 (diff)
downloadmariadb-git-f320b12ca52aa32e1a83130a1acbbba6496bb6f1.tar.gz
MDEV-5619: CREATE OR REPLACE does not release MDL_EXCLUSIVE upon failure
mysql-test/r/create_or_replace.result: Added test of releasing of metadata locks mysql-test/t/create_or_replace.test: Added test of releasing of metadata locks sql/handler.h: Added marker if table was deleted as part of CREATE OR REPLACE sql/sql_base.cc: Added Locked_tables_list::unlock_locked_table() sql/sql_class.h: New prototypes sql/sql_insert.cc: Unlock metadata locks for deleted table in case of error. Also do unlock tables if this was the only locked table. sql/sql_table.cc: Unlock metadata locks for deleted table in case of error. Also do unlock tables if this was the only locked table.
Diffstat (limited to 'sql/sql_base.cc')
-rw-r--r--sql/sql_base.cc32
1 files changed, 32 insertions, 0 deletions
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 82f98e0604b..bb15562b8f8 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -2722,6 +2722,38 @@ Locked_tables_list::unlock_locked_tables(THD *thd)
reset();
}
+
+/**
+ Remove all meta data locks associated with table and release locked
+ table mode if there is no locked tables anymore
+*/
+
+void
+Locked_tables_list::unlock_locked_table(THD *thd, MDL_ticket *mdl_ticket)
+{
+ /*
+ Ensure we are in locked table mode.
+ As this function is only called on error condition it's better
+ to check this condition here than in the caller.
+ */
+ if (thd->locked_tables_mode != LTM_LOCK_TABLES)
+ return;
+
+ if (mdl_ticket)
+ {
+ /*
+ Under LOCK TABLES we may have several instances of table open
+ and locked and therefore have to remove several metadata lock
+ requests associated with them.
+ */
+ thd->mdl_context.release_all_locks_for_name(mdl_ticket);
+ }
+
+ if (thd->lock->table_count == 0)
+ unlock_locked_tables(thd);
+}
+
+
/*
Free memory allocated for storing locks
*/