diff options
author | Konstantin Osipov <kostja@sun.com> | 2009-12-03 14:47:05 +0300 |
---|---|---|
committer | Konstantin Osipov <kostja@sun.com> | 2009-12-03 14:47:05 +0300 |
commit | 37edcc7e26ba924fd516a85c855e6d37859e6d47 (patch) | |
tree | 9704773c054e8f824821d0386623b71e6693c306 /sql/sp.cc | |
parent | 0f9c02d49a52c9faacb328649f9eab23b2d93a6b (diff) | |
download | mariadb-git-37edcc7e26ba924fd516a85c855e6d37859e6d47.tar.gz |
Backport of:
----------------------------------------------------------
revno: 2630.2.7
committer: Konstantin Osipov <konstantin@mysql.com>
branch nick: mysql-6.0-runtime
timestamp: Wed 2008-06-04 15:18:52 +0400
message:
Fix a code regression (not observable externally) that I introduced
in the fix for Bug#26141
(backporting as part of all patches related to WL#3726)
Diffstat (limited to 'sql/sp.cc')
-rw-r--r-- | sql/sp.cc | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/sql/sp.cc b/sql/sp.cc index f6bfba71726..e6999b480f2 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -1693,6 +1693,12 @@ sp_cache_routines_and_add_tables_aux(THD *thd, LEX *lex, int type= rt->key.str[0]; sp_head *sp; + /* + Triggers can't happen here: their bodies are always processed + in sp_cache_routines_and_add_tables_for_triggers(). + */ + DBUG_ASSERT(type == TYPE_ENUM_FUNCTION || type == TYPE_ENUM_PROCEDURE); + if (!(sp= sp_cache_lookup((type == TYPE_ENUM_FUNCTION ? &thd->sp_func_cache : &thd->sp_proc_cache), &name))) @@ -1836,11 +1842,6 @@ int sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex, TABLE_LIST *table) { - int ret= 0; - - Sroutine_hash_entry **last_cached_routine_ptr= - (Sroutine_hash_entry **)lex->sroutines_list.next; - if (static_cast<int>(table->lock_type) >= static_cast<int>(TL_WRITE_ALLOW_WRITE)) { @@ -1857,21 +1858,29 @@ sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex, add_used_routine(lex, thd->stmt_arena, &trigger->m_sroutines_key, table->belong_to_view)) { + int ret; + /* Sic: excludes the trigger key from processing */ + Sroutine_hash_entry **last_cached_routine_ptr= + (Sroutine_hash_entry **)lex->sroutines_list.next; + trigger->add_used_tables_to_table_list(thd, &lex->query_tables_last, table->belong_to_view); trigger->propagate_attributes(lex); sp_update_stmt_used_routines(thd, lex, &trigger->m_sroutines, table->belong_to_view); + + ret= sp_cache_routines_and_add_tables_aux(thd, lex, + *last_cached_routine_ptr, + FALSE); + if (ret) + return ret; } } } } } - ret= sp_cache_routines_and_add_tables_aux(thd, lex, - *last_cached_routine_ptr, - FALSE); - return ret; + return 0; } |