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. mysql-test/r/init_connect.result: We now report a proper error if init_command fails. Expect as much. mysql-test/t/init_connect.test: We now report a proper error if init_command fails. Expect as much. sql/sql_connect.cc: If init_command fails, throw an error explaining this to the user.
This commit is contained in:
parent
e498a1bf65
commit
251fa88afa
@ -20,6 +20,8 @@ hex(a)
|
||||
616263
|
||||
set GLOBAL init_connect="adsfsdfsdfs";
|
||||
select @a;
|
||||
ERROR 08S01: Aborted connection to db: 'test' user: 'user_1' host: 'localhost' (init_connect command failed)
|
||||
select @a;
|
||||
Got one of the listed errors
|
||||
drop table t1;
|
||||
End of 4.1 tests
|
||||
|
@ -36,6 +36,14 @@ connection con0;
|
||||
set GLOBAL init_connect="adsfsdfsdfs";
|
||||
connect (con5,localhost,user_1,,);
|
||||
connection con5;
|
||||
# BUG#11755281/47032: ERROR 2006 / ERROR 2013 INSTEAD OF PROPER ERROR MESSAGE
|
||||
# We now throw a proper error message here:
|
||||
--replace_regex /connection .* to/connection to/
|
||||
--error ER_NEW_ABORTING_CONNECTION
|
||||
select @a;
|
||||
# We got disconnected after receiving the above error message; any further
|
||||
# requests should fail with a notice that no one's listening to us.
|
||||
# --error CR_SERVER_GONE_ERROR,CR_SERVER_LOST
|
||||
--error 2013,2006
|
||||
select @a;
|
||||
connection con0;
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user