MDEV-9947: COM_MULTI united response
This commit is contained in:
parent
e7ff281d2e
commit
50a17de1ce
@ -1170,7 +1170,8 @@ bool Protocol_binary::write()
|
|||||||
bool
|
bool
|
||||||
net_send_ok(THD *thd,
|
net_send_ok(THD *thd,
|
||||||
uint server_status, uint statement_warn_count,
|
uint server_status, uint statement_warn_count,
|
||||||
ulonglong affected_rows, ulonglong id, const char *message)
|
ulonglong affected_rows, ulonglong id, const char *message,
|
||||||
|
bool unused __attribute__((unused)))
|
||||||
{
|
{
|
||||||
DBUG_ENTER("emb_net_send_ok");
|
DBUG_ENTER("emb_net_send_ok");
|
||||||
MYSQL_DATA *data;
|
MYSQL_DATA *data;
|
||||||
|
@ -4439,7 +4439,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
|
|||||||
|
|
||||||
thd->enable_slow_log= thd->variables.sql_log_slow;
|
thd->enable_slow_log= thd->variables.sql_log_slow;
|
||||||
mysql_parse(thd, thd->query(), thd->query_length(), &parser_state,
|
mysql_parse(thd, thd->query(), thd->query_length(), &parser_state,
|
||||||
FALSE);
|
FALSE, FALSE);
|
||||||
/* Finalize server status flags after executing a statement. */
|
/* Finalize server status flags after executing a statement. */
|
||||||
thd->update_server_status();
|
thd->update_server_status();
|
||||||
log_slow_statement(thd);
|
log_slow_statement(thd);
|
||||||
|
@ -35,7 +35,7 @@ static const unsigned int PACKET_BUFFER_EXTRA_ALLOC= 1024;
|
|||||||
/* Declared non-static only because of the embedded library. */
|
/* Declared non-static only because of the embedded library. */
|
||||||
bool net_send_error_packet(THD *, uint, const char *, const char *);
|
bool net_send_error_packet(THD *, uint, const char *, const char *);
|
||||||
/* Declared non-static only because of the embedded library. */
|
/* Declared non-static only because of the embedded library. */
|
||||||
bool net_send_ok(THD *, uint, uint, ulonglong, ulonglong, const char *);
|
bool net_send_ok(THD *, uint, uint, ulonglong, ulonglong, const char *, bool);
|
||||||
/* Declared non-static only because of the embedded library. */
|
/* Declared non-static only because of the embedded library. */
|
||||||
bool net_send_eof(THD *thd, uint server_status, uint statement_warn_count);
|
bool net_send_eof(THD *thd, uint server_status, uint statement_warn_count);
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
@ -208,7 +208,8 @@ bool net_send_error(THD *thd, uint sql_errno, const char *err,
|
|||||||
bool
|
bool
|
||||||
net_send_ok(THD *thd,
|
net_send_ok(THD *thd,
|
||||||
uint server_status, uint statement_warn_count,
|
uint server_status, uint statement_warn_count,
|
||||||
ulonglong affected_rows, ulonglong id, const char *message)
|
ulonglong affected_rows, ulonglong id, const char *message,
|
||||||
|
bool skip_flush)
|
||||||
{
|
{
|
||||||
NET *net= &thd->net;
|
NET *net= &thd->net;
|
||||||
uchar buff[MYSQL_ERRMSG_SIZE+10],*pos;
|
uchar buff[MYSQL_ERRMSG_SIZE+10],*pos;
|
||||||
@ -250,7 +251,7 @@ net_send_ok(THD *thd,
|
|||||||
if (message && message[0])
|
if (message && message[0])
|
||||||
pos= net_store_data(pos, (uchar*) message, strlen(message));
|
pos= net_store_data(pos, (uchar*) message, strlen(message));
|
||||||
error= my_net_write(net, buff, (size_t) (pos-buff));
|
error= my_net_write(net, buff, (size_t) (pos-buff));
|
||||||
if (!error)
|
if (!error && !skip_flush)
|
||||||
error= net_flush(net);
|
error= net_flush(net);
|
||||||
|
|
||||||
|
|
||||||
@ -514,14 +515,16 @@ void Protocol::end_statement()
|
|||||||
thd->get_stmt_da()->statement_warn_count(),
|
thd->get_stmt_da()->statement_warn_count(),
|
||||||
thd->get_stmt_da()->affected_rows(),
|
thd->get_stmt_da()->affected_rows(),
|
||||||
thd->get_stmt_da()->last_insert_id(),
|
thd->get_stmt_da()->last_insert_id(),
|
||||||
thd->get_stmt_da()->message());
|
thd->get_stmt_da()->message(),
|
||||||
|
thd->get_stmt_da()->skip_flush());
|
||||||
break;
|
break;
|
||||||
case Diagnostics_area::DA_DISABLED:
|
case Diagnostics_area::DA_DISABLED:
|
||||||
break;
|
break;
|
||||||
case Diagnostics_area::DA_EMPTY:
|
case Diagnostics_area::DA_EMPTY:
|
||||||
default:
|
default:
|
||||||
DBUG_ASSERT(0);
|
DBUG_ASSERT(0);
|
||||||
error= send_ok(thd->server_status, 0, 0, 0, NULL);
|
error= send_ok(thd->server_status, 0, 0, 0, NULL,
|
||||||
|
thd->get_stmt_da()->skip_flush());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!error)
|
if (!error)
|
||||||
@ -540,12 +543,12 @@ void Protocol::end_statement()
|
|||||||
|
|
||||||
bool Protocol::send_ok(uint server_status, uint statement_warn_count,
|
bool Protocol::send_ok(uint server_status, uint statement_warn_count,
|
||||||
ulonglong affected_rows, ulonglong last_insert_id,
|
ulonglong affected_rows, ulonglong last_insert_id,
|
||||||
const char *message)
|
const char *message, bool skip_flush)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("Protocol::send_ok");
|
DBUG_ENTER("Protocol::send_ok");
|
||||||
const bool retval=
|
const bool retval=
|
||||||
net_send_ok(thd, server_status, statement_warn_count,
|
net_send_ok(thd, server_status, statement_warn_count,
|
||||||
affected_rows, last_insert_id, message);
|
affected_rows, last_insert_id, message, skip_flush);
|
||||||
DBUG_RETURN(retval);
|
DBUG_RETURN(retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ protected:
|
|||||||
|
|
||||||
virtual bool send_ok(uint server_status, uint statement_warn_count,
|
virtual bool send_ok(uint server_status, uint statement_warn_count,
|
||||||
ulonglong affected_rows, ulonglong last_insert_id,
|
ulonglong affected_rows, ulonglong last_insert_id,
|
||||||
const char *message);
|
const char *message, bool skip_flush);
|
||||||
|
|
||||||
virtual bool send_eof(uint server_status, uint statement_warn_count);
|
virtual bool send_eof(uint server_status, uint statement_warn_count);
|
||||||
|
|
||||||
|
@ -347,6 +347,7 @@ void
|
|||||||
Diagnostics_area::reset_diagnostics_area()
|
Diagnostics_area::reset_diagnostics_area()
|
||||||
{
|
{
|
||||||
DBUG_ENTER("reset_diagnostics_area");
|
DBUG_ENTER("reset_diagnostics_area");
|
||||||
|
m_skip_flush= FALSE;
|
||||||
#ifdef DBUG_OFF
|
#ifdef DBUG_OFF
|
||||||
m_can_overwrite_status= FALSE;
|
m_can_overwrite_status= FALSE;
|
||||||
/** Don't take chances in production */
|
/** Don't take chances in production */
|
||||||
|
@ -704,6 +704,12 @@ public:
|
|||||||
const char *message() const
|
const char *message() const
|
||||||
{ DBUG_ASSERT(m_status == DA_ERROR || m_status == DA_OK); return m_message; }
|
{ DBUG_ASSERT(m_status == DA_ERROR || m_status == DA_OK); return m_message; }
|
||||||
|
|
||||||
|
bool skip_flush() const
|
||||||
|
{ DBUG_ASSERT(m_status == DA_OK); return m_skip_flush; }
|
||||||
|
|
||||||
|
void set_skip_flush()
|
||||||
|
{ m_skip_flush= TRUE; }
|
||||||
|
|
||||||
uint sql_errno() const
|
uint sql_errno() const
|
||||||
{ DBUG_ASSERT(m_status == DA_ERROR); return m_sql_errno; }
|
{ DBUG_ASSERT(m_status == DA_ERROR); return m_sql_errno; }
|
||||||
|
|
||||||
@ -857,6 +863,9 @@ private:
|
|||||||
/** Set to make set_error_status after set_{ok,eof}_status possible. */
|
/** Set to make set_error_status after set_{ok,eof}_status possible. */
|
||||||
bool m_can_overwrite_status;
|
bool m_can_overwrite_status;
|
||||||
|
|
||||||
|
/** Skip flushing network buffer after writing OK (for COM_MULTI) */
|
||||||
|
bool m_skip_flush;
|
||||||
|
|
||||||
/** Message buffer. Can be used by OK or ERROR status. */
|
/** Message buffer. Can be used by OK or ERROR status. */
|
||||||
char m_message[MYSQL_ERRMSG_SIZE];
|
char m_message[MYSQL_ERRMSG_SIZE];
|
||||||
|
|
||||||
|
@ -111,7 +111,9 @@
|
|||||||
#include "wsrep_thd.h"
|
#include "wsrep_thd.h"
|
||||||
|
|
||||||
static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
|
static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||||
Parser_state *parser_state, bool is_next_command);
|
Parser_state *parser_state,
|
||||||
|
bool is_com_multi,
|
||||||
|
bool is_next_command);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@defgroup Runtime_Environment Runtime Environment
|
@defgroup Runtime_Environment Runtime Environment
|
||||||
@ -1020,7 +1022,7 @@ static void handle_bootstrap_impl(THD *thd)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mysql_parse(thd, thd->query(), length, &parser_state, FALSE);
|
mysql_parse(thd, thd->query(), length, &parser_state, FALSE, FALSE);
|
||||||
|
|
||||||
bootstrap_error= thd->is_error();
|
bootstrap_error= thd->is_error();
|
||||||
thd->protocol->end_statement();
|
thd->protocol->end_statement();
|
||||||
@ -1633,6 +1635,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
drop_more_results= !MY_TEST(thd->server_status &
|
drop_more_results= !MY_TEST(thd->server_status &
|
||||||
SERVER_MORE_RESULTS_EXISTS);
|
SERVER_MORE_RESULTS_EXISTS);
|
||||||
thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
|
thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
|
||||||
|
if (is_com_multi)
|
||||||
|
thd->get_stmt_da()->set_skip_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (command) {
|
switch (command) {
|
||||||
@ -1784,10 +1788,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
|
|
||||||
if (WSREP_ON)
|
if (WSREP_ON)
|
||||||
wsrep_mysql_parse(thd, thd->query(), thd->query_length(), &parser_state,
|
wsrep_mysql_parse(thd, thd->query(), thd->query_length(), &parser_state,
|
||||||
is_next_command);
|
is_com_multi, is_next_command);
|
||||||
else
|
else
|
||||||
mysql_parse(thd, thd->query(), thd->query_length(), &parser_state,
|
mysql_parse(thd, thd->query(), thd->query_length(), &parser_state,
|
||||||
is_next_command);
|
is_com_multi, is_next_command);
|
||||||
|
|
||||||
while (!thd->killed && (parser_state.m_lip.found_semicolon != NULL) &&
|
while (!thd->killed && (parser_state.m_lip.found_semicolon != NULL) &&
|
||||||
! thd->is_error())
|
! thd->is_error())
|
||||||
@ -1873,10 +1877,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
|
|
||||||
if (WSREP_ON)
|
if (WSREP_ON)
|
||||||
wsrep_mysql_parse(thd, beginning_of_next_stmt, length, &parser_state,
|
wsrep_mysql_parse(thd, beginning_of_next_stmt, length, &parser_state,
|
||||||
is_next_command);
|
is_com_multi, is_next_command);
|
||||||
else
|
else
|
||||||
mysql_parse(thd, beginning_of_next_stmt, length, &parser_state,
|
mysql_parse(thd, beginning_of_next_stmt, length, &parser_state,
|
||||||
is_next_command);
|
is_com_multi, is_next_command);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1930,7 +1934,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
thd->reset_for_next_command();
|
thd->reset_for_next_command();
|
||||||
// thd->reset_for_next_command reset state => restore it
|
// thd->reset_for_next_command reset state => restore it
|
||||||
if (is_next_command)
|
if (is_next_command)
|
||||||
|
{
|
||||||
thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
|
thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
|
||||||
|
if (is_com_multi)
|
||||||
|
thd->get_stmt_da()->set_skip_flush();
|
||||||
|
}
|
||||||
|
|
||||||
lex_start(thd);
|
lex_start(thd);
|
||||||
/* Must be before we init the table list. */
|
/* Must be before we init the table list. */
|
||||||
if (lower_case_table_names)
|
if (lower_case_table_names)
|
||||||
@ -2272,6 +2281,7 @@ com_multi_end:
|
|||||||
thd->m_digest= save_digest;
|
thd->m_digest= save_digest;
|
||||||
|
|
||||||
/* release old buffer */
|
/* release old buffer */
|
||||||
|
net_flush(net);
|
||||||
DBUG_ASSERT(net->buff == net->write_pos); // nothing to send
|
DBUG_ASSERT(net->buff == net->write_pos); // nothing to send
|
||||||
my_free(readbuff);
|
my_free(readbuff);
|
||||||
}
|
}
|
||||||
@ -7508,7 +7518,9 @@ void mysql_init_multi_delete(LEX *lex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
|
static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||||
Parser_state *parser_state, bool is_next_command)
|
Parser_state *parser_state,
|
||||||
|
bool is_com_multi,
|
||||||
|
bool is_next_command)
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
bool is_autocommit=
|
bool is_autocommit=
|
||||||
@ -7527,7 +7539,8 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
|
|||||||
MYSQL_SET_STATEMENT_TEXT(thd->m_statement_psi, thd->query(),
|
MYSQL_SET_STATEMENT_TEXT(thd->m_statement_psi, thd->query(),
|
||||||
thd->query_length());
|
thd->query_length());
|
||||||
}
|
}
|
||||||
mysql_parse(thd, rawbuf, length, parser_state, is_next_command);
|
mysql_parse(thd, rawbuf, length, parser_state, is_com_multi,
|
||||||
|
is_next_command);
|
||||||
|
|
||||||
if (WSREP(thd)) {
|
if (WSREP(thd)) {
|
||||||
/* wsrep BF abort in query exec phase */
|
/* wsrep BF abort in query exec phase */
|
||||||
@ -7629,7 +7642,9 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
void mysql_parse(THD *thd, char *rawbuf, uint length,
|
void mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||||
Parser_state *parser_state, bool is_next_command)
|
Parser_state *parser_state,
|
||||||
|
bool is_com_multi,
|
||||||
|
bool is_next_command)
|
||||||
{
|
{
|
||||||
int error __attribute__((unused));
|
int error __attribute__((unused));
|
||||||
DBUG_ENTER("mysql_parse");
|
DBUG_ENTER("mysql_parse");
|
||||||
@ -7654,7 +7669,11 @@ void mysql_parse(THD *thd, char *rawbuf, uint length,
|
|||||||
lex_start(thd);
|
lex_start(thd);
|
||||||
thd->reset_for_next_command();
|
thd->reset_for_next_command();
|
||||||
if (is_next_command)
|
if (is_next_command)
|
||||||
|
{
|
||||||
thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
|
thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
|
||||||
|
if (is_com_multi)
|
||||||
|
thd->get_stmt_da()->set_skip_flush();
|
||||||
|
}
|
||||||
|
|
||||||
if (query_cache_send_result_to_client(thd, rawbuf, length) <= 0)
|
if (query_cache_send_result_to_client(thd, rawbuf, length) <= 0)
|
||||||
{
|
{
|
||||||
|
@ -88,7 +88,8 @@ bool is_log_table_write_query(enum enum_sql_command command);
|
|||||||
bool alloc_query(THD *thd, const char *packet, uint packet_length);
|
bool alloc_query(THD *thd, const char *packet, uint packet_length);
|
||||||
void mysql_init_select(LEX *lex);
|
void mysql_init_select(LEX *lex);
|
||||||
void mysql_parse(THD *thd, char *rawbuf, uint length,
|
void mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||||
Parser_state *parser_state, bool is_com_multi);
|
Parser_state *parser_state, bool is_com_multi,
|
||||||
|
bool is_next_command);
|
||||||
bool mysql_new_select(LEX *lex, bool move_down);
|
bool mysql_new_select(LEX *lex, bool move_down);
|
||||||
void create_select_for_variable(const char *var_name);
|
void create_select_for_variable(const char *var_name);
|
||||||
void create_table_set_open_action_and_adjust_tables(LEX *lex);
|
void create_table_set_open_action_and_adjust_tables(LEX *lex);
|
||||||
|
@ -277,7 +277,7 @@ protected:
|
|||||||
|
|
||||||
virtual bool send_ok(uint server_status, uint statement_warn_count,
|
virtual bool send_ok(uint server_status, uint statement_warn_count,
|
||||||
ulonglong affected_rows, ulonglong last_insert_id,
|
ulonglong affected_rows, ulonglong last_insert_id,
|
||||||
const char *message);
|
const char *message, bool skip_flush);
|
||||||
|
|
||||||
virtual bool send_eof(uint server_status, uint statement_warn_count);
|
virtual bool send_eof(uint server_status, uint statement_warn_count);
|
||||||
virtual bool send_error(uint sql_errno, const char *err_msg, const char* sqlstate);
|
virtual bool send_error(uint sql_errno, const char *err_msg, const char* sqlstate);
|
||||||
@ -4877,7 +4877,7 @@ bool Protocol_local::send_out_parameters(List<Item_param> *sp_params)
|
|||||||
bool
|
bool
|
||||||
Protocol_local::send_ok(uint server_status, uint statement_warn_count,
|
Protocol_local::send_ok(uint server_status, uint statement_warn_count,
|
||||||
ulonglong affected_rows, ulonglong last_insert_id,
|
ulonglong affected_rows, ulonglong last_insert_id,
|
||||||
const char *message)
|
const char *message, bool skip_flush)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Just make sure nothing is sent to the client, we have grabbed
|
Just make sure nothing is sent to the client, we have grabbed
|
||||||
|
@ -957,7 +957,7 @@ static int run_sql_command(THD *thd, const char *query)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
mysql_parse(thd, thd->query(), thd->query_length(), &ps, FALSE);
|
mysql_parse(thd, thd->query(), thd->query_length(), &ps, FALSE, FALSE);
|
||||||
if (thd->is_error())
|
if (thd->is_error())
|
||||||
{
|
{
|
||||||
int const err= thd->get_stmt_da()->sql_errno();
|
int const err= thd->get_stmt_da()->sql_errno();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user