Commit 708ba733 authored by Alexey Botchkov's avatar Alexey Botchkov

MDEV-5138 Numerous test failures in "mtr --ps --embedded".

     If a prepared statement calls an stored procedure,
     the thd->server_status out of the SP goes up
     to the PS and then to the client. So that the
     client gets the SERVER_STATUS_CURSOR_EXISTS status
     if the SP uses a cursor. Which makes the embedded
     server fail.
     Fixed by saving/restoring the upper-level server_status
     in sp_head::execute().
parent 9d32b8b2
...@@ -1223,6 +1223,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success) ...@@ -1223,6 +1223,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success)
LEX *old_lex; LEX *old_lex;
Item_change_list old_change_list; Item_change_list old_change_list;
String old_packet; String old_packet;
uint old_server_status;
Reprepare_observer *save_reprepare_observer= thd->m_reprepare_observer; Reprepare_observer *save_reprepare_observer= thd->m_reprepare_observer;
Object_creation_ctx *saved_creation_ctx; Object_creation_ctx *saved_creation_ctx;
Warning_info *saved_warning_info; Warning_info *saved_warning_info;
...@@ -1357,6 +1358,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success) ...@@ -1357,6 +1358,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success)
It is probably safe to use same thd->convert_buff everywhere. It is probably safe to use same thd->convert_buff everywhere.
*/ */
old_packet.swap(thd->packet); old_packet.swap(thd->packet);
old_server_status= thd->server_status;
/* /*
Switch to per-instruction arena here. We can do it since we cleanup Switch to per-instruction arena here. We can do it since we cleanup
...@@ -1486,6 +1488,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success) ...@@ -1486,6 +1488,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success)
thd->spcont->pop_all_cursors(); // To avoid memory leaks after an error thd->spcont->pop_all_cursors(); // To avoid memory leaks after an error
/* Restore all saved */ /* Restore all saved */
thd->server_status= old_server_status;
old_packet.swap(thd->packet); old_packet.swap(thd->packet);
DBUG_ASSERT(thd->change_list.is_empty()); DBUG_ASSERT(thd->change_list.is_empty());
old_change_list.move_elements_to(&thd->change_list); old_change_list.move_elements_to(&thd->change_list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment