diff options
author | Tatiana A. Nurnberg <azundris@mysql.com> | 2009-10-19 21:42:10 -0700 |
---|---|---|
committer | Tatiana A. Nurnberg <azundris@mysql.com> | 2009-10-19 21:42:10 -0700 |
commit | 3f42e4bd24fc68180b51450a4a900cef3554a8b4 (patch) | |
tree | fa3b244415e186d4804e5701f665beb801ee718b /client | |
parent | f359b258ee73135c8bbcc4e22fc81c25bb4236a5 (diff) | |
download | mariadb-git-3f42e4bd24fc68180b51450a4a900cef3554a8b4.tar.gz |
Bug#28141: Control C on query waiting on lock causes ERROR 1053 (server shutdown)
If a thread is killed in the server, we throw "shutdown" only if one is actually in
progress; otherwise, we throw "query interrupted".
Control-C in the mysql command-line client is "incremental" now.
First Control-C sends KILL QUERY (when connected to 5.0+ server, otherwise, see next)
Next Control-C sends KILL CONNECTION
Next Control-C aborts client.
As the first two steps only pertain to an existing query,
Control-C will abort the client right away if no query is running.
client will give more detailed/consistent feedback on Control-C now.
Diffstat (limited to 'client')
-rw-r--r-- | client/mysql.cc | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/client/mysql.cc b/client/mysql.cc index 0b8b44b3421..9474e4beccc 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1219,18 +1219,34 @@ sig_handler mysql_sigint(int sig) MYSQL *kill_mysql= NULL; /* terminate if no query being executed, or we already tried interrupting */ - if (!executing_query || interrupted_query++) + if (!executing_query || (interrupted_query == 2)) + { + tee_fprintf(stdout, "Ctrl-C -- exit!\n"); goto err; + } kill_mysql= mysql_init(kill_mysql); if (!mysql_real_connect(kill_mysql,current_host, current_user, opt_password, "", opt_mysql_port, opt_mysql_unix_port,0)) + { + tee_fprintf(stdout, "Ctrl-C -- sorry, cannot connect to server to kill query, giving up ...\n"); goto err; + } + + interrupted_query++; + + /* mysqld < 5 does not understand KILL QUERY, skip to KILL CONNECTION */ + if ((interrupted_query == 1) && (mysql_get_server_version(&mysql) < 50000)) + interrupted_query= 2; + /* kill_buffer is always big enough because max length of %lu is 15 */ - sprintf(kill_buffer, "KILL /*!50000 QUERY */ %lu", mysql_thread_id(&mysql)); + sprintf(kill_buffer, "KILL %s%lu", + (interrupted_query == 1) ? "QUERY " : "", + mysql_thread_id(&mysql)); + tee_fprintf(stdout, "Ctrl-C -- sending \"%s\" to server ...\n", kill_buffer); mysql_real_query(kill_mysql, kill_buffer, (uint) strlen(kill_buffer)); mysql_close(kill_mysql); - tee_fprintf(stdout, "Query aborted by Ctrl+C\n"); + tee_fprintf(stdout, "Ctrl-C -- query aborted.\n"); return; |