MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Tatjana A Nuernberg Date:August 10 2006 1:47am
Subject:bk commit into 5.0 tree (tnurnberg:1.2250) BUG#17926
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of tnurnberg. When tnurnberg does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-08-10 03:46:46+02:00, tnurnberg@stripped +1 -0
  Bug#17926: mysql.exe crashes when ctrl-c is pressed in windows
  
  SIGINT is handled in funny ways on windows, which could lead to problems when
  Control-C was pressed in the client during a long-running query.  Now Control-C
  during a query aborts that query (by sending KILL to the server on a second
  connexion), while Control-C outside of a running query terminates the client.

  client/mysql.cc@stripped, 2006-08-10 03:46:24+02:00, tnurnberg@stripped +40 -2
    Bug#17926: mysql.exe crashes when ctrl-c is pressed in windows
    
    Rather than tear down the client right away, open a second connexion to server
    on SIGINT and send a KILL for the first connexion.  Only if we receive another
    SIGINT before the KILL goes through (or if no query was running in the first
    place) do we terminate the client.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	tnurnberg
# Host:	salvation.intern.azundris.com
# Root:	/home/tnurnberg/work/mysql-5.0-maint-17926

--- 1.213/client/mysql.cc	2006-08-10 03:47:06 +02:00
+++ 1.214/client/mysql.cc	2006-08-10 03:47:06 +02:00
@@ -136,7 +136,8 @@ static my_bool info_flag=0,ignore_errors
 	       tty_password= 0, opt_nobeep=0, opt_reconnect=1,
 	       default_charset_used= 0, opt_secure_auth= 0,
                default_pager_set= 0, opt_sigint_ignore= 0,
-         show_warnings = 0;
+               show_warnings= 0;
+static volatile int executing_query= 0, interrupted_query= 0;
 static ulong opt_max_allowed_packet, opt_net_buffer_length;
 static uint verbose=0,opt_silent=0,opt_mysql_port=0, opt_local_infile=0;
 static my_string opt_mysql_unix_port=0;
@@ -338,6 +339,7 @@ static void end_timer(ulong start_time,c
 static void mysql_end_timer(ulong start_time,char *buff);
 static void nice_time(double sec,char *buff,bool part_second);
 static sig_handler mysql_end(int sig);
+static sig_handler mysql_sigint(int sig);
 
 
 int main(int argc,char *argv[])
@@ -420,7 +422,7 @@ int main(int argc,char *argv[])
   if (opt_sigint_ignore)
     signal(SIGINT, SIG_IGN);
   else
-    signal(SIGINT, mysql_end);			// Catch SIGINT to clean up
+    signal(SIGINT, mysql_sigint);		// Catch SIGINT to clean up
   signal(SIGQUIT, mysql_end);			// Catch SIGQUIT to clean up
 
   /*
@@ -488,6 +490,28 @@ int main(int argc,char *argv[])
 #endif
 }
 
+sig_handler mysql_sigint(int sig)
+{
+  char kill_buffer[40];
+  MYSQL *kill_mysql= NULL;
+
+  signal(SIGINT, mysql_sigint);
+
+  /* terminate if no query being executed, or we already tried interrupting */
+  if (!executing_query || interrupted_query++)
+    mysql_end(sig);
+
+  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))
+    mysql_end(sig);
+  /* kill_buffer is always big enough because max length of %lu is 15 */
+  sprintf(kill_buffer, "KILL /*!50000 QUERY */ %lu", mysql_thread_id(&mysql));
+  mysql_real_query(kill_mysql, kill_buffer, strlen(kill_buffer));
+  mysql_close(kill_mysql);
+  tee_fprintf(stdout, "Query aborted by Ctrl+C\n");
+}
+
 sig_handler mysql_end(int sig)
 {
   mysql_close(&mysql);
@@ -1008,6 +1032,8 @@ static int read_and_execute(bool interac
       if (opt_outfile && glob_buffer.is_empty())
 	fflush(OUTFILE);
 
+      interrupted_query= 0;
+
 #if defined( __WIN__) || defined(OS2) || defined(__NETWARE__)
       tee_fputs(prompt, stdout);
 #if defined(__NETWARE__)
@@ -1998,6 +2024,8 @@ com_go(String *buffer,char *line __attri
 
   timer=start_timer();
 
+  executing_query= 1;
+
   error= mysql_real_query_for_lazy(buffer->ptr(),buffer->length());
 
 #ifdef HAVE_READLINE
@@ -2012,6 +2040,7 @@ com_go(String *buffer,char *line __attri
   if (error)
   {
     buffer->length(0); // Remove query on error
+    executing_query= 0;
     return error;
   }
   error=0;
@@ -2022,13 +2051,19 @@ com_go(String *buffer,char *line __attri
     if (quick)
     {
       if (!(result=mysql_use_result(&mysql)) && mysql_field_count(&mysql))
+      {
+        executing_query= 0;
 	return put_error(&mysql);
+      }
     }
     else
     {
       error= mysql_store_result_for_lazy(&result);
       if (error)
+      {
+        executing_query= 0;
 	return error;
+      }
     }
 
     if (verbose >= 3 || !opt_silent)
@@ -2089,6 +2124,9 @@ com_go(String *buffer,char *line __attri
       fflush(stdout);
     mysql_free_result(result);
   } while (!(err= mysql_next_result(&mysql)));
+
+  executing_query= 0;
+
   if (err >= 1)
     error= put_error(&mysql);
 
Thread
bk commit into 5.0 tree (tnurnberg:1.2250) BUG#17926Tatjana A Nuernberg10 Aug