Commit b0928683 authored by unknown's avatar unknown

Fix BUG#2269: Lost connect if stored procedure called before USE

(And some minor correction of cursor open)


sql/sp_head.cc:
  Detect some errors that doesn't result in a non-zero return code in
  the SP execution loop.
  (Also corrected the cursor post_open() call.)
sql/sp_rcontext.cc:
  Corrected the semantics of cursor post_open().
sql/sp_rcontext.h:
  Corrected the semantics of cursor post_open().
parent 03b652cf
...@@ -286,6 +286,7 @@ sp_head::execute(THD *thd) ...@@ -286,6 +286,7 @@ sp_head::execute(THD *thd)
if (ctx) if (ctx)
ctx->clear_handler(); ctx->clear_handler();
thd->query_error= 0;
do do
{ {
sp_instr *i; sp_instr *i;
...@@ -318,10 +319,11 @@ sp_head::execute(THD *thd) ...@@ -318,10 +319,11 @@ sp_head::execute(THD *thd)
continue; continue;
} }
} }
} while (ret == 0 && !thd->killed); } while (ret == 0 && !thd->killed && !thd->query_error);
DBUG_PRINT("info", ("ret=%d killed=%d", ret, thd->killed)); DBUG_PRINT("info", ("ret=%d killed=%d query_error=%d",
if (thd->killed) ret, thd->killed, thd->query_error));
if (thd->killed || thd->query_error)
ret= -1; ret= -1;
/* If the DB has changed, the pointer has changed too, but the /* If the DB has changed, the pointer has changed too, but the
original thd->db will then have been freed */ original thd->db will then have been freed */
...@@ -1032,7 +1034,7 @@ sp_instr_copen::execute(THD *thd, uint *nextp) ...@@ -1032,7 +1034,7 @@ sp_instr_copen::execute(THD *thd, uint *nextp)
res= -1; res= -1;
else else
res= exec_stmt(thd, lex); res= exec_stmt(thd, lex);
c->post_open(thd, (res == 0 ? TRUE : FALSE)); c->post_open(thd, (lex ? TRUE : FALSE));
} }
*nextp= m_ip+1; *nextp= m_ip+1;
......
...@@ -153,12 +153,15 @@ sp_cursor::pre_open(THD *thd) ...@@ -153,12 +153,15 @@ sp_cursor::pre_open(THD *thd)
} }
void void
sp_cursor::post_open(THD *thd, my_bool isopen) sp_cursor::post_open(THD *thd, my_bool was_opened)
{ {
thd->net.no_send_eof= m_nseof; // Restore the originals thd->net.no_send_eof= m_nseof; // Restore the originals
thd->protocol= m_oprot; thd->protocol= m_oprot;
m_isopen= isopen; if (was_opened)
m_current_row= m_prot->data; {
m_isopen= was_opened;
m_current_row= m_prot->data;
}
} }
int int
......
...@@ -220,7 +220,7 @@ public: ...@@ -220,7 +220,7 @@ public:
LEX * LEX *
pre_open(THD *thd); pre_open(THD *thd);
void void
post_open(THD *thd, my_bool isopen); post_open(THD *thd, my_bool was_opened);
int int
close(THD *thd); close(THD *thd);
......
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