diff options
author | unknown <pem@mysql.com> | 2006-04-11 12:17:57 +0200 |
---|---|---|
committer | unknown <pem@mysql.com> | 2006-04-11 12:17:57 +0200 |
commit | 9381c8a0896bcb67ce9be44463456313d485ad00 (patch) | |
tree | c228a8c6c4b9e239c5d4b7467900a97fba73cb91 /sql/item_func.cc | |
parent | daac388624f52f9d95c43d186e9a759ff15fff18 (diff) | |
download | mariadb-git-9381c8a0896bcb67ce9be44463456313d485ad00.tar.gz |
Fixed BUG#18787: Server crashed when calling a stored procedure containing
a misnamed function
... in the presence of a continue handler. The problem was that with a
handler, it continued to execute as if function existed and had set a
useful return value (which it hadn't).
The fix is to set a null return value and do an error return when a function
wasn't found.
mysql-test/r/sp.result:
Updated results for a new test case (BUG#18787).
mysql-test/t/sp.test:
New testcase for BUG#18787.
sql/item_func.cc:
Don't set "out of resources" error in Item_func_sp::execute() if no
result field is returned, it's simply wrong, it can be sometthing else,
like a function not found. Instead set null_value and return error.
Also, set "out of resources" when field creation fails in
Item_func_sp::sp_result_field() and Item_func_sp::tmp_table_field().
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r-- | sql/item_func.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index f40f868f75f..8d30fafbe63 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -4722,7 +4722,9 @@ Item_func_sp::sp_result_field(void) const share->table_cache_key = empty_name; share->table_name = empty_name; } - field= m_sp->create_result_field(max_length, name, dummy_table); + if (!(field= m_sp->create_result_field(max_length, name, dummy_table))) + my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); + DBUG_RETURN(field); } @@ -4750,8 +4752,9 @@ Item_func_sp::execute(Field **flp) { if (!(*flp= f= sp_result_field())) { - my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); - return 0; + /* Error set by sp_result_field() */ + null_value= 1; + return TRUE; } f->move_field((f->pack_length() > sizeof(result_buf)) ? @@ -4915,6 +4918,9 @@ Item_func_sp::tmp_table_field(TABLE *t_arg) if (!res) res= Item_func::tmp_table_field(t_arg); + if (!res) + my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0)); + DBUG_RETURN(res); } |