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.
parent a290a844
...@@ -20,6 +20,8 @@ hex(a) ...@@ -20,6 +20,8 @@ hex(a)
616263 616263
set GLOBAL init_connect="adsfsdfsdfs"; set GLOBAL init_connect="adsfsdfsdfs";
select @a; 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 Got one of the listed errors
drop table t1; drop table t1;
End of 4.1 tests End of 4.1 tests
......
...@@ -36,6 +36,14 @@ connection con0; ...@@ -36,6 +36,14 @@ connection con0;
set GLOBAL init_connect="adsfsdfsdfs"; set GLOBAL init_connect="adsfsdfsdfs";
connect (con5,localhost,user_1,,); connect (con5,localhost,user_1,,);
connection con5; 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 --error 2013,2006
select @a; select @a;
connection con0; connection con0;
......
...@@ -1342,13 +1342,38 @@ static void prepare_new_connection_state(THD* thd) ...@@ -1342,13 +1342,38 @@ static void prepare_new_connection_state(THD* thd)
execute_init_command(thd, &sys_init_connect, &LOCK_sys_init_connect); execute_init_command(thd, &sys_init_connect, &LOCK_sys_init_connect);
if (thd->is_error()) if (thd->is_error())
{ {
thd->killed= THD::KILL_CONNECTION; ulong packet_length;
NET *net= &thd->net;
sql_print_warning(ER(ER_NEW_ABORTING_CONNECTION), 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->user ? sctx->user : "unauthenticated",
sctx->host_or_ip, "init_connect command failed"); sctx->host_or_ip, "init_connect command failed");
sql_print_warning("%s", thd->main_da.message()); 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->proc_info=0;
thd->set_time(); thd->set_time();
thd->init_for_queries(); thd->init_for_queries();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment