mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
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.
This commit is contained in:
@@ -160,6 +160,20 @@ public:
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user