summaryrefslogtreecommitdiff
path: root/sql/sp_head.cc
diff options
context:
space:
mode:
authorDmitry Shulga <Dmitry.Shulga@Sun.COM>2010-10-07 18:57:12 +0700
committerDmitry Shulga <Dmitry.Shulga@Sun.COM>2010-10-07 18:57:12 +0700
commit60d558d89d35664faf48ddc3eb4c95d0c39014f7 (patch)
tree65fecb4b3f4f3a6b02eb7c5a4539613c9cad2f47 /sql/sp_head.cc
parenta5efb91deaf8a9c3bf53cd82ebd574be0cdabc5d (diff)
downloadmariadb-git-60d558d89d35664faf48ddc3eb4c95d0c39014f7.tar.gz
Fixed bug#45445 - cannot execute procedures with thread_stack
set to 128k. mysql-test/collections/default.experimental: Re-enabled test rpl.rpl_row_sp011*. sql/sp_head.cc: sp_head::execute() modified: pass constant value 2 * STACK_MIN_SIZE instead of 8 * STACK_MIN_SIZE as a second argument value in call to check_stack_overrun.
Diffstat (limited to 'sql/sp_head.cc')
-rw-r--r--sql/sp_head.cc23
1 files changed, 21 insertions, 2 deletions
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index a95bbe094c0..e25b10957ac 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -1213,8 +1213,27 @@ sp_head::execute(THD *thd)
Object_creation_ctx *saved_creation_ctx;
Warning_info *saved_warning_info, warning_info(thd->warning_info->warn_id());
- /* Use some extra margin for possible SP recursion and functions */
- if (check_stack_overrun(thd, 8 * STACK_MIN_SIZE, (uchar*)&old_packet))
+ /*
+ Just reporting a stack overrun error
+ (@sa check_stack_overrun()) requires stack memory for error
+ message buffer. Thus, we have to put the below check
+ relatively close to the beginning of the execution stack,
+ where available stack margin is still big. As long as the check
+ has to be fairly high up the call stack, the amount of memory
+ we "book" for has to stay fairly high as well, and hence
+ not very accurate. The number below has been calculated
+ by trial and error, and reflects the amount of memory necessary
+ to execute a single stored procedure instruction, be it either
+ an SQL statement, or, heaviest of all, a CALL, which involves
+ parsing and loading of another stored procedure into the cache
+ (@sa db_load_routine() and Bug#10100).
+ At the time of measuring, a recursive SP invocation required
+ 3232 bytes of stack on 32 bit Linux and 6016 bytes on 64 bit Mac.
+ The same with db_load_routine() required circa 7k bytes and
+ 14k bytes accordingly. Hence, here we book the stack with some
+ reasonable margin.
+ */
+ if (check_stack_overrun(thd, 2 * STACK_MIN_SIZE, (uchar*)&old_packet))
DBUG_RETURN(TRUE);
/* init per-instruction memroot */