mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
BUG#11755281/47032: ERROR 2006 / ERROR 2013 INSTEAD OF PROPER ERROR MESSAGE
If init_command was incorrect, we couldn't let users execute queries, but we couldn't report the issue to the client either as it does not expect error messages before even sending a command. Thus, we simply disconnected them without throwing a clear error. We now go through the proper sequence once (without executing any user statements) so we can report back what the problem is. Only then do we disconnect the user. As always, root remains unaffected by this as init_command is (still) not executed for them.
This commit is contained in:
@ -1342,13 +1342,38 @@ static void prepare_new_connection_state(THD* thd)
|
||||
execute_init_command(thd, &sys_init_connect, &LOCK_sys_init_connect);
|
||||
if (thd->is_error())
|
||||
{
|
||||
thd->killed= THD::KILL_CONNECTION;
|
||||
ulong packet_length;
|
||||
NET *net= &thd->net;
|
||||
|
||||
sql_print_warning(ER(ER_NEW_ABORTING_CONNECTION),
|
||||
thd->thread_id,(thd->db ? thd->db : "unconnected"),
|
||||
thd->thread_id,
|
||||
thd->db ? thd->db : "unconnected",
|
||||
sctx->user ? sctx->user : "unauthenticated",
|
||||
sctx->host_or_ip, "init_connect command failed");
|
||||
sql_print_warning("%s", thd->main_da.message());
|
||||
|
||||
thd->lex->current_select= 0;
|
||||
my_net_set_read_timeout(net, thd->variables.net_wait_timeout);
|
||||
thd->clear_error();
|
||||
net_new_transaction(net);
|
||||
packet_length= my_net_read(net);
|
||||
/*
|
||||
If my_net_read() failed, my_error() has been already called,
|
||||
and the main Diagnostics Area contains an error condition.
|
||||
*/
|
||||
if (packet_length != packet_error)
|
||||
my_error(ER_NEW_ABORTING_CONNECTION, MYF(0),
|
||||
thd->thread_id,
|
||||
thd->db ? thd->db : "unconnected",
|
||||
sctx->user ? sctx->user : "unauthenticated",
|
||||
sctx->host_or_ip, "init_connect command failed");
|
||||
|
||||
thd->server_status&= ~SERVER_STATUS_CLEAR_SET;
|
||||
net_end_statement(thd);
|
||||
thd->killed = THD::KILL_CONNECTION;
|
||||
return;
|
||||
}
|
||||
|
||||
thd->proc_info=0;
|
||||
thd->set_time();
|
||||
thd->init_for_queries();
|
||||
|
Reference in New Issue
Block a user