diff options
author | pem@mysql.comhem.se <> | 2005-05-18 11:07:57 +0200 |
---|---|---|
committer | pem@mysql.comhem.se <> | 2005-05-18 11:07:57 +0200 |
commit | 9472627b8a3e0cd130f1e85711c48659c0676496 (patch) | |
tree | 67a170c90033b6c1830ba103207e9ee41cec47e8 /sql/sp_rcontext.cc | |
parent | bacc512193d7ff2b66e6482a730ca8f84f6383a7 (diff) | |
download | mariadb-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.cc | 14 |
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 |