summaryrefslogtreecommitdiff
path: root/sql/mdl.cc
diff options
context:
space:
mode:
authorKonstantin Osipov <kostja@sun.com>2009-12-09 19:11:26 +0300
committerKonstantin Osipov <kostja@sun.com>2009-12-09 19:11:26 +0300
commit634a81094288b9e47649ceed749d59af18a97e26 (patch)
treec76b279ab7dbe6cccd4dc8c504cb62672e9bf097 /sql/mdl.cc
parentb9d2f55a9d98c2a8fe4d67de51e7e7b84d2b7440 (diff)
downloadmariadb-git-634a81094288b9e47649ceed749d59af18a97e26.tar.gz
Backport of:
------------------------------------------------------------ revno: 2617.68.24 committer: Dmitry Lenev <dlenev@mysql.com> branch nick: mysql-next-bg-pre2-2 timestamp: Wed 2009-09-16 17:25:29 +0400 message: Pre-requisite patch for fixing bug #30977 "Concurrent statement using stored function and DROP FUNCTION breaks SBR". Added MDL_request for stored routine as member to Sroutine_hash_entry in order to be able perform metadata locking for stored routines in future (Sroutine_hash_entry is an equivalent of TABLE_LIST class for stored routines). (WL#4284, follow up fixes). sql/mdl.cc: Introduced version of MDL_request::init() method which initializes lock request using pre-built MDL key. MDL_key::table_name/table_name_length() getters were renamed to reflect the fact that MDL_key objects are now created not only for tables. sql/mdl.h: Extended enum_mdl_namespace enum with values which correspond to namespaces for stored functions and triggers. Renamed MDL_key::table_name/table_name_length() getters to MDL_key::name() and name_length() correspondingly to reflect the fact that MDL_key objects are now created not only for tables. Added MDL_key::mdl_namespace() getter. Also added version of MDL_request::init() method which initializes lock request using pre-built MDL key. sql/sp.cc: Added MDL_request for stored routine as member to Sroutine_hash_entry. Changed code to use MDL_key from this request as a key for LEX::sroutines set. Removed separate "key" member from Sroutine_hash_entry as it became unnecessary. sql/sp.h: Added MDL_request for stored routine as member to Sroutine_hash_entry in order to be able perform metadata locking for stored routines in future (Sroutine_hash_entry is an equivalent of TABLE_LIST class for stored routines). Removed Sroutine_hash_entry::key member as now we can use MDL_key from this request as a key for LEX::sroutines set. sql/sp_head.cc: Removed sp_name::m_sroutines_key member and set_routine_type() method. Since key for routine in LEX::sroutines set has no longer sp_name::m_qname as suffix we won't save anything by creating it at sp_name construction time. Adjusted sp_name constructor used for creating temporary objects for lookups in SP-cache to accept MDL_key as parameter and to avoid any memory allocation. Finally, removed sp_head::m_soutines_key member for reasons similar to why sp_name::m_sroutines_key was removed sql/sp_head.h: Removed sp_name::m_sroutines_key member and set_routine_type() method. Since key for routine in LEX::sroutines set has no longer sp_name::m_qname as suffix we won't save anything by creating it at sp_name construction time. Adjusted sp_name constructor used for creating temporary objects for lookups in SP-cache to accept MDL_key as parameter and to avoid any memory allocation. Finally, removed sp_head::m_soutines_key member for reasons similar to why sp_name::m_sroutines_key was removed. sql/sql_base.cc: Adjusted code to the fact that we now use MDL_key from Sroutine_hash_entry::mdl_request as a key for LEX::sroutines set. MDL_key::table_name/table_name_length() getters were renamed to reflect the fact that MDL_key objects are now created not only for tables. sql/sql_trigger.cc: sp_add_used_routine() now takes MDL_key as parameter as now we use instance of this class as a key for LEX::sroutines set.
Diffstat (limited to 'sql/mdl.cc')
-rw-r--r--sql/mdl.cc22
1 files changed, 20 insertions, 2 deletions
diff --git a/sql/mdl.cc b/sql/mdl.cc
index 879b12a4cac..5bda56193f5 100644
--- a/sql/mdl.cc
+++ b/sql/mdl.cc
@@ -319,6 +319,24 @@ void MDL_request::init(enum_mdl_namespace mdl_namespace,
/**
+ Initialize a lock request using pre-built MDL_key.
+
+ @sa MDL_request::init(namespace, db, name, type).
+
+ @param key_arg The pre-built MDL key for the request.
+ @param mdl_type_arg The MDL lock type for the request.
+*/
+
+void MDL_request::init(const MDL_key *key_arg,
+ enum enum_mdl_type mdl_type_arg)
+{
+ key.mdl_key_init(key_arg);
+ type= mdl_type_arg;
+ ticket= NULL;
+}
+
+
+/**
Allocate and initialize one lock request.
Same as mdl_init_lock(), but allocates the lock and the key buffer
@@ -1254,7 +1272,7 @@ void MDL_context::release_ticket(MDL_ticket *ticket)
MDL_lock *lock= ticket->m_lock;
DBUG_ENTER("release_ticket");
DBUG_PRINT("enter", ("db=%s name=%s", lock->key.db_name(),
- lock->key.table_name()));
+ lock->key.name()));
safe_mutex_assert_owner(&LOCK_mdl);
@@ -1526,7 +1544,7 @@ MDL_ticket::set_cached_object(void *cached_object,
{
DBUG_ENTER("mdl_set_cached_object");
DBUG_PRINT("enter", ("db=%s name=%s cached_object=%p",
- m_lock->key.db_name(), m_lock->key.table_name(),
+ m_lock->key.db_name(), m_lock->key.name(),
cached_object));
/*
TODO: This assumption works now since we do get_cached_object()