From 97f5cac93c5f63822b5e855bbbab9f9188d447b4 Mon Sep 17 00:00:00 2001
From: "kent@mysql.com" <>
Date: Sun, 2 Jan 2005 16:57:21 +0100
Subject: [PATCH 01/11] mysql-test-run.pl:   Added initial support for multiple
 test suites   Added usage information, i.e. --help

---
 mysql-test/mysql-test-run.pl | 234 +++++++++++++++++++++++++++++------
 1 file changed, 194 insertions(+), 40 deletions(-)

diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index a69dcdce5c6..5565d29fb7b 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -172,6 +172,9 @@ our $path_slave_load_tmpdir;     # What is this?!
 our $path_my_basedir;
 our $opt_tmpdir;                 # A path but set directly on cmd line
 
+our $opt_usage;
+our $opt_suite;
+
 our $opt_netware;
 
 our $opt_script_debug= 0;  # Script debugging, enable with --script-debug
@@ -290,6 +293,7 @@ sub initial_setup ();
 sub command_line_setup ();
 sub executable_setup ();
 sub kill_and_cleanup ();
+sub collect_test_cases ($);
 sub sleep_until_file_created ($$);
 sub ndbcluster_start ();
 sub ndbcluster_stop ();
@@ -306,6 +310,7 @@ sub stop_masters_slaves ();
 sub stop_masters ();
 sub stop_slaves ();
 sub run_mysqltest ($$);
+sub usage ($);
 
 ######################################################################
 #
@@ -423,6 +428,7 @@ sub command_line_setup () {
 
   # These are defaults for things that are set on the command line
 
+  $opt_suite=        "main";    # Special default suite
   $opt_tmpdir=       "$glob_mysql_test_dir/var/tmp";
   # FIXME maybe unneded?
   $path_manager_log= "$glob_mysql_test_dir/var/log/manager.log";
@@ -436,61 +442,85 @@ sub command_line_setup () {
   my $opt_user;
 
   # Read the command line
+  # Note: Keep list, and the order, in sync with usage at end of this file
 
   GetOptions(
-             'bench'                    => \$opt_bench,
-             'big-test'                 => \$opt_big_test,
-             'client-gdb'               => \$opt_client_gdb,
-             'compress'                 => \$opt_compress,
-             'ddd'                      => \$opt_ddd,
-             'debug'                    => \$opt_debug,
-             'do-test=s'                => \$opt_do_test,
+             # Control what engine/variation to run
              'embedded-server'          => \$opt_embedded_server,
              'ps-protocol'              => \$opt_ps_protocol,
-             'extern'                   => \$opt_extern,
-             'fast'                     => \$opt_fast,
-             'force'                    => \$opt_force,
-             'gcov'                     => \$opt_gcov,
-             'gdb'                      => \$opt_gdb,
-             'gprof'                    => \$opt_gprof,
-             'local'                    => \$opt_local,
-             'local-master'             => \$opt_local_master,
-             'manual-gdb'               => \$opt_manual_gdb,
-             'master-binary=s'          => \$exe_master_mysqld,
-             'master_port=i'            => \$opt_master_myport,
-             'mysqld=s'                 => \$opt_extra_mysqld_opt,
-             'ndbcluster_port=i'        => \$opt_ndbcluster_port,
-             'ndbconnectstring=s'       => \$opt_ndbconnectstring,
-             'netware'                  => \$opt_netware,
+             'bench'                    => \$opt_bench,
+             'small-bench'              => \$opt_small_bench,
              'no-manager'               => \$opt_no_manager,
-             'old-master'               => \$opt_old_master,
-             'ps-protocol'              => \$opt_ps_protocol,
-             'record'                   => \$opt_record,
-             'script-debug'             => \$opt_script_debug,
+
+             # Control what test suites or cases to run
+             'force'                    => \$opt_force,
+             'with-ndbcluster'          => \$opt_with_ndbcluster,
+             'do-test=s'                => \$opt_do_test,
+             'suite=s'                  => \$opt_suite,
              'skip-rpl'                 => \$opt_skip_rpl,
              'skip-test=s'              => \$opt_skip_test,
-             'slave-binary=s'           => \$exe_slave_mysqld,
+
+             # Specify ports
+             'master_port=i'            => \$opt_master_myport,
              'slave_port=i'             => \$opt_slave_myport,
+             'ndbcluster_port=i'        => \$opt_ndbcluster_port,
+
+             # Test case authoring
+             'record'                   => \$opt_record,
+
+             # ???
+             'mysqld=s'                 => \$opt_extra_mysqld_opt,
+
+             # Run test on running server
+             'extern'                   => \$opt_extern,
+             'ndbconnectstring=s'       => \$opt_ndbconnectstring,
+
+             # Debugging
+             'gdb'                      => \$opt_gdb,
+             'manual-gdb'               => \$opt_manual_gdb,
+             'client-gdb'               => \$opt_client_gdb,
+             'ddd'                      => \$opt_ddd,
+             'strace-client'            => \$opt_strace_client,
+             'master-binary=s'          => \$exe_master_mysqld,
+             'slave-binary=s'           => \$exe_slave_mysqld,
+
+             # Coverage, profiling etc
+             'gcov'                     => \$opt_gcov,
+             'gprof'                    => \$opt_gprof,
+             'valgrind'                 => \$opt_valgrind,
+             'valgrind-all'             => \$opt_valgrind_all,
+             'valgrind-options=s'       => \$opt_valgrind_options,
+
+             # Misc
+             'big-test'                 => \$opt_big_test,
+             'compress'                 => \$opt_compress,
+             'debug'                    => \$opt_debug,
+             'fast'                     => \$opt_fast,
+             'local'                    => \$opt_local,
+             'local-master'             => \$opt_local_master,
+             'netware'                  => \$opt_netware,
+             'old-master'               => \$opt_old_master,
+             'script-debug'             => \$opt_script_debug,
              'sleep=i'                  => \$opt_sleep,
-             'small-bench'              => \$opt_small_bench,
              'socket=s'                 => \$opt_socket,
              'start-and-exit'           => \$opt_start_and_exit,
              'start-from=s'             => \$opt_start_from,
-             'strace-client'            => \$opt_strace_client,
              'timer'                    => \$opt_timer,
              'tmpdir=s'                 => \$opt_tmpdir,
              'user-test=s'              => \$opt_user_test,
              'user=s'                   => \$opt_user,
-             'valgrind'                 => \$opt_valgrind,
-             'valgrind-all'             => \$opt_valgrind_all,
-             'valgrind-options=s'       => \$opt_valgrind_options,
              'verbose'                  => \$opt_verbose,
              'wait-timeout=i'           => \$opt_wait_timeout,
              'warnings|log-warnings'    => \$opt_warnings,
-             'with-ndbcluster'          => \$opt_with_ndbcluster,
              'with-openssl'             => \$opt_with_openssl,
+
+             'help|h'                   => \$opt_usage,
             ) or usage("Can't read options");
 
+  if ( $opt_usage )
+  {
+    usage("");
+  }
 
   # Put this into a hash, will be a C struct
 
@@ -593,7 +623,7 @@ sub command_line_setup () {
 
   if ( $opt_sleep )
   {
-    $opt_sleep_time_after_restart=  $opt_sleep;
+    $opt_sleep_time_after_restart= $opt_sleep;
   }
 
   if ( $opt_gcov and ! $opt_source_dist )
@@ -811,8 +841,22 @@ sub handle_int_signal () {
 #
 ##############################################################################
 
-sub collect_test_cases () {
-  my $testdir= "$glob_mysql_test_dir/t";
+sub collect_test_cases ($) {
+  my $suite= shift;             # Test suite name
+
+  my $testdir;
+  my $resdir;
+
+  if ( $suite eq "main" )
+  {
+    $testdir= "$glob_mysql_test_dir/t";
+    $resdir=  "$glob_mysql_test_dir/r";
+  }
+  else
+  {
+    $testdir= "$glob_mysql_test_dir/suite/$suite/t";
+    $resdir=  "$glob_mysql_test_dir/suite/$suite/r";
+  }
 
   my @tests;               # Array of hash, will be array of C struct
 
@@ -839,7 +883,7 @@ sub collect_test_cases () {
 
     my $tinfo= {};
     $tinfo->{'name'}= $tname;
-    $tinfo->{'result_file'}= "r/$tname.result";
+    $tinfo->{'result_file'}= "$resdir/$tname.result";
     push(@tests, $tinfo);
 
     if ( $opt_skip_test and defined mtr_match_prefix($tname,$opt_skip_test) )
@@ -1180,13 +1224,22 @@ sub run_benchmarks ($) {
 #
 ##############################################################################
 
+# FIXME how to specify several suites to run? Comma separated list?
+
 sub run_tests () {
+  run_suite($opt_suite);
+}
 
-  mtr_report("Finding Tests");
+sub run_suite () {
+  my $suite= shift;
 
-  my $tests= collect_test_cases();
+  mtr_print_thick_line();
 
-  mtr_report("Starting Tests");
+  mtr_report("Finding Tests in $suite suite");
+
+  my $tests= collect_test_cases($suite);
+
+  mtr_report("Starting Tests in $suite suite");
 
   mtr_print_header();
 
@@ -2006,3 +2059,104 @@ sub run_mysqltest ($$) {
 
   return mtr_run($exe_mysqltest,$args,$tinfo->{'path'},"",$path_timefile,"");
 }
+
+##############################################################################
+#
+#  Usage
+#
+##############################################################################
+
+sub usage ($)
+{
+  print STDERR <<HERE;
+
+mysql-test-run [ OPTIONS ] [ TESTCASE ]
+
+FIXME when is TESTCASE arg used or not?!
+
+Options to control what engine/variation to run
+
+  embedded-server       Use the embedded server, i.e. no mysqld daemons
+  ps-protocol           Use the binary protocol between client and server
+  bench                 Run the benchmark suite FIXME
+  small-bench           FIXME
+  no-manager            Use the istanse manager (currently disabled)
+
+Options to control what test suites or cases to run
+
+  force                 Continue to run the suite after failure
+  with-ndbcluster       Use cluster, and enable test cases that requres it
+  do-test=PREFIX        Run test cases which name are prefixed with PREFIX
+  start-from=PREFIX     Run test cases starting from test prefixed with PREFIX
+  suite=NAME            Run the test suite named NAME. The default is "main"
+  skip-rpl              Skip the replication test cases.
+  skip-test=PREFIX      Skip test cases which name are prefixed with PREFIX
+
+Options that specify ports
+
+  master_port=PORT      Specify the port number used by the first master
+  slave_port=PORT       Specify the port number used by the first slave
+  ndbcluster_port=i     Specify the port number used by cluster FIXME
+
+Options for test case authoring
+
+  record TESTNAME       (Re)genereate the result file for TESTNAME
+
+Options that pass on options
+
+  mysqld=ARGS           Specify additional arguments to "mysqld"
+
+Options to run test on running server
+
+  extern                Use running server for tests FIXME DANGEROUS
+  ndbconnectstring=STR  Use running cluster, and connect using STR      
+  user=USER             The databse user name
+
+Options for debugging the product
+
+  gdb                   FIXME
+  manual-gdb            FIXME
+  client-gdb            FIXME
+  ddd                   FIXME
+  strace-client         FIXME
+  master-binary=PATH    Specify the master "mysqld" to use
+  slave-binary=PATH     Specify the slave "mysqld" to use
+
+Options for coverage, profiling etc
+
+  gcov                  FIXME
+  gprof                 FIXME
+  valgrind              FIXME
+  valgrind-all          FIXME
+  valgrind-options=ARGS Extra options to give valgrind
+
+Misc options
+
+  verbose               Verbose output from this script
+  script-debug          Debug this script itself
+  compress              Use the compressed protocol between client and server
+  timer                 Show test case execution time
+  start-and-exit        Only initiate and start the "mysqld" servers
+  fast                  Don't try to cleanup from earlier runs
+  help                  Get this help text
+
+Options not yet described, or that I want to look into more
+
+  big-test              
+  debug                 
+  local                 
+  local-master          
+  netware               
+  old-master            
+  sleep=SECONDS         
+  socket=PATH           
+  tmpdir=DIR            
+  user-test=s           
+  wait-timeout=SECONDS  
+  warnings              
+  log-warnings          
+  with-openssl          
+
+HERE
+  exit(1);
+}

From c725e090895e3d63073acc49ccad47faaf6328b5 Mon Sep 17 00:00:00 2001
From: "kent@mysql.com" <>
Date: Mon, 3 Jan 2005 16:54:08 +0100
Subject: [PATCH 02/11] mtr_process.pl:   Added missing stop_reap_all() if
 returns early from function mysql-test-run.pl:   Improved output from
 --script-debug   Initial Cygwin support   Improved mysqld process termination

---
 mysql-test/lib/mtr_process.pl | 384 +++++++++++++++++++---------------
 mysql-test/lib/mtr_report.pl  |   7 +-
 mysql-test/mysql-test-run.pl  |  56 +++--
 3 files changed, 259 insertions(+), 188 deletions(-)

diff --git a/mysql-test/lib/mtr_process.pl b/mysql-test/lib/mtr_process.pl
index 2263ef5bc24..8c584802b8e 100644
--- a/mysql-test/lib/mtr_process.pl
+++ b/mysql-test/lib/mtr_process.pl
@@ -4,13 +4,14 @@
 # and is part of the translation of the Bourne shell script with the
 # same name.
 
+use Carp qw(cluck);
 use strict;
 
 use POSIX ":sys_wait_h";
 
 sub mtr_run ($$$$$$);
 sub mtr_spawn ($$$$$$);
-sub mtr_stop_servers ($);
+sub mtr_stop_mysqld_servers ($$);
 sub mtr_kill_leftovers ();
 
 # static in C
@@ -77,13 +78,21 @@ sub spawn_impl ($$$$$$$) {
 
   if ( $::opt_script_debug )
   {
-    print STDERR "-" x 78, "\n";
-    print STDERR "STDIN  $input\n" if $input;
-    print STDERR "STDOUT $output\n" if $output;
-    print STDERR "STDERR $error\n" if $error;
-    print STDERR "DAEMON\n" if !$join;
-    print STDERR "EXEC $path ", join(" ",@$arg_list_t), "\n";
-    print STDERR "-" x 78, "\n";
+    print STDERR "\n";
+    print STDERR "#### ", "-" x 78, "\n";
+    print STDERR "#### ", "STDIN  $input\n" if $input;
+    print STDERR "#### ", "STDOUT $output\n" if $output;
+    print STDERR "#### ", "STDERR $error\n" if $error;
+    if ( $join )
+    {
+      print STDERR "#### ", "run";
+    }
+    else
+    {
+      print STDERR "#### ", "spawn";
+    }
+    print STDERR "$path ", join(" ",@$arg_list_t), "\n";
+    print STDERR "#### ", "-" x 78, "\n";
   }
 
   my $pid= fork();
@@ -101,11 +110,11 @@ sub spawn_impl ($$$$$$$) {
       my $dumped_core= $? & 128;
       if ( $signal_num )
       {
-        die("spawn got signal $signal_num");
+        mtr_error("spawn got signal $signal_num");
       }
       if ( $dumped_core )
       {
-        die("spawn dumped core");
+        mtr_error("spawn dumped core");
       }
       return $exit_value;
     }
@@ -127,22 +136,34 @@ sub spawn_impl ($$$$$$$) {
 
     if ( $output )
     {
-      open(STDOUT,">",$output) or die "Can't redirect STDOUT to \"$output\": $!";
+      if ( ! open(STDOUT,">",$output) )
+      {
+        mtr_error("can't redirect STDOUT to \"$output\": $!");
+      }
     }
     if ( $error )
     {
       if ( $output eq $error )
       {
-        open(STDERR,">&STDOUT") or die "Can't dup STDOUT: $!";
+        if ( ! open(STDERR,">&STDOUT") )
+        {
+          mtr_error("can't dup STDOUT: $!");
+        }
       }
       else
       {
-        open(STDERR,">",$error) or die "Can't redirect STDERR to \"$output\": $!";
+        if ( ! open(STDERR,">",$error) )
+        {
+          mtr_error("can't redirect STDERR to \"$output\": $!");
+        }
       }
     }
     if ( $input )
     {
-      open(STDIN,"<",$input) or die "Can't redirect STDIN to \"$input\": $!";
+      if ( ! open(STDIN,"<",$input) )
+      {
+        mtr_error("can't redirect STDIN to \"$input\": $!");
+      }
     }
     exec($path,@$arg_list_t);
   }
@@ -163,27 +184,25 @@ sub mtr_kill_leftovers () {
 
   for ( my $idx; $idx < 2; $idx++ )
   {
-#    if ( $::master->[$idx]->{'pid'} )
-#    {
-      push(@args,
-           $::master->[$idx]->{'path_mypid'},
-           $::master->[$idx]->{'path_mysock'},
-         );
-#    }
+    push(@args,{
+                pid      => 0,          # We don't know the PID
+                pidfile  => $::master->[$idx]->{'path_mypid'},
+                sockfile => $::master->[$idx]->{'path_mysock'},
+                port     => $::master->[$idx]->{'path_myport'},
+               });
   }
 
   for ( my $idx; $idx < 3; $idx++ )
   {
-#    if ( $::slave->[$idx]->{'pid'} )
-#    {
-      push(@args,
-           $::slave->[$idx]->{'path_mypid'},
-           $::slave->[$idx]->{'path_mysock'},
-         );
-#    }
+    push(@args,{
+                pid       => 0,         # We don't know the PID
+                pidfile   => $::slave->[$idx]->{'path_mypid'},
+                sockfile  => $::slave->[$idx]->{'path_mysock'},
+                port      => $::slave->[$idx]->{'path_myport'},
+               });
   }
 
-  mtr_stop_servers(\@args);
+  mtr_stop_mysqld_servers(\@args, 1);
 
   # We scan the "var/run/" directory for other process id's to kill
   my $rundir= "$::glob_mysql_test_dir/var/run"; # FIXME $path_run_dir or something
@@ -211,17 +230,29 @@ sub mtr_kill_leftovers () {
     }
     closedir(RUNDIR);
 
-    my $retries= 10;                    # 10 seconds
-    do
-    {
-      kill(9, @pids);
-    } while ( $retries-- and  kill(0, @pids) );
+    start_reap_all();
 
-    if ( kill(0, @pids) )
+    if ( $::glob_cygwin_perl )
     {
-      mtr_error("can't kill processes " . join(" ", @pids));
+      # We have no (easy) way of knowing the Cygwin controlling
+      # process, in the PID file we only have the Windows process id.
+      system("kill -f " . join(" ",@pids)); # Hope for the best....
+    }
+    else
+    {
+      my $retries= 10;                    # 10 seconds
+      do
+      {
+        kill(9, @pids);
+      } while ( $retries-- and  kill(0, @pids) );
+
+      if ( kill(0, @pids) )
+      {
+        mtr_error("can't kill processes " . join(" ", @pids));
+      }
     }
 
+    stop_reap_all();
   }
 }
 
@@ -237,185 +268,200 @@ sub mtr_kill_leftovers () {
 # This is not perfect, there could still be other server processes
 # left.
 
-sub mtr_stop_servers ($) {
-  my $spec= shift;
+# Force flag is to be set only for killing mysqld servers this script
+# didn't create in this run, i.e. initial cleanup before we start working.
+# If force flag is set, we try to kill all with mysqladmin, and
+# give up if we have no PIDs.
 
+# FIXME On some operating systems, $srv->{'pid'} and $srv->{'pidfile'}
+#       will not be the same PID. We need to try to kill both I think.
+
+sub mtr_stop_mysqld_servers ($$) {
+  my $spec=  shift;
+  my $force= shift;
+
+  # ----------------------------------------------------------------------
+  # If the process was not started from this file, we got no PID,
+  # we try to find it in the PID file.
+  # ----------------------------------------------------------------------
+
+  my $any_pid= 0;                     # If we have any PIDs
+
+  foreach my $srv ( @$spec )
+  {
+    if ( ! $srv->{'pid'} and -f $srv->{'pidfile'} )
+    {
+      $srv->{'pid'}= mtr_get_pid_from_file($srv->{'pidfile'});
+    }
+    if ( $srv->{'pid'} )
+    {
+      $any_pid= 1;
+    }
+  }
+
+  # If the processes where started from this script, and we know
+  # no PIDs, then we don't have to do anything.
+
+  if ( ! $any_pid and ! $force )
+  {
+    # cluck "This is how we got here!";
+    return;
+  }
+
+  # ----------------------------------------------------------------------
   # First try nice normal shutdown using 'mysqladmin'
+  # ----------------------------------------------------------------------
 
+  start_reap_all();                   # Don't require waitpid() of children
+
+  foreach my $srv ( @$spec )
   {
-    my @args= @$spec;
-    while ( @args )
+    if ( -e $srv->{'sockfile'} or $srv->{'port'} )
     {
-      my $pidfile=  shift @args;        # FIXME not used here....
-      my $sockfile= shift @args;
+      # FIXME wrong log.....
+      # FIXME, stderr.....
+      # Shutdown time must be high as slave may be in reconnect
+      my $args;
 
-      if ( -f $sockfile )
+      mtr_init_args(\$args);
+
+      mtr_add_arg($args, "--no-defaults");
+      mtr_add_arg($args, "-uroot");
+      if ( -e $srv->{'sockfile'} )
       {
-
-        # FIXME wrong log.....
-        # FIXME, stderr.....
-        # Shutdown time must be high as slave may be in reconnect
-        my $opts= 
-          [
-           "--no-defaults",
-           "-uroot",
-           "--socket=$sockfile",
-           "--connect_timeout=5",
-           "--shutdown_timeout=70",
-           "shutdown",
-         ];
-        # We don't wait for termination of mysqladmin
-        mtr_spawn($::exe_mysqladmin, $opts,
-                  "", $::path_manager_log, $::path_manager_log, "");
+        mtr_add_arg($args, "--socket=%s", $srv->{'sockfile'});
       }
+      if ( $srv->{'port'} )
+      {
+        mtr_add_arg($args, "--port=%s", $srv->{'port'});
+      }
+      mtr_add_arg($args, "--connect_timeout=5");
+      mtr_add_arg($args, "--shutdown_timeout=70");
+      mtr_add_arg($args, "shutdown");
+      # We don't wait for termination of mysqladmin
+      mtr_spawn($::exe_mysqladmin, $args,
+                "", $::path_manager_log, $::path_manager_log, "");
     }
   }
 
-  # Wait for them all to remove their socket file
+  # Wait for them all to remove their pid and socket file
 
- SOCKREMOVED:
+ PIDSOCKFILEREMOVED:
   for (my $loop= $::opt_sleep_time_for_delete; $loop; $loop--)
   {
-    my $sockfiles_left= 0;
-    my @args= @$spec;
-    while ( @args )
+    my $pidsockfiles_left= 0;
+    foreach my $srv ( @$spec )
     {
-      my $pidfile=  shift @args;
-      my $sockfile= shift @args;
-      if ( -f $sockfile or -f $pidfile )
+      if ( -e $srv->{'sockfile'} or -f $srv->{'pidfile'} )
       {
-        $sockfiles_left++;              # Could be that pidfile is left
+        $pidsockfiles_left++;          # Could be that pidfile is left
       }
     }
-    if ( ! $sockfiles_left )
+    if ( ! $pidsockfiles_left )
     {
-      last SOCKREMOVED;
-    }
-    if ( $loop > 1 )
-    {
-      sleep(1);                 # One second
+      last PIDSOCKFILEREMOVED;
     }
+    mtr_debug("Sleep for 1 second waiting for pid and socket file removal");
+    sleep(1);                          # One second
   }
 
+  # ----------------------------------------------------------------------
+  # If no known PIDs, we have nothing more to try
+  # ----------------------------------------------------------------------
+
+  if ( ! $any_pid )
+  {
+    stop_reap_all();
+    return;
+  }
+
+  # ----------------------------------------------------------------------
   # We may have killed all that left a socket, but we are not sure we got
-  # them all killed. We now check the PID file, if any
-
-  # Try nice kill with SIG_TERM
+  # them all killed. If we suspect it lives, try nice kill with SIG_TERM.
+  # Note that for true Win32 processes, kill(0,$pid) will not return 1.
+  # ----------------------------------------------------------------------
 
+ SIGNAL:
+  foreach my $sig (15,9)
   {
-    my @args= @$spec;
-    while ( @args )
+    my $process_left= 0;
+    foreach my $srv ( @$spec )
     {
-      my $pidfile=  shift @args;
-      my $sockfile= shift @args;
-      if (-f $pidfile)
+      if ( $srv->{'pid'} and
+           ( -f $srv->{'pidfile'} or kill(0,$srv->{'pid'}) ) )
       {
-        my $pid= mtr_get_pid_from_file($pidfile);
-        mtr_warning("process $pid not cooperating with mysqladmin, " .
-                    "will send TERM signal to process");
-        kill(15,$pid);          # SIG_TERM
+        $process_left++;
+        mtr_warning("process $srv->{'pid'} not cooperating, " .
+                    "will send signal $sig to process");
+        kill($sig,$srv->{'pid'});       # SIG_TERM
+      }
+      if ( ! $process_left )
+      {
+        last SIGNAL;
       }
     }
+    mtr_debug("Sleep for 5 seconds waiting for processes to die");
+    sleep(5);                           # We wait longer than usual
   }
 
-  # Wait for them all to die
-
-  for (my $loop= $::opt_sleep_time_for_delete; $loop; $loop--)
-  {
-    my $pidfiles_left= 0;
-    my @args= @$spec;
-    while ( @args )
-    {
-      my $pidfile=  shift @args;
-      my $sockfile= shift @args;
-      if ( -f $pidfile )
-      {
-        $pidfiles_left++;
-      }
-    }
-    if ( ! $pidfiles_left )
-    {
-      return;
-    }
-    if ( $loop > 1 )
-    {
-      sleep(1);                 # One second
-    }
-  }
-
-  # Try hard kill with SIG_KILL
+  # ----------------------------------------------------------------------
+  # Now, we check if all we can find using kill(0,$pid) are dead,
+  # and just assume the rest are. We cleanup socket and PID files.
+  # ----------------------------------------------------------------------
 
   {
-    my @args= @$spec;
-    while ( @args )
+    my $errors= 0;
+    foreach my $srv ( @$spec )
     {
-      my $pidfile=  shift @args;
-      my $sockfile= shift @args;
-      if (-f $pidfile)
+      if ( $srv->{'pid'} )
       {
-        my $pid= mtr_get_pid_from_file($pidfile);
-        mtr_warning("$pid did not die from TERM signal, ",
-                    "will send KILL signal to process");
-        kill(9,$pid);
-      }
-    }
-  }
-
-  # We check with Perl "kill 0" if process still exists
-
- PIDFILES:
-  for (my $loop= $::opt_sleep_time_for_delete; $loop; $loop--)
-  {
-    my $not_terminated= 0;
-    my @args= @$spec;
-    while ( @args )
-    {
-      my $pidfile=  shift @args;
-      my $sockfile= shift @args;
-      if (-f $pidfile)
-      {
-        my $pid= mtr_get_pid_from_file($pidfile);
-        if ( ! kill(0,$pid) )
+        if ( kill(0,$srv->{'pid'}) )
         {
-          $not_terminated++;
-          mtr_warning("could't kill $pid");
+          # FIXME In Cygwin there seem to be some fast reuse
+          # of PIDs, so dying may not be the right thing to do.
+          $errors++;
+          mtr_warning("can't kill process $srv->{'pid'}");
+        }
+        else
+        {
+          # We managed to kill it at last
+          # FIXME In Cygwin, we will get here even if the process lives.
+
+          # Not needed as we know the process is dead, but to be safe
+          # we unlink and check success in two steps. We first unlink
+          # without checking the error code, and then check if the
+          # file still exists.
+
+          foreach my $file ($srv->{'pidfile'}, $srv->{'sockfile'})
+          {
+            unlink($file);
+            if ( -e $file )
+            {
+              $errors++;
+              mtr_warning("couldn't delete $file");
+            }
+          }
         }
       }
     }
-    if ( ! $not_terminated )
+    if ( $errors )
     {
-      last PIDFILES;
-    }
-    if ( $loop > 1 )
-    {
-      sleep(1);                 # One second
+      # We are in trouble, just die....
+      mtr_error("we could not kill or clean up all processes");
     }
   }
 
-  {
-    my $pidfiles_left= 0;
-    my @args= @$spec;
-    while ( @args )
-    {
-      my $pidfile=  shift @args;
-      my $sockfile= shift @args;
-      if ( -f $pidfile )
-      {
-        if ( ! unlink($pidfile) )
-        {
-          $pidfiles_left++;
-          mtr_warning("could't delete $pidfile");
-        }
-      }
-    }
-    if ( $pidfiles_left )
-    {
-      mtr_error("one or more pid files could not be deleted");
-    }
-  }
+  stop_reap_all();
 
   # FIXME We just assume they are all dead, we don't know....
 }
 
+sub start_reap_all {
+  $SIG{CHLD}= 'IGNORE';                 # FIXME is this enough?
+}
+
+sub stop_reap_all {
+  $SIG{CHLD}= 'DEFAULT';
+}
 
 1;
diff --git a/mysql-test/lib/mtr_report.pl b/mysql-test/lib/mtr_report.pl
index 350cd993f19..0f75fc1341a 100644
--- a/mysql-test/lib/mtr_report.pl
+++ b/mysql-test/lib/mtr_report.pl
@@ -14,6 +14,7 @@ sub mtr_report_test_skipped($);
 sub mtr_show_failed_diff ($);
 sub mtr_report_stats ($);
 sub mtr_print_line ();
+sub mtr_print_thick_line ();
 sub mtr_print_header ();
 sub mtr_report (@);
 sub mtr_warning (@);
@@ -214,6 +215,10 @@ sub mtr_print_line () {
   print '-' x 55, "\n";
 }
 
+sub mtr_print_thick_line () {
+  print '=' x 55, "\n";
+}
+
 sub mtr_print_header () {
   print "\n";
   if ( $::opt_timer )
@@ -250,7 +255,7 @@ sub mtr_error (@) {
 sub mtr_debug (@) {
   if ( $::opt_script_debug )
   {
-    print "mysql-test-run: DEBUG: ",join(" ", @_),"\n";
+    print STDERR "####: ",join(" ", @_),"\n";
   }
 }
 
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 5565d29fb7b..01729aa1018 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -67,6 +67,11 @@
 # is to use the Devel::Trace package found at
 # "http://www.plover.com/~mjd/perl/Trace/" and run this script like
 # "perl -d:Trace mysql-test-run.pl"
+#
+# FIXME Save a PID file from this code as well, to record the process
+#       id we think it has. In Cygwin, a fork creates one Cygwin process,
+#       and then the real Win32 process. Cygwin Perl can only kill Cygwin
+#       processes. And "mysqld --bootstrap ..." doesn't save a PID file.
 
 $Devel::Trace::TRACE= 0;       # Don't trace boring init stuff
 
@@ -147,7 +152,9 @@ our @mysqld_src_dirs=
 
 # Misc global variables
 
-our $glob_win32=                  0;
+our $glob_win32=                  0; # OS and native Win32 executables
+our $glob_win32_perl=             0; # ActiveState Win32 Perl
+our $glob_cygwin_perl=            0; # Cygwin Perl
 our $glob_mysql_test_dir=         undef;
 our $glob_mysql_bench_dir=        undef;
 our $glob_hostname=               undef;
@@ -383,7 +390,9 @@ sub initial_setup () {
 
   $glob_scriptname=  basename($0);
 
-  $glob_win32= ($^O eq "MSWin32");
+  $glob_win32_perl=  ($^O eq "MSWin32");
+  $glob_cygwin_perl= ($^O eq "cygwin");
+  $glob_win32=       ($glob_win32_perl or $glob_cygwin_perl);
 
   # We require that we are in the "mysql-test" directory
   # to run mysql-test-run
@@ -404,6 +413,12 @@ sub initial_setup () {
 
   # 'basedir' is always parent of "mysql-test" directory
   $glob_mysql_test_dir=  cwd();
+  if ( $glob_cygwin_perl )
+  {
+    # Windows programs like 'mysqld' needs Windows paths
+    $glob_mysql_test_dir= `cygpath -m $glob_mysql_test_dir`;
+    chomp($glob_mysql_test_dir);
+  }
   $glob_basedir=         dirname($glob_mysql_test_dir);
   $glob_mysql_bench_dir= "$glob_basedir/mysql-bench"; # FIXME make configurable
 
@@ -991,7 +1006,7 @@ sub collect_test_cases ($) {
 
     if ( -f $master_sh )
     {
-      if ( $glob_win32 )
+      if ( $glob_win32_perl )
       {
         $tinfo->{'skip'}= 1;
       }
@@ -1004,7 +1019,7 @@ sub collect_test_cases ($) {
 
     if ( -f $slave_sh )
     {
-      if ( $glob_win32 )
+      if ( $glob_win32_perl )
       {
         $tinfo->{'skip'}= 1;
       }
@@ -1115,6 +1130,7 @@ sub sleep_until_file_created ($$) {
     {
       return;
     }
+    mtr_debug("Sleep for 1 second waiting for creation of $pidfile");
     sleep(1);
   }
 
@@ -1396,6 +1412,8 @@ sub run_testcase ($) {
   # the preparation.
   # ----------------------------------------------------------------------
 
+  mtr_report_test_name($tinfo);
+
   mtr_tofile($master->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
   do_before_start_master($tname,$tinfo->{'master_sh'});
 
@@ -1403,8 +1421,6 @@ sub run_testcase ($) {
   # Start masters
   # ----------------------------------------------------------------------
 
-  mtr_report_test_name($tinfo);
-
   if ( ! $glob_use_running_server and ! $glob_use_embedded_server )
   {
     # FIXME give the args to the embedded server?!
@@ -1914,15 +1930,17 @@ sub stop_masters () {
     # the mysqld process from being killed
     if ( $master->[$idx]->{'pid'} )
     {
-      push(@args,
-           $master->[$idx]->{'path_mypid'},
-           $master->[$idx]->{'path_mysock'},
-         );
-      $master->[$idx]->{'pid'}= 0;
+      push(@args,{
+                  pid      => $master->[$idx]->{'pid'},
+                  pidfile  => $master->[$idx]->{'path_mypid'},
+                  sockfile => $master->[$idx]->{'path_mysock'},
+                  port     => $master->[$idx]->{'path_myport'},
+                 });
+      $master->[$idx]->{'pid'}= 0; # Assume we are done with it
     }
   }
 
-  mtr_stop_servers(\@args);
+  mtr_stop_mysqld_servers(\@args, 0);
 }
 
 sub stop_slaves () {
@@ -1934,15 +1952,17 @@ sub stop_slaves () {
   {
     if ( $slave->[$idx]->{'pid'} )
     {
-      push(@args,
-           $slave->[$idx]->{'path_mypid'},
-           $slave->[$idx]->{'path_mysock'},
-         );
-      $slave->[$idx]->{'pid'}= 0;
+      push(@args,{
+                  pid      => $slave->[$idx]->{'pid'},
+                  pidfile  => $slave->[$idx]->{'path_mypid'},
+                  sockfile => $slave->[$idx]->{'path_mysock'},
+                  port     => $slave->[$idx]->{'path_myport'},
+                 });
+      $slave->[$idx]->{'pid'}= 0; # Assume we are done with it
     }
   }
 
-  mtr_stop_servers(\@args);
+  mtr_stop_mysqld_servers(\@args, 0);
 }
 
 

From 7d0d1919999447482475820233b815899095a99b Mon Sep 17 00:00:00 2001
From: "joreland@mysql.com" <>
Date: Mon, 3 Jan 2005 19:39:09 +0100
Subject: [PATCH 03/11] bug#7626 - ndb UintPtr handling

---
 ndb/include/ndb_types.h | 27 +++++++++------------------
 1 file changed, 9 insertions(+), 18 deletions(-)

diff --git a/ndb/include/ndb_types.h b/ndb/include/ndb_types.h
index 0d603cc2ab3..1284ace3bbc 100644
--- a/ndb/include/ndb_types.h
+++ b/ndb/include/ndb_types.h
@@ -30,31 +30,22 @@ typedef unsigned int   Uint32;
 
 typedef unsigned int UintR;
 
-#ifdef __SIZE_TYPE__
-typedef __SIZE_TYPE__ UintPtr;
-#else
-#include <ndb_global.h>
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-#if defined(WIN32) || defined(NDB_WIN32)
-typedef Uint32 UintPtr;
-#else
-typedef uintptr_t UintPtr;
-#endif
-#endif
-
 #if defined(WIN32) || defined(NDB_WIN32)
 typedef unsigned __int64 Uint64;
 typedef   signed __int64 Int64;
-typedef UintPtr ssize_t;
 #else
 typedef unsigned long long Uint64;
 typedef   signed long long Int64;
 #endif
 
+#ifdef __SIZE_TYPE__
+typedef __SIZE_TYPE__ UintPtr;
+#else
+#if SIZEOF_CHARP == 4
+typedef Uint32 UintPtr;
+#else
+typedef Uint64 UintPtr;
+#endif
+#endif
 
 #endif

From 18920d4831940c1c240b5a0fb9d67d73c060204a Mon Sep 17 00:00:00 2001
From: "joreland@mysql.com" <>
Date: Mon, 3 Jan 2005 20:10:23 +0100
Subject: [PATCH 04/11] bug#7626 - post review version

---
 ndb/include/ndb_global.h.in | 36 ++++++++++++++++++++++++++++++++++++
 ndb/include/ndb_types.h     | 27 +--------------------------
 2 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/ndb/include/ndb_global.h.in b/ndb/include/ndb_global.h.in
index aefb319730c..cadbb8cabf2 100644
--- a/ndb/include/ndb_global.h.in
+++ b/ndb/include/ndb_global.h.in
@@ -16,12 +16,48 @@
 #define HAVE_STRCASECMP
 #define strcasecmp _strcmpi
 #pragma warning(disable: 4503 4786)
+typedef unsigned __int64 Uint64;
+typedef   signed __int64 Int64;
 #else
 #undef NDB_WIN32
 #define DIR_SEPARATOR "/"
+typedef unsigned long long Uint64;
+typedef   signed long long Int64;
 #endif
 
 #include <my_global.h>
+
+typedef   signed char  Int8;
+typedef unsigned char  Uint8;
+typedef   signed short Int16;
+typedef unsigned short Uint16;
+typedef   signed int   Int32;
+typedef unsigned int   Uint32;
+
+typedef unsigned int UintR;
+
+#ifdef __SIZE_TYPE__
+typedef __SIZE_TYPE__ UintPtr;
+#elif SIZEOF_CHARP == 4
+typedef Uint32 UintPtr;
+#elif SIZEOF_CHARP == 8
+typedef Uint64 UintPtr;
+#else
+#error "Unknown size of (char *)"
+#endif
+
+#if ! (SIZEOF_CHAR == 1)
+#error "Invalid define for Uint8"
+#endif
+
+#if ! (SIZEOF_INT == 4)
+#error "Invalid define for Uint32"
+#endif
+
+#if ! (SIZEOF_LONG_LONG == 8)
+#error "Invalid define for Uint64"
+#endif
+
 #include <my_alarm.h>
 
 #ifdef _AIX
diff --git a/ndb/include/ndb_types.h b/ndb/include/ndb_types.h
index 1284ace3bbc..6cf9bb40d7f 100644
--- a/ndb/include/ndb_types.h
+++ b/ndb/include/ndb_types.h
@@ -21,31 +21,6 @@
 #ifndef NDB_TYPES_H
 #define NDB_TYPES_H
 
-typedef   signed char  Int8;
-typedef unsigned char  Uint8;
-typedef   signed short Int16;
-typedef unsigned short Uint16;
-typedef   signed int   Int32;
-typedef unsigned int   Uint32;
-
-typedef unsigned int UintR;
-
-#if defined(WIN32) || defined(NDB_WIN32)
-typedef unsigned __int64 Uint64;
-typedef   signed __int64 Int64;
-#else
-typedef unsigned long long Uint64;
-typedef   signed long long Int64;
-#endif
-
-#ifdef __SIZE_TYPE__
-typedef __SIZE_TYPE__ UintPtr;
-#else
-#if SIZEOF_CHARP == 4
-typedef Uint32 UintPtr;
-#else
-typedef Uint64 UintPtr;
-#endif
-#endif
+#include "ndb_global.h"
 
 #endif

From 76d0f49495ea712054d07affd07f874c84934627 Mon Sep 17 00:00:00 2001
From: "ingo@mysql.com" <>
Date: Mon, 3 Jan 2005 20:48:49 +0100
Subject: [PATCH 05/11] Fixed a typo.

---
 mysys/mf_keycaches.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mysys/mf_keycaches.c b/mysys/mf_keycaches.c
index 8bf203e249f..fee3096de52 100644
--- a/mysys/mf_keycaches.c
+++ b/mysys/mf_keycaches.c
@@ -235,7 +235,7 @@ static my_bool safe_hash_set(SAFE_HASH *hash, const byte *key, uint length,
     if (my_hash_insert(&hash->hash, (byte*) entry))
     {
       /* This can only happen if hash got out of memory */
-      my_delete((char*) entry, MYF(0));
+      my_free((char*) entry, MYF(0));
       error= 1;
       goto end;
     }

From 2e95c0f49a7863a1df2d219b45a1af2f1ddbae3b Mon Sep 17 00:00:00 2001
From: "lenz@mysql.com" <>
Date: Mon, 3 Jan 2005 21:28:14 +0100
Subject: [PATCH 06/11] - Updated Bootstrap to include merge ChangeSets in the
 source distribution's   ChangeLog, too (to be more exact when tagging a
 release that's based on a   merge ChangeSet)

---
 Build-tools/Bootstrap | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Build-tools/Bootstrap b/Build-tools/Bootstrap
index fc36c51ec85..10211dbb59c 100755
--- a/Build-tools/Bootstrap
+++ b/Build-tools/Bootstrap
@@ -252,7 +252,7 @@ if (defined $opt_changelog)
 	$msg= "Adding $target_dir/ChangeLog";
 	$msg.= " (down to revision $opt_changelog)" if $opt_changelog ne "";
 	&logger($msg);
-	$command= "bk changes -mv";
+	$command= "bk changes -v";
 	$command.= " -r" if ($opt_changelog ne "" || $opt_revision);
 	$command.= $opt_changelog if $opt_changelog ne "";
 	$command.= ".." if ($opt_changelog ne "" && !$opt_revision);

From 0f835244a6100ba573b166ce25ddd87b7d148dda Mon Sep 17 00:00:00 2001
From: "jimw@mysql.com" <>
Date: Mon, 3 Jan 2005 23:02:26 +0100
Subject: [PATCH 07/11] Fix typo in crash-me 'MATCHES' test (Bug # 5875)

---
 sql-bench/crash-me.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sql-bench/crash-me.sh b/sql-bench/crash-me.sh
index 8ec62442b11..a40ef8fbc7d 100644
--- a/sql-bench/crash-me.sh
+++ b/sql-bench/crash-me.sh
@@ -1039,7 +1039,7 @@ try_and_report("Automatic row id", "automatic_rowid",
  ["MATCH UNIQUE","match_unique",
    "1 match unique (select a from crash_me)",1,0],
  ["MATCH","match","1 match (select a from crash_me)",1,0],
- ["MATCHES","matches","b matcjhes 'a*'",1,0],
+ ["MATCHES","matches","b matches 'a*'",1,0],
  ["NOT BETWEEN","not_between","7 not between 4 and 6",1,0],
  ["NOT EXISTS","not_exists",
    "not exists (select * from crash_me where a = 2)",1,0],

From 663396653ab5ebed874d7ec89daf6e8e86472c9e Mon Sep 17 00:00:00 2001
From: "jimw@mysql.com" <>
Date: Tue, 4 Jan 2005 01:49:29 +0100
Subject: [PATCH 08/11] Use 'ps xaww' in mysqld_safe (on Linux) so whole
 command-line is searched for port and/or pid-file parameters. (Bug #5878)

---
 scripts/mysqld_safe.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh
index 1f4d17f8885..270c08679eb 100644
--- a/scripts/mysqld_safe.sh
+++ b/scripts/mysqld_safe.sh
@@ -322,13 +322,13 @@ do
     # but should work for the rest of the servers.
     # The only thing is ps x => redhat 5 gives warnings when using ps -x.
     # kill -9 is used or the process won't react on the kill.
-    numofproces=`ps xa | grep -v "grep" | grep "$ledir/$MYSQLD\>" | grep -c "pid-file=$pid_file"`
+    numofproces=`ps xaww | grep -v "grep" | grep "$ledir/$MYSQLD\>" | grep -c "pid-file=$pid_file"`
 
     echo -e "\nNumber of processes running now: $numofproces" | tee -a $err_log
     I=1
     while test "$I" -le "$numofproces"
     do 
-      PROC=`ps xa | grep "$ledir/$MYSQLD\>" | grep -v "grep" | grep "pid-file=$pid_file" | sed -n '$p'` 
+      PROC=`ps xaww | grep "$ledir/$MYSQLD\>" | grep -v "grep" | grep "pid-file=$pid_file" | sed -n '$p'` 
 
       for T in $PROC
       do

From 954d0181ec65595d887bd2953c0b8a4bbd228ef1 Mon Sep 17 00:00:00 2001
From: "jimw@mysql.com" <>
Date: Tue, 4 Jan 2005 02:45:01 +0100
Subject: [PATCH 09/11] Make query_cache_wlock_invalidate visible in SHOW
 VARIABLES (Bug #7594)

---
 sql/set_var.cc | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sql/set_var.cc b/sql/set_var.cc
index d5aadbfbdab..122daa0ea95 100644
--- a/sql/set_var.cc
+++ b/sql/set_var.cc
@@ -593,6 +593,8 @@ struct show_var_st init_vars[]= {
   {sys_query_cache_limit.name,(char*) &sys_query_cache_limit,	    SHOW_SYS},
   {sys_query_cache_size.name, (char*) &sys_query_cache_size,	    SHOW_SYS},
   {sys_query_cache_type.name, (char*) &sys_query_cache_type,        SHOW_SYS},
+  {sys_query_cache_wlock_invalidate.name,
+   (char*) &sys_query_cache_wlock_invalidate, SHOW_SYS},
 #endif /* HAVE_QUERY_CACHE */
   {sys_query_prealloc_size.name, (char*) &sys_query_prealloc_size,  SHOW_SYS},
   {sys_range_alloc_block_size.name, (char*) &sys_range_alloc_block_size,

From 913f50576956b8b07c161f01aa09979c7dd34b64 Mon Sep 17 00:00:00 2001
From: "paul@kite-hub.kitebird.com" <>
Date: Tue, 4 Jan 2005 10:32:42 -0600
Subject: [PATCH 10/11] client.c:   Make multi-statements the preferred option
 name (to coincide   with the renaming of the CLIENT_MULTI_RESULTS symbol to  
 CLIENT_MULTI_STATEMENTS). Continue to allow multi-queries   for backward
 compatibility.

---
 sql-common/client.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/sql-common/client.c b/sql-common/client.c
index 87a781e0a0d..b6813ee4cfc 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -882,7 +882,7 @@ static const char *default_options[]=
   "connect-timeout", "local-infile", "disable-local-infile",
   "replication-probe", "enable-reads-from-master", "repl-parse-query",
   "ssl-cipher", "max-allowed-packet", "protocol", "shared-memory-base-name",
-  "multi-results", "multi-queries", "secure-auth",
+  "multi-results", "multi-statements", "multi-queries", "secure-auth",
   NullS
 };
 
@@ -1088,9 +1088,10 @@ void mysql_read_default_options(struct st_mysql_options *options,
 	  options->client_flag|= CLIENT_MULTI_RESULTS;
 	  break;
 	case 31:
+	case 32:
 	  options->client_flag|= CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS;
 	  break;
-        case 32: /* secure-auth */
+        case 33: /* secure-auth */
           options->secure_auth= TRUE;
           break;
 	default:

From de85fdb78faa8531606e17aa2b2a15d55b5f2b5a Mon Sep 17 00:00:00 2001
From: "kent@mysql.com" <>
Date: Tue, 4 Jan 2005 23:07:29 +0100
Subject: [PATCH 11/11] mysql_test_run_new.dsp:   Link mysql_test_run_new as
 console application my_manage.c:   The type intptr_t isn't defined for VC 6.0
   Changed return type for CreateProcess() to bool mysql_test_run_new.c:   The
 type intptr_t isn't defined for VC 6.0 mysqltest.dsp:   Added regex to
 additional build types for mysqltest mysqldump.dsp:   Added mysys.lib for
 linking mysqldump

---
 VC++Files/client/mysqldump.dsp              | 12 ++++++------
 VC++Files/client/mysqltest.dsp              | 16 ++++++++--------
 VC++Files/mysql-test/mysql_test_run_new.dsp |  4 ++--
 mysql-test/my_manage.c                      | 10 +++++++++-
 mysql-test/mysql_test_run_new.c             |  7 ++++++-
 5 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/VC++Files/client/mysqldump.dsp b/VC++Files/client/mysqldump.dsp
index a1ebdfe11a6..3c955639596 100644
--- a/VC++Files/client/mysqldump.dsp
+++ b/VC++Files/client/mysqldump.dsp
@@ -51,8 +51,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo
 # ADD BSC32 /nologo
 LINK32=xilink6.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"../client_release/mysqldump.exe" /libpath:"..\lib_release\\"
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mysys.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mysys.lib /nologo /subsystem:console /machine:I386 /out:"../client_release/mysqldump.exe" /libpath:"..\lib_release\\"
 
 !ELSEIF  "$(CFG)" == "mysqldump - Win32 Debug"
 
@@ -76,8 +76,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo
 # ADD BSC32 /nologo
 LINK32=xilink6.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/mysqldump.exe" /pdbtype:sept /libpath:"..\lib_debug\\"
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mysys.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mysys.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"../client_debug/mysqldump.exe" /pdbtype:sept /libpath:"..\lib_debug\\"
 
 !ELSEIF  "$(CFG)" == "mysqldump - Win32 classic"
 
@@ -103,8 +103,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo
 # ADD BSC32 /nologo
 LINK32=xilink6.exe
-# ADD BASE LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"../client_release/mysqldump.exe" /libpath:"..\lib_release\\"
-# ADD LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"../client_classic/mysqldump.exe" /libpath:"..\lib_release\\"
+# ADD BASE LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mysys.lib /nologo /subsystem:console /machine:I386 /out:"../client_release/mysqldump.exe" /libpath:"..\lib_release\\"
+# ADD LINK32 mysqlclient.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib mysys.lib /nologo /subsystem:console /machine:I386 /out:"../client_classic/mysqldump.exe" /libpath:"..\lib_release\\"
 
 !ENDIF
 
diff --git a/VC++Files/client/mysqltest.dsp b/VC++Files/client/mysqltest.dsp
index 1f1613026a9..d04dc5bfce8 100644
--- a/VC++Files/client/mysqltest.dsp
+++ b/VC++Files/client/mysqltest.dsp
@@ -67,8 +67,8 @@ LINK32=link.exe
 # PROP Output_Dir ".\classic"
 # PROP Intermediate_Dir ".\classic"
 # PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /I "../include" /I "../" /W3 /Ob1 /G6 /D "_CONSOLE" /D "_WINDOWS" /D "LICENSE=Commercial" /D "DBUG_OFF" /D "NDEBUG" /D "_MBCS" /GF /Gy /Fp".\classic/mysqltest.pch" /Fo".\classic/" /Fd".\classic/" /c /GX 
-# ADD CPP /nologo /MT /I "../include" /I "../" /W3 /Ob1 /G6 /D "_CONSOLE" /D "_WINDOWS" /D "LICENSE=Commercial" /D "DBUG_OFF" /D "NDEBUG" /D "_MBCS" /GF /Gy /Fp".\classic/mysqltest.pch" /Fo".\classic/" /Fd".\classic/" /c /GX 
+# ADD BASE CPP /nologo /MT /I "../include" /I "../regex" /I "../" /W3 /Ob1 /G6 /D "_CONSOLE" /D "_WINDOWS" /D "LICENSE=Commercial" /D "DBUG_OFF" /D "NDEBUG" /D "_MBCS" /GF /Gy /Fp".\classic/mysqltest.pch" /Fo".\classic/" /Fd".\classic/" /c /GX 
+# ADD CPP /nologo /MT /I "../include" /I "../regex" /I "../" /W3 /Ob1 /G6 /D "_CONSOLE" /D "_WINDOWS" /D "LICENSE=Commercial" /D "DBUG_OFF" /D "NDEBUG" /D "_MBCS" /GF /Gy /Fp".\classic/mysqltest.pch" /Fo".\classic/" /Fd".\classic/" /c /GX 
 # ADD BASE MTL /nologo /tlb".\classic\mysqltest.tlb" /win32 
 # ADD MTL /nologo /tlb".\classic\mysqltest.tlb" /win32 
 # ADD BASE RSC /l 1033 /d "NDEBUG" 
@@ -77,8 +77,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo 
 # ADD BSC32 /nologo 
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib mysqlclient.lib wsock32.lib /nologo /out:"..\client_classic\mysqltest.exe" /incremental:no /libpath:"..\lib_release\" /pdb:".\classic\mysqltest.pdb" /pdbtype:sept /subsystem:console /MACHINE:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib mysqlclient.lib wsock32.lib /nologo /out:"..\client_classic\mysqltest.exe" /incremental:no /libpath:"..\lib_release\" /pdb:".\classic\mysqltest.pdb" /pdbtype:sept /subsystem:console /MACHINE:I386
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib mysqlclient.lib wsock32.lib mysys.lib regex.lib /nologo /out:"..\client_classic\mysqltest.exe" /incremental:no /libpath:"..\lib_release\" /pdb:".\classic\mysqltest.pdb" /pdbtype:sept /subsystem:console /MACHINE:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib mysqlclient.lib wsock32.lib mysys.lib regex.lib /nologo /out:"..\client_classic\mysqltest.exe" /incremental:no /libpath:"..\lib_release\" /pdb:".\classic\mysqltest.pdb" /pdbtype:sept /subsystem:console /MACHINE:I386
 
 !ELSEIF  "$(CFG)" == "mysqltest - Win32 Release"
 
@@ -92,8 +92,8 @@ LINK32=link.exe
 # PROP Output_Dir ".\release"
 # PROP Intermediate_Dir ".\release"
 # PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /I "../include" /I "../" /W3 /Ob1 /G6 /D "DBUG_OFF" /D "_CONSOLE" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /GF /Gy /Fp".\release/mysqltest.pch" /Fo".\release/" /Fd".\release/" /c /GX 
-# ADD CPP /nologo /MT /I "../include" /I "../" /W3 /Ob1 /G6 /D "DBUG_OFF" /D "_CONSOLE" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /GF /Gy /Fp".\release/mysqltest.pch" /Fo".\release/" /Fd".\release/" /c /GX 
+# ADD BASE CPP /nologo /MT /I "../include" /I "../regex" /I "../" /W3 /Ob1 /G6 /D "DBUG_OFF" /D "_CONSOLE" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /GF /Gy /Fp".\release/mysqltest.pch" /Fo".\release/" /Fd".\release/" /c /GX 
+# ADD CPP /nologo /MT /I "../include" /I "../regex" /I "../" /W3 /Ob1 /G6 /D "DBUG_OFF" /D "_CONSOLE" /D "_WINDOWS" /D "NDEBUG" /D "_MBCS" /GF /Gy /Fp".\release/mysqltest.pch" /Fo".\release/" /Fd".\release/" /c /GX 
 # ADD BASE MTL /nologo /tlb".\release\mysqltest.tlb" /win32 
 # ADD MTL /nologo /tlb".\release\mysqltest.tlb" /win32 
 # ADD BASE RSC /l 1033 /d "NDEBUG" 
@@ -102,8 +102,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo 
 # ADD BSC32 /nologo 
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib mysqlclient.lib wsock32.lib /nologo /out:"..\client_release\mysqltest.exe" /incremental:no /libpath:"..\lib_release\" /pdb:".\release\mysqltest.pdb" /pdbtype:sept /subsystem:console /MACHINE:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib mysqlclient.lib wsock32.lib /nologo /out:"..\client_release\mysqltest.exe" /incremental:no /libpath:"..\lib_release\" /pdb:".\release\mysqltest.pdb" /pdbtype:sept /subsystem:console /MACHINE:I386
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib mysqlclient.lib wsock32.lib mysys.lib regex.lib /nologo /out:"..\client_release\mysqltest.exe" /incremental:no /libpath:"..\lib_release\" /pdb:".\release\mysqltest.pdb" /pdbtype:sept /subsystem:console /MACHINE:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib mysqlclient.lib wsock32.lib mysys.lib regex.lib /nologo /out:"..\client_release\mysqltest.exe" /incremental:no /libpath:"..\lib_release\" /pdb:".\release\mysqltest.pdb" /pdbtype:sept /subsystem:console /MACHINE:I386
 
 !ENDIF
 
diff --git a/VC++Files/mysql-test/mysql_test_run_new.dsp b/VC++Files/mysql-test/mysql_test_run_new.dsp
index 7e43da20b26..61392b00b94 100644
--- a/VC++Files/mysql-test/mysql_test_run_new.dsp
+++ b/VC++Files/mysql-test/mysql_test_run_new.dsp
@@ -76,8 +76,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo 
 # ADD BSC32 /nologo 
 LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib Ws2_32.lib /nologo /out:"..\mysql-test\mysql_test_run_new.exe" /incremental:no /pdb:".\Release\mysql_test_run_new.pdb" /pdbtype:sept /subsystem:windows 
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib Ws2_32.lib /nologo /out:"..\mysql-test\mysql_test_run_new.exe" /incremental:no /pdb:".\Release\mysql_test_run_new.pdb" /pdbtype:sept /subsystem:windows 
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib Ws2_32.lib /nologo /out:"..\mysql-test\mysql_test_run_new.exe" /incremental:no /pdb:".\Release\mysql_test_run_new.pdb" /pdbtype:sept /subsystem:console 
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib odbc32.lib odbccp32.lib Ws2_32.lib /nologo /out:"..\mysql-test\mysql_test_run_new.exe" /incremental:no /pdb:".\Release\mysql_test_run_new.pdb" /pdbtype:sept /subsystem:console 
 
 !ENDIF
 
diff --git a/mysql-test/my_manage.c b/mysql-test/my_manage.c
index 472b0d32683..1f006f7ab90 100644
--- a/mysql-test/my_manage.c
+++ b/mysql-test/my_manage.c
@@ -327,7 +327,7 @@ int spawn(char *path, arg_list_t *al, int join, char *input,
 int spawn(char *path, arg_list_t *al, int join, char *input,
           char *output, char *error, HANDLE *pid)
 {
-  intptr_t result;
+  bool result;
   int i;
   STARTUPINFO startup_info;
   PROCESS_INFORMATION process_information;
@@ -665,7 +665,11 @@ void del_tree(char *dir)
   rmdir(dir);
 #else
   struct _finddata_t parent;
+#if defined(_MSC_VER) && _MSC_VER > 1200
   intptr_t handle;
+#else
+  long handle;
+#endif  /* _MSC_VER && _MSC_VER > 1200  */ 
   char temp[FN_REFLEN];
   char mask[FN_REFLEN];
 
@@ -728,7 +732,11 @@ int removef(const char *format, ...)
     va_list ap;
     char path[FN_REFLEN];
     struct _finddata_t parent;
+#if defined(_MSC_VER) && _MSC_VER > 1200
     intptr_t handle;
+#else
+    long handle;
+#endif  /* _MSC_VER && _MSC_VER > 1200  */ 
     char temp[FN_REFLEN];
     char *p;
 
diff --git a/mysql-test/mysql_test_run_new.c b/mysql-test/mysql_test_run_new.c
index fe13d71c1c2..3ffe7b28296 100644
--- a/mysql-test/mysql_test_run_new.c
+++ b/mysql-test/mysql_test_run_new.c
@@ -37,7 +37,8 @@
 #include <sys/mode.h>
 #endif
 #ifdef __WIN__
-#include <Shlwapi.h>
+#include <windows.h>
+#include <shlwapi.h>
 #include <direct.h>
 #endif
 
@@ -1544,7 +1545,11 @@ int main(int argc, char **argv)
     }
 #else
     struct _finddata_t dir;
+#if defined(_MSC_VER) && _MSC_VER > 1200
     intptr_t handle;
+#else
+    long handle;
+#endif  /* _MSC_VER && _MSC_VER > 1200  */ 
     char test[FN_LEN];
     char mask[FN_REFLEN];
     char *p;