Commit 8d3a432f authored by Sergei Petrunia's avatar Sergei Petrunia

MDEV-6575: main.view --ps-protocol fails in ANALYZE code

- After PREPARE is done, save the value of thd->select_number
  (this is what will be assigned to next select_lex object)
- Restore the value at each execution of the prepared statement.
parent 2062c9a6
...@@ -160,6 +160,20 @@ class Prepared_statement: public Statement ...@@ -160,6 +160,20 @@ class Prepared_statement: public Statement
uint param_count; uint param_count;
uint last_errno; uint last_errno;
uint flags; uint flags;
/*
The value of thd->select_number at the end of the PREPARE phase.
The issue is: each statement execution opens VIEWs, which may cause
select_lex objects to be created, and select_number values to be assigned.
On the other hand, PREPARE assigns select_number values for triggers and
subqueries.
In order for select_number values from EXECUTE not to conflict with
select_number values from PREPARE, we keep the number and set it at each
execution.
*/
uint select_number_after_prepare;
char last_error[MYSQL_ERRMSG_SIZE]; char last_error[MYSQL_ERRMSG_SIZE];
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
bool (*set_params)(Prepared_statement *st, uchar *data, uchar *data_end, bool (*set_params)(Prepared_statement *st, uchar *data, uchar *data_end,
...@@ -3455,6 +3469,8 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) ...@@ -3455,6 +3469,8 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len)
trans_rollback_implicit(thd); trans_rollback_implicit(thd);
thd->mdl_context.release_transactional_locks(); thd->mdl_context.release_transactional_locks();
} }
select_number_after_prepare= thd->select_number;
lex_end(lex); lex_end(lex);
cleanup_stmt(); cleanup_stmt();
...@@ -3581,7 +3597,8 @@ Prepared_statement::execute_loop(String *expanded_query, ...@@ -3581,7 +3597,8 @@ Prepared_statement::execute_loop(String *expanded_query,
Reprepare_observer reprepare_observer; Reprepare_observer reprepare_observer;
bool error; bool error;
int reprepare_attempt= 0; int reprepare_attempt= 0;
thd->select_number= select_number_after_prepare;
/* Check if we got an error when sending long data */ /* Check if we got an error when sending long data */
if (state == Query_arena::STMT_ERROR) if (state == Query_arena::STMT_ERROR)
{ {
......
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