summaryrefslogtreecommitdiff
path: root/sql/sp_rcontext.cc
diff options
context:
space:
mode:
authorpem@mysql.comhem.se <>2005-05-18 11:07:57 +0200
committerpem@mysql.comhem.se <>2005-05-18 11:07:57 +0200
commit9472627b8a3e0cd130f1e85711c48659c0676496 (patch)
tree67a170c90033b6c1830ba103207e9ee41cec47e8 /sql/sp_rcontext.cc
parentbacc512193d7ff2b66e6482a730ca8f84f6383a7 (diff)
downloadmariadb-git-9472627b8a3e0cd130f1e85711c48659c0676496.tar.gz
Fixed BUG#6048: Stored procedure causes operating system reboot.
Memory leak in locally evalutated expressions during SP execution fixed by reusing allocated item slots when possible. Note: No test case added, since the test is a stress test that tries to make the machine to run out of memory.
Diffstat (limited to 'sql/sp_rcontext.cc')
-rw-r--r--sql/sp_rcontext.cc14
1 files changed, 11 insertions, 3 deletions
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc
index 672491a97f2..fdffa7fb88d 100644
--- a/sql/sp_rcontext.cc
+++ b/sql/sp_rcontext.cc
@@ -43,8 +43,11 @@ sp_rcontext::sp_rcontext(uint fsize, uint hmax, uint cmax)
int
sp_rcontext::set_item_eval(uint idx, Item **item_addr, enum_field_types type)
{
- extern Item *sp_eval_func_item(THD *thd, Item **it, enum_field_types type);
- Item *it= sp_eval_func_item(current_thd, item_addr, type);
+ extern Item *sp_eval_func_item(THD *thd, Item **it, enum_field_types type,
+ MEM_ROOT *mem_root,
+ Item *reuse);
+ THD *thd= current_thd;
+ Item *it= sp_eval_func_item(thd, item_addr, type, thd->mem_root, NULL);
if (! it)
return -1;
@@ -111,7 +114,12 @@ void
sp_rcontext::save_variables(uint fp)
{
while (fp < m_count)
- m_saved.push_front(m_frame[fp++]);
+ {
+ Item *it= m_frame[fp];
+
+ m_frame[fp++]= NULL; // Prevent reuse
+ m_saved.push_front(it);
+ }
}
void