summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <andrey@example.com>2006-08-24 19:36:26 +0200
committerunknown <andrey@example.com>2006-08-24 19:36:26 +0200
commit807ecdf43ae2c5f35c2f350e67242580618ff9a8 (patch)
treef84fe784e59218f7367d88462af13869a343b1c3
parent965a3970c91dc4554a8ccbd3e358b1b2c20a0cfb (diff)
downloadmariadb-git-807ecdf43ae2c5f35c2f350e67242580618ff9a8.tar.gz
Fix for bug#21416 SP: Recursion level higher than zero needed for non-recursive call
The following procedure was not possible if max_sp_recursion_depth is 0 create procedure show_proc() show create procedure show_proc; Actually there is no recursive call but the limit is checked. Solved by temporarily increasing the thread's limit just before the fetch from cache and decreasing after that. mysql-test/r/sp.result: update result mysql-test/t/sp.test: Test for bug #21416 SP: Recursion level higher than zero needed for non-recursive call sql/sp.cc: Increase the max_sp_recursion_depth temporarily for SHOW CREATE PROCEDURE call. This call is in fact not recursive but is counted as such. Outcome, it will work always but if max_sp_recursion_depth is reached we are going to cache one more sp_head instance.
-rw-r--r--mysql-test/r/sp.result7
-rw-r--r--mysql-test/t/sp.test10
-rw-r--r--sql/sp.cc21
3 files changed, 32 insertions, 6 deletions
diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result
index d4c77bc47e5..854935b071b 100644
--- a/mysql-test/r/sp.result
+++ b/mysql-test/r/sp.result
@@ -5387,4 +5387,11 @@ BEGIN
RETURN 1;
END|
ERROR HY000: String '1234567890abcdefghij1234567890abcdefghij1234567890abcdefghijQWERTY' is too long for host name (should be no longer than 60)
+drop procedure if exists bug21416|
+create procedure bug21416() show create procedure bug21416|
+call bug21416()|
+Procedure sql_mode Create Procedure
+bug21416 CREATE DEFINER=`root`@`localhost` PROCEDURE `bug21416`()
+show create procedure bug21416
+drop procedure bug21416|
drop table t1,t2;
diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test
index bf255bf631a..4b0f463a9e3 100644
--- a/mysql-test/t/sp.test
+++ b/mysql-test/t/sp.test
@@ -6313,6 +6313,16 @@ END|
#
+# BUG#21416: SP: Recursion level higher than zero needed for non-recursive call
+#
+--disable_warnings
+drop procedure if exists bug21416|
+--enable_warnings
+create procedure bug21416() show create procedure bug21416|
+call bug21416()|
+drop procedure bug21416|
+
+#
# BUG#NNNN: New bug synopsis
#
#--disable_warnings
diff --git a/sql/sp.cc b/sql/sp.cc
index b7bf049cb1d..fc72822c15e 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -1006,6 +1006,12 @@ sp_find_routine(THD *thd, int type, sp_name *name, sp_cache **cp,
}
DBUG_RETURN(sp->m_first_free_instance);
}
+ /*
+ Actually depth could be +1 than the actual value in case a SP calls
+ SHOW CREATE PROCEDURE. Hence, the linked list could hold up to one more
+ instance.
+ */
+
level= sp->m_last_cached_sp->m_recursion_level + 1;
if (level > depth)
{
@@ -1175,19 +1181,22 @@ sp_update_procedure(THD *thd, sp_name *name, st_sp_chistics *chistics)
int
sp_show_create_procedure(THD *thd, sp_name *name)
{
+ int ret= SP_KEY_NOT_FOUND;
sp_head *sp;
DBUG_ENTER("sp_show_create_procedure");
DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str));
+ /*
+ Increase the recursion limit for this statement. SHOW CREATE PROCEDURE
+ does not do actual recursion.
+ */
+ thd->variables.max_sp_recursion_depth++;
if ((sp= sp_find_routine(thd, TYPE_ENUM_PROCEDURE, name,
&thd->sp_proc_cache, FALSE)))
- {
- int ret= sp->show_create_procedure(thd);
+ ret= sp->show_create_procedure(thd);
- DBUG_RETURN(ret);
- }
-
- DBUG_RETURN(SP_KEY_NOT_FOUND);
+ thd->variables.max_sp_recursion_depth--;
+ DBUG_RETURN(ret);
}