summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/sp.cc85
-rw-r--r--sql/sp.h9
-rw-r--r--sql/sp_head.cc14
-rw-r--r--sql/sp_head.h3
-rw-r--r--sql/sql_base.cc5
-rw-r--r--sql/sql_trigger.h2
6 files changed, 72 insertions, 46 deletions
diff --git a/sql/sp.cc b/sql/sp.cc
index debd3121058..d5b93f0d2f2 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -1199,6 +1199,12 @@ struct Sroutine_hash_entry
for LEX::sroutine/sroutine_list and sp_head::m_sroutines.
*/
Sroutine_hash_entry *next;
+ /*
+ Uppermost view which directly or indirectly uses this routine.
+ 0 if routine is not used in view. Note that it also can be 0 if
+ statement uses routine both via view and directly.
+ */
+ TABLE_LIST *belong_to_view;
};
@@ -1253,9 +1259,11 @@ void sp_get_prelocking_info(THD *thd, bool *need_prelocking,
SYNOPSIS
add_used_routine()
- lex - LEX representing statement
- arena - arena in which memory for new element will be allocated
- key - key for the hash representing set
+ lex LEX representing statement
+ arena Arena in which memory for new element will be allocated
+ key Key for the hash representing set
+ belong_to_view Uppermost view which uses this routine
+ (0 if routine is not used by view)
NOTES
Will also add element to end of 'LEX::sroutines_list' list.
@@ -1278,7 +1286,8 @@ void sp_get_prelocking_info(THD *thd, bool *need_prelocking,
*/
static bool add_used_routine(LEX *lex, Query_arena *arena,
- const LEX_STRING *key)
+ const LEX_STRING *key,
+ TABLE_LIST *belong_to_view)
{
if (!hash_search(&lex->sroutines, (byte *)key->str, key->length))
{
@@ -1292,6 +1301,7 @@ static bool add_used_routine(LEX *lex, Query_arena *arena,
memcpy(rn->key.str, key->str, key->length);
my_hash_insert(&lex->sroutines, (byte *)rn);
lex->sroutines_list.link_in_list((byte *)rn, (byte **)&rn->next);
+ rn->belong_to_view= belong_to_view;
return TRUE;
}
return FALSE;
@@ -1322,7 +1332,7 @@ void sp_add_used_routine(LEX *lex, Query_arena *arena,
sp_name *rt, char rt_type)
{
rt->set_routine_type(rt_type);
- (void)add_used_routine(lex, arena, &rt->m_sroutines_key);
+ (void)add_used_routine(lex, arena, &rt->m_sroutines_key, 0);
lex->sroutines_list_own_last= lex->sroutines_list.next;
lex->sroutines_list_own_elements= lex->sroutines_list.elements;
}
@@ -1392,20 +1402,23 @@ void sp_update_sp_used_routines(HASH *dst, HASH *src)
SYNOPSIS
sp_update_stmt_used_routines()
- thd - thread context
- lex - LEX representing statement
- src - hash representing set from which routines will be added
+ thd Thread context
+ lex LEX representing statement
+ src Hash representing set from which routines will be added
+ belong_to_view Uppermost view which uses these routines, 0 if none
NOTE
It will also add elements to end of 'LEX::sroutines_list' list.
*/
-static void sp_update_stmt_used_routines(THD *thd, LEX *lex, HASH *src)
+static void
+sp_update_stmt_used_routines(THD *thd, LEX *lex, HASH *src,
+ TABLE_LIST *belong_to_view)
{
for (uint i=0 ; i < src->records ; i++)
{
Sroutine_hash_entry *rt= (Sroutine_hash_entry *)hash_element(src, i);
- (void)add_used_routine(lex, thd->stmt_arena, &rt->key);
+ (void)add_used_routine(lex, thd->stmt_arena, &rt->key, belong_to_view);
}
}
@@ -1416,19 +1429,21 @@ static void sp_update_stmt_used_routines(THD *thd, LEX *lex, HASH *src)
SYNOPSIS
sp_update_stmt_used_routines()
- thd Thread context
- lex LEX representing statement
- src List representing set from which routines will be added
+ thd Thread context
+ lex LEX representing statement
+ src List representing set from which routines will be added
+ belong_to_view Uppermost view which uses these routines, 0 if none
NOTE
It will also add elements to end of 'LEX::sroutines_list' list.
*/
-static void sp_update_stmt_used_routines(THD *thd, LEX *lex, SQL_LIST *src)
+static void sp_update_stmt_used_routines(THD *thd, LEX *lex, SQL_LIST *src,
+ TABLE_LIST *belong_to_view)
{
for (Sroutine_hash_entry *rt= (Sroutine_hash_entry *)src->first;
rt; rt= rt->next)
- (void)add_used_routine(lex, thd->stmt_arena, &rt->key);
+ (void)add_used_routine(lex, thd->stmt_arena, &rt->key, belong_to_view);
}
@@ -1533,9 +1548,11 @@ sp_cache_routines_and_add_tables_aux(THD *thd, LEX *lex,
{
if (!(first && first_no_prelock))
{
- sp_update_stmt_used_routines(thd, lex, &sp->m_sroutines);
+ sp_update_stmt_used_routines(thd, lex, &sp->m_sroutines,
+ rt->belong_to_view);
tabschnd|=
- sp->add_used_tables_to_table_list(thd, &lex->query_tables_last);
+ sp->add_used_tables_to_table_list(thd, &lex->query_tables_last,
+ rt->belong_to_view);
}
}
first= FALSE;
@@ -1581,21 +1598,22 @@ sp_cache_routines_and_add_tables(THD *thd, LEX *lex, bool first_no_prelock,
SYNOPSIS
sp_cache_routines_and_add_tables_for_view()
- thd - thread context
- lex - LEX representing statement
- aux_lex - LEX representing view
-
+ thd Thread context
+ lex LEX representing statement
+ view Table list element representing view
+
RETURN VALUE
0 - success
non-0 - failure
*/
int
-sp_cache_routines_and_add_tables_for_view(THD *thd, LEX *lex, LEX *aux_lex)
+sp_cache_routines_and_add_tables_for_view(THD *thd, LEX *lex, TABLE_LIST *view)
{
Sroutine_hash_entry **last_cached_routine_ptr=
(Sroutine_hash_entry **)lex->sroutines_list.next;
- sp_update_stmt_used_routines(thd, lex, &aux_lex->sroutines_list);
+ sp_update_stmt_used_routines(thd, lex, &view->view->sroutines_list,
+ view->top_table());
return sp_cache_routines_and_add_tables_aux(thd, lex,
*last_cached_routine_ptr, FALSE,
NULL);
@@ -1609,9 +1627,9 @@ sp_cache_routines_and_add_tables_for_view(THD *thd, LEX *lex, LEX *aux_lex)
SYNOPSIS
sp_cache_routines_and_add_tables_for_triggers()
- thd - thread context
- lex - LEX respresenting statement
- triggers - triggers of the table
+ thd thread context
+ lex LEX respresenting statement
+ table Table list element for table with trigger
RETURN VALUE
0 - success
@@ -1620,11 +1638,12 @@ sp_cache_routines_and_add_tables_for_view(THD *thd, LEX *lex, LEX *aux_lex)
int
sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
- Table_triggers_list *triggers)
+ TABLE_LIST *table)
{
int ret= 0;
-
- if (add_used_routine(lex, thd->stmt_arena, &triggers->sroutines_key))
+ Table_triggers_list *triggers= table->table->triggers;
+ if (add_used_routine(lex, thd->stmt_arena, &triggers->sroutines_key,
+ table->belong_to_view))
{
Sroutine_hash_entry **last_cached_routine_ptr=
(Sroutine_hash_entry **)lex->sroutines_list.next;
@@ -1634,10 +1653,12 @@ sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
{
if (triggers->bodies[i][j])
{
- (void)triggers->bodies[i][j]->add_used_tables_to_table_list(thd,
- &lex->query_tables_last);
+ (void)triggers->bodies[i][j]->
+ add_used_tables_to_table_list(thd, &lex->query_tables_last,
+ table->belong_to_view);
sp_update_stmt_used_routines(thd, lex,
- &triggers->bodies[i][j]->m_sroutines);
+ &triggers->bodies[i][j]->m_sroutines,
+ table->belong_to_view);
}
}
}
diff --git a/sql/sp.h b/sql/sp.h
index 235eb5cba37..53343e0fb25 100644
--- a/sql/sp.h
+++ b/sql/sp.h
@@ -84,12 +84,13 @@ void sp_add_used_routine(LEX *lex, Query_arena *arena,
sp_name *rt, char rt_type);
void sp_remove_not_own_routines(LEX *lex);
void sp_update_sp_used_routines(HASH *dst, HASH *src);
-int sp_cache_routines_and_add_tables(THD *thd, LEX *lex,
- bool first_no_prelock, bool *tabs_changed);
+int sp_cache_routines_and_add_tables(THD *thd, LEX *lex,
+ bool first_no_prelock,
+ bool *tabs_changed);
int sp_cache_routines_and_add_tables_for_view(THD *thd, LEX *lex,
- LEX *aux_lex);
+ TABLE_LIST *view);
int sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
- Table_triggers_list *triggers);
+ TABLE_LIST *table);
extern "C" byte* sp_sroutine_key(const byte *ptr, uint *plen, my_bool first);
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index cc847a0134c..d1f1115ee4e 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -3238,10 +3238,12 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check)
SYNOPSIS
add_used_tables_to_table_list()
- thd - thread context
- query_tables_last_ptr - (in/out) pointer the next_global member of last
- element of the list where tables will be added
- (or to its root).
+ thd [in] Thread context
+ query_tables_last_ptr [in/out] Pointer to the next_global member of
+ last element of the list where tables
+ will be added (or to its root).
+ belong_to_view [in] Uppermost view which uses this routine,
+ 0 if none.
DESCRIPTION
Converts multi-set of tables used by this routine to table list and adds
@@ -3256,7 +3258,8 @@ sp_head::merge_table_list(THD *thd, TABLE_LIST *table, LEX *lex_for_tmp_check)
bool
sp_head::add_used_tables_to_table_list(THD *thd,
- TABLE_LIST ***query_tables_last_ptr)
+ TABLE_LIST ***query_tables_last_ptr,
+ TABLE_LIST *belong_to_view)
{
uint i;
Query_arena *arena, backup;
@@ -3299,6 +3302,7 @@ sp_head::add_used_tables_to_table_list(THD *thd,
table->lock_type= stab->lock_type;
table->cacheable_table= 1;
table->prelocking_placeholder= 1;
+ table->belong_to_view= belong_to_view;
/* Everyting else should be zeroed */
diff --git a/sql/sp_head.h b/sql/sp_head.h
index 398beb2d1f2..ad747b3466f 100644
--- a/sql/sp_head.h
+++ b/sql/sp_head.h
@@ -310,7 +310,8 @@ public:
/* Add tables used by routine to the table list. */
bool add_used_tables_to_table_list(THD *thd,
- TABLE_LIST ***query_tables_last_ptr);
+ TABLE_LIST ***query_tables_last_ptr,
+ TABLE_LIST *belong_to_view);
/*
Check if this stored routine contains statements disallowed
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 0e1c1525c9e..5378f619110 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -2128,7 +2128,7 @@ int open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags)
if (!query_tables_last_own)
query_tables_last_own= thd->lex->query_tables_last;
if (sp_cache_routines_and_add_tables_for_triggers(thd, thd->lex,
- tables->table->triggers))
+ tables))
{
/*
Serious error during reading stored routines from mysql.proc table.
@@ -2158,8 +2158,7 @@ process_view_routines:
/* We have at least one table in TL here. */
if (!query_tables_last_own)
query_tables_last_own= thd->lex->query_tables_last;
- if (sp_cache_routines_and_add_tables_for_view(thd, thd->lex,
- tables->view))
+ if (sp_cache_routines_and_add_tables_for_view(thd, thd->lex, tables))
{
/*
Serious error during reading stored routines from mysql.proc table.
diff --git a/sql/sql_trigger.h b/sql/sql_trigger.h
index 143f9f4d5bd..51002683897 100644
--- a/sql/sql_trigger.h
+++ b/sql/sql_trigger.h
@@ -118,7 +118,7 @@ public:
friend class Item_trigger_field;
friend int sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
- Table_triggers_list *triggers);
+ TABLE_LIST *table);
private:
bool prepare_record1_accessors(TABLE *table);