diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 9ea496a81dc..6b5a3396abe 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -160,6 +160,20 @@ public: uint param_count; uint last_errno; 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]; #ifndef EMBEDDED_LIBRARY 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) trans_rollback_implicit(thd); thd->mdl_context.release_transactional_locks(); } + + select_number_after_prepare= thd->select_number; lex_end(lex); cleanup_stmt(); @@ -3581,7 +3597,8 @@ Prepared_statement::execute_loop(String *expanded_query, Reprepare_observer reprepare_observer; bool error; int reprepare_attempt= 0; - + + thd->select_number= select_number_after_prepare; /* Check if we got an error when sending long data */ if (state == Query_arena::STMT_ERROR) {