diff options
author | Dmitry Shulga <Dmitry.Shulga@Sun.COM> | 2010-10-07 18:57:12 +0700 |
---|---|---|
committer | Dmitry Shulga <Dmitry.Shulga@Sun.COM> | 2010-10-07 18:57:12 +0700 |
commit | 60d558d89d35664faf48ddc3eb4c95d0c39014f7 (patch) | |
tree | 65fecb4b3f4f3a6b02eb7c5a4539613c9cad2f47 /sql/sp_head.cc | |
parent | a5efb91deaf8a9c3bf53cd82ebd574be0cdabc5d (diff) | |
download | mariadb-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.cc | 23 |
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 */ |