Commit cd70986a authored by unknown's avatar unknown

Merge bk-internal:/home/bk/mysql-5.1

into  neptunus.(none):/home/msvensson/mysql/mysql-5.1-new-maint


BUILD/compile-dist:
  Auto merged
client/mysqltest.c:
  Auto merged
config/ac-macros/ssl.m4:
  Auto merged
include/config-win.h:
  Auto merged
include/my_base.h:
  Auto merged
mysql-test/mysql-test-run.pl:
  Auto merged
mysql-test/r/func_group.result:
  Auto merged
mysql-test/r/group_min_max.result:
  Auto merged
mysql-test/r/partition.result:
  Auto merged
mysql-test/r/ps.result:
  Auto merged
mysql-test/r/rpl_insert_id_pk.result:
  Auto merged
mysql-test/r/rpl_ndb_multi_update3.result:
  Auto merged
mysql-test/r/sp.result:
  Auto merged
mysql-test/t/create.test:
  Auto merged
mysql-test/t/join_outer.test:
  Auto merged
mysql-test/t/partition.test:
  Auto merged
mysql-test/t/ps.test:
  Auto merged
mysql-test/r/rpl_ndb_sp006.result:
  Auto merged
mysql-test/t/sp.test:
  Auto merged
mysys/my_clock.c:
  Auto merged
mysys/my_copy.c:
  Auto merged
mysys/my_create.c:
  Auto merged
mysys/my_dup.c:
  Auto merged
mysys/my_lib.c:
  Auto merged
mysys/my_open.c:
  Auto merged
mysys/my_redel.c:
  Auto merged
mysql-test/r/create.result:
  Manual merge
mysql-test/r/innodb_mysql.result:
  Manual merge
mysql-test/r/join_outer.result:
  Manual merge
mysql-test/t/func_group.test:
  Manual merge
mysql-test/t/group_min_max.test:
  Manual merge
mysql-test/t/innodb_mysql.test:
  Manual merge
parents 4db0d644 767e0cf4
...@@ -2518,7 +2518,7 @@ int safe_connect(MYSQL* mysql, const char *host, const char *user, ...@@ -2518,7 +2518,7 @@ int safe_connect(MYSQL* mysql, const char *host, const char *user,
{ {
int con_error= 1; int con_error= 1;
my_bool reconnect= 1; my_bool reconnect= 1;
static int connection_retry_sleep= 2; /* Seconds */ static ulong connection_retry_sleep= 100000; /* Microseconds */
int i; int i;
for (i= 0; i < opt_max_connect_retries; i++) for (i= 0; i < opt_max_connect_retries; i++)
{ {
...@@ -2528,7 +2528,7 @@ int safe_connect(MYSQL* mysql, const char *host, const char *user, ...@@ -2528,7 +2528,7 @@ int safe_connect(MYSQL* mysql, const char *host, const char *user,
con_error= 0; con_error= 0;
break; break;
} }
sleep(connection_retry_sleep); my_sleep(connection_retry_sleep);
} }
/* /*
TODO: change this to 0 in future versions, but the 'kill' test relies on TODO: change this to 0 in future versions, but the 'kill' test relies on
...@@ -3301,7 +3301,7 @@ static struct my_option my_long_options[] = ...@@ -3301,7 +3301,7 @@ static struct my_option my_long_options[] =
{"max-connect-retries", OPT_MAX_CONNECT_RETRIES, {"max-connect-retries", OPT_MAX_CONNECT_RETRIES,
"Max number of connection attempts when connecting to server", "Max number of connection attempts when connecting to server",
(gptr*) &opt_max_connect_retries, (gptr*) &opt_max_connect_retries, 0, (gptr*) &opt_max_connect_retries, (gptr*) &opt_max_connect_retries, 0,
GET_INT, REQUIRED_ARG, 5, 1, 10, 0, 0, 0}, GET_INT, REQUIRED_ARG, 500, 1, 10000, 0, 0, 0},
{"password", 'p', "Password to use when connecting to server.", {"password", 'p', "Password to use when connecting to server.",
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
{"port", 'P', "Port number to use for connection.", (gptr*) &port, {"port", 'P', "Port number to use for connection.", (gptr*) &port,
......
...@@ -30,7 +30,6 @@ functions */ ...@@ -30,7 +30,6 @@ functions */
#include <sys/locking.h> #include <sys/locking.h>
#include <windows.h> #include <windows.h>
#include <math.h> /* Because of rint() */
#include <fcntl.h> #include <fcntl.h>
#include <io.h> #include <io.h>
#include <malloc.h> #include <malloc.h>
...@@ -223,17 +222,9 @@ typedef uint rf_SetTimer; ...@@ -223,17 +222,9 @@ typedef uint rf_SetTimer;
#define inline __inline #define inline __inline
#endif /* __cplusplus */ #endif /* __cplusplus */
inline double rint(double nr)
{
double f = floor(nr);
double c = ceil(nr);
return (((c-nr) >= (nr-f)) ? f :c);
}
#ifdef _WIN64 #ifdef _WIN64
#define ulonglong2double(A) ((double) (ulonglong) (A)) #define ulonglong2double(A) ((double) (ulonglong) (A))
#define my_off_t2double(A) ((double) (my_off_t) (A)) #define my_off_t2double(A) ((double) (my_off_t) (A))
#else #else
inline double ulonglong2double(ulonglong value) inline double ulonglong2double(ulonglong value)
{ {
...@@ -339,7 +330,6 @@ inline double ulonglong2double(ulonglong value) ...@@ -339,7 +330,6 @@ inline double ulonglong2double(ulonglong value)
#define HAVE_FLOAT_H #define HAVE_FLOAT_H
#define HAVE_LIMITS_H #define HAVE_LIMITS_H
#define HAVE_STDDEF_H #define HAVE_STDDEF_H
#define HAVE_RINT /* defined in this file */
#define NO_FCNTL_NONBLOCK /* No FCNTL */ #define NO_FCNTL_NONBLOCK /* No FCNTL */
#define HAVE_ALLOCA #define HAVE_ALLOCA
#define HAVE_STRPBRK #define HAVE_STRPBRK
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#define _my_base_h #define _my_base_h
#ifndef stdin /* Included first in handler */ #ifndef stdin /* Included first in handler */
#define USES_TYPES /* my_dir with sys/types is included */
#define CHSIZE_USED #define CHSIZE_USED
#include <my_global.h> #include <my_global.h>
#include <my_dir.h> /* This includes types */ #include <my_dir.h> /* This includes types */
......
...@@ -83,5 +83,6 @@ SET FOREIGN_KEY_CHECKS=0; ...@@ -83,5 +83,6 @@ SET FOREIGN_KEY_CHECKS=0;
--error 1022, 1062 --error 1022, 1062
INSERT INTO t1 VALUES (1),(1); INSERT INTO t1 VALUES (1),(1);
sync_slave_with_master; sync_slave_with_master;
connection master;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -152,5 +152,5 @@ wait_for_slave_to_stop; ...@@ -152,5 +152,5 @@ wait_for_slave_to_stop;
drop table t2; drop table t2;
connection master; connection master;
drop table t2; drop table t2;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -126,7 +126,7 @@ show slave status; ...@@ -126,7 +126,7 @@ show slave status;
show binlog events in 'slave-bin.000005' from 4; show binlog events in 'slave-bin.000005' from 4;
# The table drops caused Cluster Replication wrapper to fail as event ID would never be the same.# Moving drops here. # The table drops caused Cluster Replication wrapper to fail as event ID would never be the same.# Moving drops here.
connection master;
DROP TABLE t1; DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t3; DROP TABLE t3;
...@@ -217,4 +217,6 @@ select "-- SLAVE AFTER JOIN --" as ""; ...@@ -217,4 +217,6 @@ select "-- SLAVE AFTER JOIN --" as "";
select * from t1; select * from t1;
select * from t2; select * from t2;
connection master;
DROP TABLE t1, t2;
# End of 4.1 tests # End of 4.1 tests
...@@ -76,6 +76,7 @@ DROP PROCEDURE IF EXISTS mysqltest1.p1; ...@@ -76,6 +76,7 @@ DROP PROCEDURE IF EXISTS mysqltest1.p1;
DROP PROCEDURE IF EXISTS mysqltest1.p2; DROP PROCEDURE IF EXISTS mysqltest1.p2;
DROP TABLE IF EXISTS mysqltest1.t1; DROP TABLE IF EXISTS mysqltest1.t1;
DROP TABLE IF EXISTS mysqltest1.t2; DROP TABLE IF EXISTS mysqltest1.t2;
DROP DATABASE mysqltest1;
# Lets compare. Note: If they match test will pass, if they do not match # Lets compare. Note: If they match test will pass, if they do not match
# the test will show that the diff statement failed and not reject file # the test will show that the diff statement failed and not reject file
......
...@@ -21,13 +21,13 @@ show databases; ...@@ -21,13 +21,13 @@ show databases;
# #
# Dump the "test" database, all it's tables and their data # Dump the "test" database, all it's tables and their data
# #
--exec $MYSQL_DUMP --skip-comments test --exec $MYSQL_DUMP --skip-comments --skip-lock-tables test
# #
# Dump the "mysql" database and it's tables # Dump the "mysql" database and it's tables
# Select data separately to add "order by" # Select data separately to add "order by"
# #
--exec $MYSQL_DUMP --skip-comments --no-data mysql --exec $MYSQL_DUMP --skip-comments --skip-lock-tables --no-data mysql
use mysql; use mysql;
select * from columns_priv; select * from columns_priv;
select * from db order by host, db, user; select * from db order by host, db, user;
......
...@@ -455,6 +455,16 @@ sub collect_one_test_case($$$$$$$) { ...@@ -455,6 +455,16 @@ sub collect_one_test_case($$$$$$$) {
"Test case '$tname' is skipped."); "Test case '$tname' is skipped.");
} }
} }
else
{
mtr_options_from_test_file($tinfo,"$testdir/${tname}.test");
if ( ! $tinfo->{'innodb_test'} )
{
# mtr_report("Adding '--skip-innodb' to $tinfo->{'name'}");
push(@{$tinfo->{'master_opt'}}, "--skip-innodb");
}
}
# We can't restart a running server that may be in use # We can't restart a running server that may be in use
...@@ -463,7 +473,39 @@ sub collect_one_test_case($$$$$$$) { ...@@ -463,7 +473,39 @@ sub collect_one_test_case($$$$$$$) {
{ {
$tinfo->{'skip'}= 1; $tinfo->{'skip'}= 1;
} }
} }
sub mtr_options_from_test_file($$$) {
my $tinfo= shift;
my $file= shift;
open(FILE,"<",$file) or mtr_error("can't open file \"$file\": $!");
my @args;
while ( <FILE> )
{
chomp;
# Check if test uses innodb
if ( defined mtr_match_substring($_,"include/have_innodb.inc"))
{
$tinfo->{'innodb_test'} = 1;
}
# If test sources another file, open it as well
my $value= mtr_match_prefix($_, "--source");
if ( defined $value)
{
$value=~ s/^\s+//; # Remove leading space
$value=~ s/\s+$//; # Remove ending space
my $sourced_file= "$::glob_mysql_test_dir/$value";
mtr_options_from_test_file($tinfo, $sourced_file);
}
}
close FILE;
}
1; 1;
...@@ -14,12 +14,17 @@ use POSIX 'WNOHANG'; ...@@ -14,12 +14,17 @@ use POSIX 'WNOHANG';
sub mtr_run ($$$$$$;$); sub mtr_run ($$$$$$;$);
sub mtr_spawn ($$$$$$;$); sub mtr_spawn ($$$$$$;$);
sub mtr_stop_mysqld_servers ($); sub mtr_check_stop_servers ($);
sub mtr_kill_leftovers (); sub mtr_kill_leftovers ();
sub mtr_wait_blocking ($);
sub mtr_record_dead_children (); sub mtr_record_dead_children ();
sub mtr_ndbmgm_start($$);
sub mtr_mysqladmin_start($$$);
sub mtr_exit ($); sub mtr_exit ($);
sub sleep_until_file_created ($$$); sub sleep_until_file_created ($$$);
sub mtr_kill_processes ($); sub mtr_kill_processes ($);
sub mtr_ping_with_timeout($);
sub mtr_ping_port ($);
sub mtr_kill_process ($$$$); sub mtr_kill_process ($$$$);
# static in C # static in C
...@@ -32,7 +37,6 @@ sub spawn_impl ($$$$$$$$); ...@@ -32,7 +37,6 @@ sub spawn_impl ($$$$$$$$);
############################################################################## ##############################################################################
# This function try to mimic the C version used in "netware/mysql_test_run.c" # This function try to mimic the C version used in "netware/mysql_test_run.c"
# FIXME learn it to handle append mode as well, a "new" flag or a "append"
sub mtr_run ($$$$$$;$) { sub mtr_run ($$$$$$;$) {
my $path= shift; my $path= shift;
...@@ -293,7 +297,7 @@ sub spawn_parent_impl { ...@@ -293,7 +297,7 @@ sub spawn_parent_impl {
} }
} }
mtr_debug("waitpid() catched exit of unknown child $ret_pid, " . mtr_debug("waitpid() caught exit of unknown child $ret_pid, " .
"exit during mysqltest run"); "exit during mysqltest run");
} }
...@@ -347,49 +351,70 @@ sub mtr_process_exit_status { ...@@ -347,49 +351,70 @@ sub mtr_process_exit_status {
# #
############################################################################## ##############################################################################
# We just "ping" on the ports, and if we can't do a socket connect
# we assume the server is dead. So we don't *really* know a server
# is dead, we just hope that it after letting the listen port go,
# it is dead enough for us to start a new server.
# Kill all processes(mysqld, ndbd, ndb_mgmd and im) that would conflict with
# this run
# Make sure to remove the PID file, if any.
# kill IM manager first, else it will restart the servers
sub mtr_kill_leftovers () { sub mtr_kill_leftovers () {
# First, kill all masters and slaves that would conflict with my @kill_pids;
# this run. Make sure to remove the PID file, if any. my %admin_pids;
# FIXME kill IM manager first, else it will restart the servers, how?! my $pid;
my @args;
for ( my $idx; $idx < 2; $idx++ ) #Start shutdown of instance_managers, masters and slaves
foreach my $srv (@{$::instance_manager->{'instances'}},@{$::master},@{$::slave})
{ {
push(@args,{ $pid= mtr_mysqladmin_start($srv, "shutdown", 70);
pid => 0, # We don't know the PID
pidfile => $::instance_manager->{'instances'}->[$idx]->{'path_pid'}, # Save the pid of the mysqladmin process
sockfile => $::instance_manager->{'instances'}->[$idx]->{'path_sock'}, $admin_pids{$pid}= 1;
port => $::instance_manager->{'instances'}->[$idx]->{'port'},
push(@kill_pids,{
pid => $srv->{'pid'},
pidfile => $srv->{'path_pid'},
sockfile => $srv->{'path_sock'},
port => $srv->{'port'},
}); });
$srv->{'pid'}= 0; # Assume we are done with it
} }
for ( my $idx; $idx < 2; $idx++ ) # Start shutdown of clusters
foreach my $cluster (@{$::clusters})
{ {
push(@args,{ $pid= mtr_ndbmgm_start($cluster, "shutdown");
pid => 0, # We don't know the PID
pidfile => $::master->[$idx]->{'path_mypid'}, # Save the pid of the ndb_mgm process
sockfile => $::master->[$idx]->{'path_mysock'}, $admin_pids{$pid}= 1;
port => $::master->[$idx]->{'path_myport'},
push(@kill_pids,{
pid => $cluster->{'pid'},
pidfile => $cluster->{'path_pid'}
}); });
}
for ( my $idx; $idx < 3; $idx++ ) $cluster->{'pid'}= 0; # Assume we are done with it
foreach my $ndbd (@{$cluster->{'ndbds'}})
{ {
push(@args,{ push(@kill_pids,{
pid => 0, # We don't know the PID pid => $ndbd->{'pid'},
pidfile => $::slave->[$idx]->{'path_mypid'}, pidfile => $ndbd->{'path_pid'},
sockfile => $::slave->[$idx]->{'path_mysock'},
port => $::slave->[$idx]->{'path_myport'},
}); });
$ndbd->{'pid'}= 0; # Assume we are done with it
} }
mtr_mysqladmin_shutdown(\@args, 20); }
# Wait for all the admin processes to complete
mtr_wait_blocking(\%admin_pids);
# If we trusted "mysqladmin --shutdown_timeout= ..." we could just
# terminate now, but we don't (FIXME should be debugged).
# So we try again to ping and at least wait the same amount of time
# mysqladmin would for all to die.
mtr_ping_with_timeout(\@kill_pids);
# We now have tried to terminate nice. We have waited for the listen # We now have tried to terminate nice. We have waited for the listen
# port to be free, but can't really tell if the mysqld process died # port to be free, but can't really tell if the mysqld process died
...@@ -454,7 +479,7 @@ sub mtr_kill_leftovers () { ...@@ -454,7 +479,7 @@ sub mtr_kill_leftovers () {
do do
{ {
kill(9, @pids); kill(9, @pids);
mtr_debug("Sleep 1 second waiting for processes to die"); mtr_report("Sleep 1 second waiting for processes to die");
sleep(1) # Wait one second sleep(1) # Wait one second
} while ( $retries-- and kill(0, @pids) ); } while ( $retries-- and kill(0, @pids) );
...@@ -466,54 +491,62 @@ sub mtr_kill_leftovers () { ...@@ -466,54 +491,62 @@ sub mtr_kill_leftovers () {
} }
} }
# We may have failed everything, bug we now check again if we have # We may have failed everything, but we now check again if we have
# the listen ports free to use, and if they are free, just go for it. # the listen ports free to use, and if they are free, just go for it.
foreach my $srv ( @args ) foreach my $srv ( @kill_pids )
{ {
if ( mtr_ping_mysqld_server($srv->{'port'}, $srv->{'sockfile'}) ) if ( mtr_ping_port($srv->{'port'}) )
{ {
mtr_warning("can't kill old mysqld holding port $srv->{'port'}"); mtr_warning("can't kill old process holding port $srv->{'port'}");
} }
} }
} }
##############################################################################
#
# Shut down mysqld servers we have started from this run of this script
#
##############################################################################
# To speed things we kill servers in parallel. The argument is a list
# of 'ports', 'pids', 'pidfiles' and 'socketfiles'.
# Check that all processes in list are killed
# The argument is a list of 'ports', 'pids', 'pidfiles' and 'socketfiles'
# for which shutdown has been started. Make sure they all get killed
# in one way or the other.
#
# FIXME On Cygwin, and maybe some other platforms, $srv->{'pid'} and # FIXME On Cygwin, and maybe some other platforms, $srv->{'pid'} and
# $srv->{'pidfile'} will not be the same PID. We need to try to kill # the pid in $srv->{'pidfile'} will not be the same PID. We need to try to kill
# both I think. # both I think.
sub mtr_stop_mysqld_servers ($) { sub mtr_check_stop_servers ($) {
my $spec= shift; my $spec= shift;
# ---------------------------------------------------------------------- # Return if no processes are defined
# First try nice normal shutdown using 'mysqladmin' return if ! @$spec;
# ----------------------------------------------------------------------
# Shutdown time must be high as slave may be in reconnect #mtr_report("mtr_check_stop_servers");
mtr_mysqladmin_shutdown($spec, 70);
mtr_ping_with_timeout(\@$spec);
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# We loop with waitpid() nonblocking to see how many of the ones we # We loop with waitpid() nonblocking to see how many of the ones we
# are to kill, actually got killed by mtr_mysqladmin_shutdown(). # are to kill, actually got killed by mysqladmin or ndb_mgm
# Note that we don't rely on this, the mysqld server might have stop #
# Note that we don't rely on this, the mysqld server might have stopped
# listening to the port, but still be alive. But it is a start. # listening to the port, but still be alive. But it is a start.
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
foreach my $srv ( @$spec ) foreach my $srv ( @$spec )
{ {
if ( $srv->{'pid'} and (waitpid($srv->{'pid'},&WNOHANG) == $srv->{'pid'}) ) my $ret_pid;
if ( $srv->{'pid'} )
{
$ret_pid= waitpid($srv->{'pid'},&WNOHANG);
if ($ret_pid == $srv->{'pid'})
{ {
mtr_verbose("Caught exit of process $ret_pid");
$srv->{'pid'}= 0; $srv->{'pid'}= 0;
} }
else
{
# mtr_warning("caught exit of unknown child $ret_pid");
}
}
} }
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
...@@ -546,13 +579,12 @@ sub mtr_stop_mysqld_servers ($) { ...@@ -546,13 +579,12 @@ sub mtr_stop_mysqld_servers ($) {
} }
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# If the processes where started from this script, and we had no PIDS # If all the processes in list already have been killed,
# then we don't have to do anything. # then we don't have to do anything.
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
if ( ! keys %mysqld_pids ) if ( ! keys %mysqld_pids )
{ {
# cluck "This is how we got here!";
return; return;
} }
...@@ -622,86 +654,96 @@ sub mtr_stop_mysqld_servers ($) { ...@@ -622,86 +654,96 @@ sub mtr_stop_mysqld_servers ($) {
} }
# Wait for all the process in the list to terminate
sub mtr_wait_blocking($) {
my $admin_pids= shift;
##############################################################################
#
# Shut down mysqld servers using "mysqladmin ... shutdown".
# To speed this up, we start them in parallel and use waitpid() to
# catch their termination. Note that this doesn't say the servers
# are terminated, just that 'mysqladmin' is terminated.
#
# Note that mysqladmin will ask the server about what PID file it uses,
# and mysqladmin will wait for it to be removed before it terminates
# (unless passes timeout).
#
# This function will take at most about 20 seconds, and we still are not
# sure we killed them all. If none is responding to ping, we return 1,
# else we return 0.
#
##############################################################################
sub mtr_mysqladmin_shutdown { # Return if no processes defined
my $spec= shift; return if ! %$admin_pids;
my $adm_shutdown_tmo= shift;
my %mysql_admin_pids; mtr_verbose("mtr_wait_blocking");
# Start one "mysqladmin shutdown" for each server # Wait for all the started processes to exit
foreach my $srv ( @$spec ) # As mysqladmin is such a simple program, we trust it to terminate itself.
# I.e. we wait blocking, and wait for them all before we go on.
foreach my $pid (keys %{$admin_pids})
{ {
my $args; my $ret_pid= waitpid($pid,0);
}
}
# Start "mysqladmin shutdown" for a specific mysqld
sub mtr_mysqladmin_start($$$) {
my $srv= shift;
my $command= shift;
my $adm_shutdown_tmo= shift;
my $args;
mtr_init_args(\$args); mtr_init_args(\$args);
mtr_add_arg($args, "--no-defaults"); mtr_add_arg($args, "--no-defaults");
mtr_add_arg($args, "--user=%s", $::opt_user); mtr_add_arg($args, "--user=%s", $::opt_user);
mtr_add_arg($args, "--password="); mtr_add_arg($args, "--password=");
mtr_add_arg($args, "--silent"); mtr_add_arg($args, "--silent");
if ( -e $srv->{'sockfile'} ) if ( -e $srv->{'path_sock'} )
{ {
mtr_add_arg($args, "--socket=%s", $srv->{'sockfile'}); mtr_add_arg($args, "--socket=%s", $srv->{'path_sock'});
} }
if ( $srv->{'port'} ) if ( $srv->{'port'} )
{ {
mtr_add_arg($args, "--port=%s", $srv->{'port'}); mtr_add_arg($args, "--port=%s", $srv->{'port'});
} }
if ( $srv->{'port'} and ! -e $srv->{'sockfile'} ) if ( $srv->{'port'} and ! -e $srv->{'path_sock'} )
{ {
mtr_add_arg($args, "--protocol=tcp"); # Needed if no --socket mtr_add_arg($args, "--protocol=tcp"); # Needed if no --socket
} }
mtr_add_arg($args, "--connect_timeout=5"); mtr_add_arg($args, "--connect_timeout=5");
# Shutdown time must be high as slave may be in reconnect # Shutdown time must be high as slave may be in reconnect
mtr_add_arg($args, "--shutdown_timeout=$adm_shutdown_tmo"); mtr_add_arg($args, "--shutdown_timeout=$adm_shutdown_tmo");
mtr_add_arg($args, "shutdown"); mtr_add_arg($args, "$command");
my $path_mysqladmin_log= "$::opt_vardir/log/mysqladmin.log"; my $path_mysqladmin_log= "$::opt_vardir/log/mysqladmin.log";
# Start mysqladmin in paralell and wait for termination later
my $pid= mtr_spawn($::exe_mysqladmin, $args, my $pid= mtr_spawn($::exe_mysqladmin, $args,
"", $path_mysqladmin_log, $path_mysqladmin_log, "", "", $path_mysqladmin_log, $path_mysqladmin_log, "",
{ append_log_file => 1 }); { append_log_file => 1 });
# Save the pid of the mysqladmin process mtr_verbose("mtr_mysqladmin_start, pid: $pid");
$mysql_admin_pids{$pid}= 1; return $pid;
# We don't wait for termination of mysqladmin }
}
# Wait for all the started mysqladmin to exit # Start "ndb_mgm shutdown" for a specific cluster, it will
# As mysqladmin is such a simple program, we trust it to terminate. # shutdown all data nodes and leave the ndb_mgmd running
# I.e. we wait blocking, and wait wait for them all before we go on. sub mtr_ndbmgm_start($$) {
foreach my $pid (keys %mysql_admin_pids) my $cluster= shift;
{ my $command= shift;
my $ret_pid= waitpid($pid,0);
# If this was any of the mysqladmin's we waited for, delete its my $args;
# pid from list
delete $mysql_admin_pids{$ret_pid} if exists $mysql_admin_pids{$ret_pid};
}
# If we trusted "mysqladmin --shutdown_timeout= ..." we could just mtr_init_args(\$args);
# terminate now, but we don't (FIXME should be debugged).
# So we try again to ping and at least wait the same amount of time mtr_add_arg($args, "--no-defaults");
# mysqladmin would for all to die. mtr_add_arg($args, "--core");
mtr_add_arg($args, "--try-reconnect=1");
mtr_add_arg($args, "--ndb_connectstring=%s", $cluster->{'connect_string'});
mtr_add_arg($args, "-e");
mtr_add_arg($args, "$command");
my $pid= mtr_spawn($::exe_ndb_mgm, $args,
"", "/dev/null", "/dev/null", "",
{});
mtr_verbose("mtr_ndbmgm_start, pid: $pid");
return $pid;
}
my $timeout= 20; # 20 seconds max
# Ping all servers in list, exit when none of them answers
# or when timeout has passed
sub mtr_ping_with_timeout($) {
my $spec= shift;
my $timeout= 200; # 20 seconds max
my $res= 1; # If we just fall through, we are done my $res= 1; # If we just fall through, we are done
# in the sense that the servers don't # in the sense that the servers don't
# listen to their ports any longer # listen to their ports any longer
...@@ -711,10 +753,13 @@ sub mtr_mysqladmin_shutdown { ...@@ -711,10 +753,13 @@ sub mtr_mysqladmin_shutdown {
foreach my $srv ( @$spec ) foreach my $srv ( @$spec )
{ {
$res= 1; # We are optimistic $res= 1; # We are optimistic
if ( mtr_ping_mysqld_server($srv->{'port'}, $srv->{'sockfile'}) ) if ( $srv->{'pid'} and mtr_ping_port($srv->{'port'}) )
{ {
mtr_debug("Sleep 1 second waiting for processes to stop using port"); mtr_verbose("waiting for process $srv->{'pid'} to stop ".
sleep(1); # One second "using port $srv->{'port'}");
# Millisceond sleep emulated with select
select(undef, undef, undef, (0.1));
$res= 0; $res= 0;
next TIME; next TIME;
} }
...@@ -722,7 +767,7 @@ sub mtr_mysqladmin_shutdown { ...@@ -722,7 +767,7 @@ sub mtr_mysqladmin_shutdown {
last; # If we got here, we are done last; # If we got here, we are done
} }
$timeout or mtr_debug("At least one server is still listening to its port"); $timeout or mtr_report("At least one server is still listening to its port");
return $res; return $res;
} }
...@@ -743,12 +788,12 @@ sub mtr_record_dead_children () { ...@@ -743,12 +788,12 @@ sub mtr_record_dead_children () {
# -1 or 0 means there are no more procesess to wait for # -1 or 0 means there are no more procesess to wait for
while ( ($ret_pid= waitpid(-1,&WNOHANG)) != 0 and $ret_pid != -1) while ( ($ret_pid= waitpid(-1,&WNOHANG)) != 0 and $ret_pid != -1)
{ {
mtr_debug("waitpid() catched exit of child $ret_pid"); mtr_warning("waitpid() caught exit of child $ret_pid");
foreach my $idx (0..1) foreach my $idx (0..1)
{ {
if ( $::master->[$idx]->{'pid'} eq $ret_pid ) if ( $::master->[$idx]->{'pid'} eq $ret_pid )
{ {
mtr_debug("child $ret_pid was master[$idx]"); mtr_warning("child $ret_pid was master[$idx]");
$::master->[$idx]->{'pid'}= 0; $::master->[$idx]->{'pid'}= 0;
} }
} }
...@@ -757,11 +802,31 @@ sub mtr_record_dead_children () { ...@@ -757,11 +802,31 @@ sub mtr_record_dead_children () {
{ {
if ( $::slave->[$idx]->{'pid'} eq $ret_pid ) if ( $::slave->[$idx]->{'pid'} eq $ret_pid )
{ {
mtr_debug("child $ret_pid was slave[$idx]"); mtr_warning("child $ret_pid was slave[$idx]");
$::slave->[$idx]->{'pid'}= 0; $::slave->[$idx]->{'pid'}= 0;
last; last;
} }
} }
foreach my $cluster (@{$::clusters})
{
if ( $cluster->{'pid'} eq $ret_pid )
{
mtr_warning("child $ret_pid was $cluster->{'name'} cluster ndb_mgmd");
$cluster->{'pid'}= 0;
last;
}
foreach my $ndbd (@{$cluster->{'ndbds'}})
{
if ( $ndbd->{'pid'} eq $ret_pid )
{
mtr_warning("child $ret_pid was $cluster->{'name'} cluster ndbd");
$ndbd->{'pid'}= 0;
last;
}
}
}
} }
} }
...@@ -785,7 +850,8 @@ sub stop_reap_all { ...@@ -785,7 +850,8 @@ sub stop_reap_all {
$SIG{CHLD}= 'DEFAULT'; $SIG{CHLD}= 'DEFAULT';
} }
sub mtr_ping_mysqld_server () {
sub mtr_ping_port ($) {
my $port= shift; my $port= shift;
my $remote= "localhost"; my $remote= "localhost";
...@@ -839,12 +905,11 @@ sub sleep_until_file_created ($$$) { ...@@ -839,12 +905,11 @@ sub sleep_until_file_created ($$$) {
return 0; return 0;
} }
mtr_debug("Sleep $sleeptime milliseconds waiting for ". mtr_debug("Sleep $sleeptime milliseconds waiting for $pidfile");
"creation of $pidfile");
# Print extra message every 60 seconds # Print extra message every 60 seconds
my $seconds= ($loop * $sleeptime) / 1000; my $seconds= ($loop * $sleeptime) / 1000;
if ( $seconds > 1 and $seconds % 60 == 0 ) if ( $seconds > 1 and int($seconds) % 60 == 0 )
{ {
my $left= $timeout - $seconds; my $left= $timeout - $seconds;
mtr_warning("Waited $seconds seconds for $pidfile to be created, " . mtr_warning("Waited $seconds seconds for $pidfile to be created, " .
...@@ -862,16 +927,13 @@ sub sleep_until_file_created ($$$) { ...@@ -862,16 +927,13 @@ sub sleep_until_file_created ($$$) {
sub mtr_kill_processes ($) { sub mtr_kill_processes ($) {
my $pids = shift; my $pids = shift;
foreach my $sig (15, 9) mtr_verbose("mtr_kill_processes " . join(" ", @$pids));
foreach my $pid (@$pids)
{ {
my $retries= 10; foreach my $sig (15, 9)
while (1)
{ {
kill($sig, @{$pids}); last if mtr_kill_process($pid, $sig, 10, 1);
last unless kill (0, @{$pids}) and $retries--;
mtr_debug("Sleep 2 second waiting for processes to die");
sleep(2);
} }
} }
} }
...@@ -882,17 +944,20 @@ sub mtr_kill_process ($$$$) { ...@@ -882,17 +944,20 @@ sub mtr_kill_process ($$$$) {
my $signal= shift; my $signal= shift;
my $retries= shift; my $retries= shift;
my $timeout= shift; my $timeout= shift;
my $max_loop= $timeout*10; # Sleeping 0.1 between each kill attempt
while (1) while (1)
{ {
kill($signal, $pid); kill($signal, $pid);
last unless kill (0, $pid) and $retries--; last unless kill (0, $pid) and $max_loop--;
mtr_debug("Sleep $timeout second waiting for processes to die"); mtr_verbose("Sleep 0.1 second waiting for processes to die");
sleep($timeout); select(undef, undef, undef, 0.1);
} }
return $max_loop;
} }
############################################################################## ##############################################################################
...@@ -904,7 +969,7 @@ sub mtr_kill_process ($$$$) { ...@@ -904,7 +969,7 @@ sub mtr_kill_process ($$$$) {
# FIXME something is wrong, we sometimes terminate with "Hangup" written # FIXME something is wrong, we sometimes terminate with "Hangup" written
# to tty, and no STDERR output telling us why. # to tty, and no STDERR output telling us why.
# FIXME for some readon, setting HUP to 'IGNORE' will cause exit() to # FIXME for some reason, setting HUP to 'IGNORE' will cause exit() to
# write out "Hangup", and maybe loose some output. We insert a sleep... # write out "Hangup", and maybe loose some output. We insert a sleep...
sub mtr_exit ($) { sub mtr_exit ($) {
......
...@@ -21,6 +21,7 @@ sub mtr_warning (@); ...@@ -21,6 +21,7 @@ sub mtr_warning (@);
sub mtr_error (@); sub mtr_error (@);
sub mtr_child_error (@); sub mtr_child_error (@);
sub mtr_debug (@); sub mtr_debug (@);
sub mtr_verbose (@);
############################################################################## ##############################################################################
...@@ -122,7 +123,7 @@ sub mtr_report_test_failed ($) { ...@@ -122,7 +123,7 @@ sub mtr_report_test_failed ($) {
{ {
print "[ fail ] timeout\n"; print "[ fail ] timeout\n";
} }
elsif ( $tinfo->{'ndb_test'} and !$::flag_ndb_status_ok) elsif ( $tinfo->{'ndb_test'} and $::cluster->[0]->{'installed_ok'} eq "NO")
{ {
print "[ fail ] ndbcluster start failure\n"; print "[ fail ] ndbcluster start failure\n";
return; return;
...@@ -157,6 +158,7 @@ sub mtr_report_stats ($) { ...@@ -157,6 +158,7 @@ sub mtr_report_stats ($) {
my $tot_passed= 0; my $tot_passed= 0;
my $tot_failed= 0; my $tot_failed= 0;
my $tot_tests= 0; my $tot_tests= 0;
my $tot_restarts= 0;
my $found_problems= 0; # Some warnings are errors... my $found_problems= 0; # Some warnings are errors...
foreach my $tinfo (@$tests) foreach my $tinfo (@$tests)
...@@ -175,6 +177,10 @@ sub mtr_report_stats ($) { ...@@ -175,6 +177,10 @@ sub mtr_report_stats ($) {
$tot_tests++; $tot_tests++;
$tot_failed++; $tot_failed++;
} }
if ( $tinfo->{'restarted'} )
{
$tot_restarts++;
}
} }
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
...@@ -197,6 +203,8 @@ sub mtr_report_stats ($) { ...@@ -197,6 +203,8 @@ sub mtr_report_stats ($) {
"the documentation at\n", "the documentation at\n",
"http://www.mysql.com/doc/en/MySQL_test_suite.html\n"; "http://www.mysql.com/doc/en/MySQL_test_suite.html\n";
} }
print
"The servers were restarted $tot_restarts times\n";
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# If a debug run, there might be interesting information inside # If a debug run, there might be interesting information inside
...@@ -335,5 +343,11 @@ sub mtr_debug (@) { ...@@ -335,5 +343,11 @@ sub mtr_debug (@) {
print STDERR "####: ",join(" ", @_),"\n"; print STDERR "####: ",join(" ", @_),"\n";
} }
} }
sub mtr_verbose (@) {
if ( $::opt_verbose )
{
print STDERR "> ",join(" ", @_),"\n";
}
}
1; 1;
...@@ -27,8 +27,7 @@ sub run_stress_test () ...@@ -27,8 +27,7 @@ sub run_stress_test ()
if ( ! $::glob_use_embedded_server and ! $::opt_local_master ) if ( ! $::glob_use_embedded_server and ! $::opt_local_master )
{ {
$::master->[0]->{'pid'}= mysqld_start('master',0,[],[],0); if ( ! mysqld_start($::master->[0],[],[]) )
if ( ! $::master->[0]->{'pid'} )
{ {
mtr_error("Can't start the mysqld server"); mtr_error("Can't start the mysqld server");
} }
......
...@@ -145,9 +145,6 @@ our $glob_use_running_ndbcluster_slave= 0; ...@@ -145,9 +145,6 @@ our $glob_use_running_ndbcluster_slave= 0;
our $glob_use_embedded_server= 0; our $glob_use_embedded_server= 0;
our @glob_test_mode; our @glob_test_mode;
our $using_ndbcluster_master= 0;
our $using_ndbcluster_slave= 0;
our $glob_basedir; our $glob_basedir;
# The total result # The total result
...@@ -171,6 +168,7 @@ our $opt_suite; ...@@ -171,6 +168,7 @@ our $opt_suite;
our $opt_netware; our $opt_netware;
our $opt_script_debug= 0; # Script debugging, enable with --script-debug our $opt_script_debug= 0; # Script debugging, enable with --script-debug
our $opt_verbose= 1; # Verbose output, enable with --verbose
# Options FIXME not all.... # Options FIXME not all....
...@@ -187,6 +185,8 @@ our $exe_mysqlimport; # Called from test case ...@@ -187,6 +185,8 @@ our $exe_mysqlimport; # Called from test case
our $exe_mysqlshow; # Called from test case our $exe_mysqlshow; # Called from test case
our $exe_mysql_fix_system_tables; our $exe_mysql_fix_system_tables;
our $exe_mysqltest; our $exe_mysqltest;
our $exe_ndbd;
our $exe_ndb_mgmd;
our $exe_slave_mysqld; our $exe_slave_mysqld;
our $exe_im; our $exe_im;
our $exe_my_print_defaults; our $exe_my_print_defaults;
...@@ -238,10 +238,10 @@ our $opt_gprof_master; ...@@ -238,10 +238,10 @@ our $opt_gprof_master;
our $opt_gprof_slave; our $opt_gprof_slave;
our $opt_local; our $opt_local;
our $opt_local_master;
our $master; # Will be struct in C our $master; # Will be struct in C
our $slave; our $slave;
our $clusters;
our $instance_manager; our $instance_manager;
...@@ -323,12 +323,9 @@ our $opt_skip_master_binlog= 0; ...@@ -323,12 +323,9 @@ our $opt_skip_master_binlog= 0;
our $opt_skip_slave_binlog= 0; our $opt_skip_slave_binlog= 0;
our $exe_ndb_mgm; our $exe_ndb_mgm;
our $exe_ndb_waiter;
our $path_ndb_tools_dir; our $path_ndb_tools_dir;
our $path_ndb_data_dir;
our $path_ndb_slave_data_dir;
our $file_ndb_testrun_log; our $file_ndb_testrun_log;
our $flag_ndb_status_ok= 1;
our $flag_ndb_slave_status_ok= 1;
our @data_dir_lst; our @data_dir_lst;
...@@ -350,25 +347,25 @@ sub check_ssl_support (); ...@@ -350,25 +347,25 @@ sub check_ssl_support ();
sub check_running_as_root(); sub check_running_as_root();
sub check_ndbcluster_support (); sub check_ndbcluster_support ();
sub rm_ndbcluster_tables ($); sub rm_ndbcluster_tables ($);
sub ndbcluster_install (); sub ndbcluster_start_install ($);
sub ndbcluster_start ($); sub ndbcluster_start ($$);
sub ndbcluster_stop (); sub ndbcluster_wait_started ($);
sub ndbcluster_install_slave (); sub mysqld_wait_started($);
sub ndbcluster_start_slave ($);
sub ndbcluster_stop_slave ();
sub run_benchmarks ($); sub run_benchmarks ($);
sub initialize_servers (); sub initialize_servers ();
sub mysql_install_db (); sub mysql_install_db ();
sub install_db ($$); sub install_db ($$);
sub run_testcase ($); sub run_testcase ($);
sub run_testcase_stop_servers ($);
sub run_testcase_start_servers ($);
sub report_failure_and_restart ($); sub report_failure_and_restart ($);
sub do_before_start_master ($$); sub do_before_start_master ($$);
sub do_before_start_slave ($$); sub do_before_start_slave ($$);
sub mysqld_start ($$$$$); sub ndbd_start ($$$);
sub mysqld_arguments ($$$$$$); sub ndb_mgmd_start ($);
sub stop_masters_slaves (); sub mysqld_start ($$$);
sub stop_masters (); sub mysqld_arguments ($$$$$);
sub stop_slaves (); sub stop_all_servers ();
sub im_start ($$); sub im_start ($$);
sub im_stop ($); sub im_stop ($);
sub run_mysqltest ($); sub run_mysqltest ($);
...@@ -657,11 +654,11 @@ sub command_line_setup () { ...@@ -657,11 +654,11 @@ sub command_line_setup () {
'debug' => \$opt_debug, 'debug' => \$opt_debug,
'fast' => \$opt_fast, 'fast' => \$opt_fast,
'local' => \$opt_local, 'local' => \$opt_local,
'local-master' => \$opt_local_master,
'netware' => \$opt_netware, 'netware' => \$opt_netware,
'old-master' => \$opt_old_master, 'old-master' => \$opt_old_master,
'reorder' => \$opt_reorder, 'reorder' => \$opt_reorder,
'script-debug' => \$opt_script_debug, 'script-debug' => \$opt_script_debug,
'verbose' => \$opt_verbose,
'sleep=i' => \$opt_sleep, 'sleep=i' => \$opt_sleep,
'socket=s' => \$opt_socket, 'socket=s' => \$opt_socket,
'start-dirty' => \$opt_start_dirty, 'start-dirty' => \$opt_start_dirty,
...@@ -780,11 +777,31 @@ sub command_line_setup () { ...@@ -780,11 +777,31 @@ sub command_line_setup () {
push(@glob_test_mode, "ps-protocol"); push(@glob_test_mode, "ps-protocol");
} }
# FIXME don't understand what this is if ( $opt_ndbconnectstring )
# if ( $opt_local_master ) {
# { $glob_use_running_ndbcluster= 1;
# $opt_master_myport= 3306; }
# } else
{
$opt_ndbconnectstring= "host=localhost:$opt_ndbcluster_port";
}
if ( $opt_skip_ndbcluster_slave )
{
$opt_with_ndbcluster_slave= 0;
}
else
{
$opt_with_ndbcluster_slave= 1;
if ( $opt_ndbconnectstring_slave )
{
$glob_use_running_ndbcluster_slave= 1;
}
else
{
$opt_ndbconnectstring_slave= "host=localhost:$opt_ndbcluster_port_slave";
}
}
if ( $opt_small_bench ) if ( $opt_small_bench )
{ {
...@@ -873,61 +890,74 @@ sub command_line_setup () { ...@@ -873,61 +890,74 @@ sub command_line_setup () {
$master->[0]= $master->[0]=
{ {
type => "master",
idx => 0,
path_myddir => "$opt_vardir/master-data", path_myddir => "$opt_vardir/master-data",
path_myerr => "$opt_vardir/log/master.err", path_myerr => "$opt_vardir/log/master.err",
path_mylog => "$opt_vardir/log/master.log", path_mylog => "$opt_vardir/log/master.log",
path_mypid => "$opt_vardir/run/master.pid", path_pid => "$opt_vardir/run/master.pid",
path_mysock => "$sockdir/master.sock", path_sock => "$sockdir/master.sock",
path_myport => $opt_master_myport, port => $opt_master_myport,
start_timeout => 400, # enough time create innodb tables start_timeout => 400, # enough time create innodb tables
cluster => 0, # index in clusters list
ndbcluster => 1, # ndbcluster not started master_opt => [],
}; };
$master->[1]= $master->[1]=
{ {
type => "master",
idx => 1,
path_myddir => "$opt_vardir/master1-data", path_myddir => "$opt_vardir/master1-data",
path_myerr => "$opt_vardir/log/master1.err", path_myerr => "$opt_vardir/log/master1.err",
path_mylog => "$opt_vardir/log/master1.log", path_mylog => "$opt_vardir/log/master1.log",
path_mypid => "$opt_vardir/run/master1.pid", path_pid => "$opt_vardir/run/master1.pid",
path_mysock => "$sockdir/master1.sock", path_sock => "$sockdir/master1.sock",
path_myport => $opt_master_myport + 1, port => $opt_master_myport + 1,
start_timeout => 400, # enough time create innodb tables start_timeout => 400, # enough time create innodb tables
cluster => 0, # index in clusters list
}; };
$slave->[0]= $slave->[0]=
{ {
type => "slave",
idx => 0,
path_myddir => "$opt_vardir/slave-data", path_myddir => "$opt_vardir/slave-data",
path_myerr => "$opt_vardir/log/slave.err", path_myerr => "$opt_vardir/log/slave.err",
path_mylog => "$opt_vardir/log/slave.log", path_mylog => "$opt_vardir/log/slave.log",
path_mypid => "$opt_vardir/run/slave.pid", path_pid => "$opt_vardir/run/slave.pid",
path_mysock => "$sockdir/slave.sock", path_sock => "$sockdir/slave.sock",
path_myport => $opt_slave_myport, port => $opt_slave_myport,
start_timeout => 400, start_timeout => 400,
ndbcluster => 1, # ndbcluster not started cluster => 1, # index in clusters list
}; };
$slave->[1]= $slave->[1]=
{ {
type => "slave",
idx => 1,
path_myddir => "$opt_vardir/slave1-data", path_myddir => "$opt_vardir/slave1-data",
path_myerr => "$opt_vardir/log/slave1.err", path_myerr => "$opt_vardir/log/slave1.err",
path_mylog => "$opt_vardir/log/slave1.log", path_mylog => "$opt_vardir/log/slave1.log",
path_mypid => "$opt_vardir/run/slave1.pid", path_pid => "$opt_vardir/run/slave1.pid",
path_mysock => "$sockdir/slave1.sock", path_sock => "$sockdir/slave1.sock",
path_myport => $opt_slave_myport + 1, port => $opt_slave_myport + 1,
start_timeout => 300, start_timeout => 300,
cluster => -1, # index in clusters list
}; };
$slave->[2]= $slave->[2]=
{ {
type => "slave",
idx => 2,
path_myddir => "$opt_vardir/slave2-data", path_myddir => "$opt_vardir/slave2-data",
path_myerr => "$opt_vardir/log/slave2.err", path_myerr => "$opt_vardir/log/slave2.err",
path_mylog => "$opt_vardir/log/slave2.log", path_mylog => "$opt_vardir/log/slave2.log",
path_mypid => "$opt_vardir/run/slave2.pid", path_pid => "$opt_vardir/run/slave2.pid",
path_mysock => "$sockdir/slave2.sock", path_sock => "$sockdir/slave2.sock",
path_myport => $opt_slave_myport + 2, port => $opt_slave_myport + 2,
start_timeout => 300, start_timeout => 300,
cluster => -1, # index in clusters list
}; };
$instance_manager= $instance_manager=
...@@ -967,11 +997,48 @@ sub command_line_setup () { ...@@ -967,11 +997,48 @@ sub command_line_setup () {
old_log_format => 1 old_log_format => 1
}; };
my $data_dir= "$opt_vardir/ndbcluster-$opt_ndbcluster_port";
$clusters->[0]=
{
name => "Master",
nodes => 2,
port => "$opt_ndbcluster_port",
data_dir => "$data_dir",
connect_string => "$opt_ndbconnectstring",
path_pid => "$data_dir/ndb_3.pid", # Nodes + 1
pid => 0, # pid of ndb_mgmd
};
$data_dir= "$opt_vardir/ndbcluster-$opt_ndbcluster_port_slave";
$clusters->[1]=
{
name => "Slave",
nodes => 1,
port => "$opt_ndbcluster_port_slave",
data_dir => "$data_dir",
connect_string => "$opt_ndbconnectstring_slave",
path_pid => "$data_dir/ndb_2.pid", # Nodes + 1
pid => 0, # pid of ndb_mgmd
};
# Init pids of ndbd's
foreach my $cluster ( @{$clusters} )
{
for ( my $idx= 0; $idx < $cluster->{'nodes'}; $idx++ )
{
$cluster->{'ndbds'}->[$idx]=
{
pid => 0,
path_pid => "$cluster->{'data_dir'}/ndb_{$idx+1}.pid",
};
}
}
if ( $opt_extern ) if ( $opt_extern )
{ {
$glob_use_running_server= 1; $glob_use_running_server= 1;
$opt_skip_rpl= 1; # We don't run rpl test cases $opt_skip_rpl= 1; # We don't run rpl test cases
$master->[0]->{'path_mysock'}= $opt_socket; $master->[0]->{'path_sock'}= $opt_socket;
} }
$path_timefile= "$opt_vardir/log/mysqltest-time"; $path_timefile= "$opt_vardir/log/mysqltest-time";
...@@ -1098,6 +1165,9 @@ sub executable_setup () { ...@@ -1098,6 +1165,9 @@ sub executable_setup () {
"/usr/bin/false"); "/usr/bin/false");
$path_ndb_tools_dir= mtr_path_exists("$glob_basedir/storage/ndb/tools"); $path_ndb_tools_dir= mtr_path_exists("$glob_basedir/storage/ndb/tools");
$exe_ndb_mgm= "$glob_basedir/storage/ndb/src/mgmclient/ndb_mgm"; $exe_ndb_mgm= "$glob_basedir/storage/ndb/src/mgmclient/ndb_mgm";
$exe_ndb_waiter= "$glob_basedir/storage/ndb/tools/ndb_waiter";
$exe_ndbd= "$glob_basedir/storage/ndb/src/kernel/ndbd";
$exe_ndb_mgmd= "$glob_basedir/storage/ndb/src/mgmsrv/ndb_mgmd";
$lib_udf_example= $lib_udf_example=
mtr_file_exists("$glob_basedir/sql/.libs/udf_example.so"); mtr_file_exists("$glob_basedir/sql/.libs/udf_example.so");
} }
...@@ -1157,13 +1227,14 @@ sub executable_setup () { ...@@ -1157,13 +1227,14 @@ sub executable_setup () {
$path_ndb_tools_dir= "$glob_basedir/bin"; $path_ndb_tools_dir= "$glob_basedir/bin";
$exe_ndb_mgm= "$glob_basedir/bin/ndb_mgm"; $exe_ndb_mgm= "$glob_basedir/bin/ndb_mgm";
$exe_ndb_waiter= "$glob_basedir/bin/ndb_waiter";
$exe_ndbd= "$glob_basedir/libexec/ndbd";
$exe_ndb_mgmd= "$glob_basedir/libexec/ndb_mgmd";
} }
$exe_master_mysqld= $exe_master_mysqld || $exe_mysqld; $exe_master_mysqld= $exe_master_mysqld || $exe_mysqld;
$exe_slave_mysqld= $exe_slave_mysqld || $exe_mysqld; $exe_slave_mysqld= $exe_slave_mysqld || $exe_mysqld;
$path_ndb_data_dir= "$opt_vardir/ndbcluster-$opt_ndbcluster_port";
$path_ndb_slave_data_dir= "$opt_vardir/ndbcluster-$opt_ndbcluster_port_slave";
$file_ndb_testrun_log= "$opt_vardir/log/ndb_testrun.log"; $file_ndb_testrun_log= "$opt_vardir/log/ndb_testrun.log";
} }
...@@ -1214,13 +1285,13 @@ sub environment_setup () { ...@@ -1214,13 +1285,13 @@ sub environment_setup () {
$ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir; $ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
$ENV{'MYSQLTEST_VARDIR'}= $opt_vardir; $ENV{'MYSQLTEST_VARDIR'}= $opt_vardir;
$ENV{'MYSQL_TMP_DIR'}= $opt_tmpdir; $ENV{'MYSQL_TMP_DIR'}= $opt_tmpdir;
$ENV{'MASTER_MYSOCK'}= $master->[0]->{'path_mysock'}; $ENV{'MASTER_MYSOCK'}= $master->[0]->{'path_sock'};
$ENV{'MASTER_MYSOCK1'}= $master->[1]->{'path_mysock'}; $ENV{'MASTER_MYSOCK1'}= $master->[1]->{'path_sock'};
$ENV{'MASTER_MYPORT'}= $master->[0]->{'path_myport'}; $ENV{'MASTER_MYPORT'}= $master->[0]->{'port'};
$ENV{'MASTER_MYPORT1'}= $master->[1]->{'path_myport'}; $ENV{'MASTER_MYPORT1'}= $master->[1]->{'port'};
$ENV{'SLAVE_MYPORT'}= $slave->[0]->{'path_myport'}; $ENV{'SLAVE_MYPORT'}= $slave->[0]->{'port'};
$ENV{'SLAVE_MYPORT1'}= $slave->[1]->{'path_myport'}; $ENV{'SLAVE_MYPORT1'}= $slave->[1]->{'port'};
$ENV{'SLAVE_MYPORT2'}= $slave->[2]->{'path_myport'}; $ENV{'SLAVE_MYPORT2'}= $slave->[2]->{'port'};
# $ENV{'MYSQL_TCP_PORT'}= '@MYSQL_TCP_PORT@'; # FIXME # $ENV{'MYSQL_TCP_PORT'}= '@MYSQL_TCP_PORT@'; # FIXME
$ENV{'MYSQL_TCP_PORT'}= 3306; $ENV{'MYSQL_TCP_PORT'}= 3306;
...@@ -1277,7 +1348,7 @@ sub signal_setup () { ...@@ -1277,7 +1348,7 @@ sub signal_setup () {
sub handle_int_signal () { sub handle_int_signal () {
$SIG{INT}= 'DEFAULT'; # If we get a ^C again, we die... $SIG{INT}= 'DEFAULT'; # If we get a ^C again, we die...
mtr_warning("got INT signal, cleaning up....."); mtr_warning("got INT signal, cleaning up.....");
stop_masters_slaves(); stop_all_servers();
mtr_error("We die from ^C signal from user"); mtr_error("We die from ^C signal from user");
} }
...@@ -1293,11 +1364,11 @@ sub kill_running_server () { ...@@ -1293,11 +1364,11 @@ sub kill_running_server () {
if ( $opt_fast or $glob_use_embedded_server ) if ( $opt_fast or $glob_use_embedded_server )
{ {
# FIXME is embedded server really using PID files?! # FIXME is embedded server really using PID files?!
unlink($master->[0]->{'path_mypid'}); unlink($master->[0]->{'path_pid'});
unlink($master->[1]->{'path_mypid'}); unlink($master->[1]->{'path_pid'});
unlink($slave->[0]->{'path_mypid'}); unlink($slave->[0]->{'path_pid'});
unlink($slave->[1]->{'path_mypid'}); unlink($slave->[1]->{'path_pid'});
unlink($slave->[2]->{'path_mypid'}); unlink($slave->[2]->{'path_pid'});
} }
else else
{ {
...@@ -1310,12 +1381,6 @@ sub kill_running_server () { ...@@ -1310,12 +1381,6 @@ sub kill_running_server () {
mkpath("$opt_vardir/log"); # Needed for mysqladmin log mkpath("$opt_vardir/log"); # Needed for mysqladmin log
mtr_kill_leftovers(); mtr_kill_leftovers();
$using_ndbcluster_master= $opt_with_ndbcluster;
ndbcluster_stop();
$master->[0]->{'ndbcluster'}= 1;
$using_ndbcluster_slave= $opt_with_ndbcluster;
ndbcluster_stop_slave();
$slave->[0]->{'ndbcluster'}= 1;
} }
} }
...@@ -1487,216 +1552,214 @@ sub check_ndbcluster_support () { ...@@ -1487,216 +1552,214 @@ sub check_ndbcluster_support () {
return; return;
} }
mtr_report("Using ndbcluster if necessary, mysqld supports it"); mtr_report("Using ndbcluster when necessary, mysqld supports it");
$opt_with_ndbcluster= 1; $opt_with_ndbcluster= 1;
if ( $opt_ndbconnectstring )
{
$glob_use_running_ndbcluster= 1;
}
else
{
$opt_ndbconnectstring= "host=localhost:$opt_ndbcluster_port";
}
if ( $opt_skip_ndbcluster_slave )
{
$opt_with_ndbcluster_slave= 0;
}
else
{
$opt_with_ndbcluster_slave= 1;
if ( $opt_ndbconnectstring_slave )
{
$glob_use_running_ndbcluster_slave= 1;
}
else
{
$opt_ndbconnectstring_slave= "host=localhost:$opt_ndbcluster_port_slave";
}
}
return; return;
} }
sub ndbcluster_install () { sub ndbcluster_start_install ($) {
my $cluster= shift;
if ( ! $opt_with_ndbcluster or $glob_use_running_ndbcluster ) if ( ! $opt_with_ndbcluster or $glob_use_running_ndbcluster )
{ {
return 0; return 0;
} }
mtr_report("Installing ndbcluster master");
my $ndbcluster_opts= $opt_bench ? "" : "--small";
if ( mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
["--port=$opt_ndbcluster_port",
"--data-dir=$opt_vardir",
"--verbose=2",
$ndbcluster_opts,
"--initial",
"--relative-config-data-dir",
"--core"],
"", "", "", "") )
{
return 1;
}
$using_ndbcluster_master= 1;
ndbcluster_stop();
$master->[0]->{'ndbcluster'}= 1;
return 0; mtr_report("Installing $cluster->{'name'} Cluster");
}
mkdir($cluster->{'data_dir'});
sub ndbcluster_start ($) { # Create a config file from template
my $use_ndbcluster= shift; my $ndb_no_ord=512;
my $ndb_no_attr=2048;
my $ndb_con_op=105000;
my $ndb_dmem="80M";
my $ndb_imem="24M";
my $ndb_pbmem="32M";
my $nodes= $cluster->{'nodes'};
my $ndb_host= "localhost";
my $ndb_diskless= 0;
if ( ! $use_ndbcluster ) if (!$opt_bench)
{ {
$using_ndbcluster_master= 0; # Use a smaller configuration
return 0; $ndb_no_ord=32;
} $ndb_con_op=5000;
if ( $glob_use_running_ndbcluster ) $ndb_dmem="20M";
{ $ndb_imem="1M";
$using_ndbcluster_master= 1; $ndb_pbmem="4M";
return 0;
} }
if ( $using_ndbcluster_master )
my $config_file_template= "ndb/ndb_config_${nodes}_node.ini";
my $config_file= "$cluster->{'data_dir'}/config.ini";
open(IN, $config_file_template)
or mtr_error("Can't open $config_file_template: $!");
open(OUT, ">", $config_file)
or mtr_error("Can't write to $config_file: $!");
while (<IN>)
{ {
# Master already started chomp;
return 0;
} s/CHOOSE_MaxNoOfAttributes/$ndb_no_attr/;
# FIXME, we want to _append_ output to file $file_ndb_testrun_log instead of /dev/null s/CHOOSE_MaxNoOfOrderedIndexes/$ndb_no_ord/;
#mtr_report("Starting ndbcluster master"); s/CHOOSE_MaxNoOfConcurrentOperations/$ndb_con_op/;
if ( mtr_run("$glob_mysql_test_dir/ndb/ndbcluster", s/CHOOSE_DataMemory/$ndb_dmem/;
["--port=$opt_ndbcluster_port", s/CHOOSE_IndexMemory/$ndb_imem/;
"--data-dir=$opt_vardir", s/CHOOSE_Diskless/$ndb_diskless/;
"--character-sets-dir=$path_charsetsdir", s/CHOOSE_HOSTNAME_.*/$ndb_host/;
"--verbose=2", s/CHOOSE_FILESYSTEM/$cluster->{'data_dir'}/;
"--core"], s/CHOOSE_PORT_MGM/$cluster->{'port'}/;
"", "/dev/null", "", "") ) s/CHOOSE_DiskPageBufferMemory/$ndb_pbmem/;
{
mtr_error("Error ndbcluster_start"); print OUT "$_ \n";
$using_ndbcluster_master= 0;
return 1;
} }
close OUT;
close IN;
# Start cluster with "--initial"
ndbcluster_start($cluster, "--initial");
$using_ndbcluster_master= 1;
return 0; return 0;
} }
sub rm_ndbcluster_tables ($) {
my $dir= shift; sub ndbcluster_wait_started($){
foreach my $bin ( glob("$dir/cluster/apply_status*"), my $cluster= shift;
glob("$dir/cluster/schema*") ) my $path_waiter_log= "$cluster->{'data_dir'}/ndb_waiter.log";
{
unlink($bin); # Start the ndb_waiter which will connect to the ndb_mgmd
} # and poll it for state of the ndbd's, will return when
# all nodes in the cluster is started
my $res= mtr_run($exe_ndb_waiter,
["--no-defaults",
"--core",
"--ndb-connectstring=$cluster->{'connect_string'}",
"--timeout=60"],
"", $path_waiter_log, $path_waiter_log, "");
mtr_verbose("ndbcluster_wait_started, returns: $res") if $res;
return $res;
} }
sub ndbcluster_stop () {
if ( ! $using_ndbcluster_master or $glob_use_running_ndbcluster ) sub mysqld_wait_started($){
{ my $mysqld= shift;
$using_ndbcluster_master= 0;
return; my $res= sleep_until_file_created($mysqld->{'path_pid'},
} $mysqld->{'start_timeout'},
# FIXME, we want to _append_ output to file $file_ndb_testrun_log instead of /dev/null $mysqld->{'pid'});
#mtr_report("Stopping ndbcluster master"); return $res == 0;
mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
["--port=$opt_ndbcluster_port",
"--data-dir=$opt_vardir",
"--verbose=2",
"--stop"],
"", "/dev/null", "", "");
rm_ndbcluster_tables ($master->[0]->{'path_myddir'});
rm_ndbcluster_tables ($master->[1]->{'path_myddir'});
$using_ndbcluster_master= 0;
return;
} }
sub ndbcluster_install_slave () {
if ( ! $opt_with_ndbcluster_slave or $glob_use_running_ndbcluster_slave ) sub ndb_mgmd_start ($) {
{ my $cluster= shift;
return 0;
}
mtr_report("Installing ndbcluster slave");
if ( mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
["--port=$opt_ndbcluster_port_slave",
"--data-dir=$opt_vardir",
"--verbose=2",
"--small",
"--ndbd-nodes=1",
"--initial",
"--relative-config-data-dir",
"--core"],
"", "", "", "") )
{
return 1;
}
$using_ndbcluster_slave= 1; my $args; # Arg vector
ndbcluster_stop_slave(); my $pid= -1;
$slave->[0]->{'ndbcluster'}= 1;
return 0; mtr_init_args(\$args);
mtr_add_arg($args, "--no-defaults");
mtr_add_arg($args, "--core");
mtr_add_arg($args, "--config-file=%s", "$cluster->{'data_dir'}/config.ini");
my $path_ndb_mgmd_log= "$cluster->{'data_dir'}/\l$cluster->{'name'}_ndb_mgmd.log";
$pid= mtr_spawn($exe_ndb_mgmd, $args, "",
$path_ndb_mgmd_log,
$path_ndb_mgmd_log,
"",
{ append_log_file => 1 });
# Remember pid of ndb_mgmd
$cluster->{'pid'}= $pid;
mtr_verbose("ndb_mgmd_start, pid: $pid");
return $pid;
}
sub ndbd_start ($$$) {
my $cluster= shift;
my $idx= shift;
my $extra_args= shift;
my $args; # Arg vector
my $pid= -1;
mtr_init_args(\$args);
mtr_add_arg($args, "--no-defaults");
mtr_add_arg($args, "--core");
mtr_add_arg($args, "--ndb-connectstring=%s", "$cluster->{'connect_string'}");
mtr_add_arg($args, "--character-sets-dir=%s", "$path_charsetsdir");
mtr_add_arg($args, "--nodaemon");
mtr_add_arg($args, "$extra_args");
my $path_ndbd_log= "$cluster->{'data_dir'}/ndb_{$idx+1}.log";
$pid= mtr_spawn($exe_ndbd, $args, "",
$path_ndbd_log,
$path_ndbd_log,
"",
{ append_log_file => 1 });
# Add pid to list of pids for this cluster
$cluster->{'ndbds'}->[$idx]->{'pid'}= $pid;
mtr_verbose("ndbd_start, pid: $pid");
return $pid;
} }
sub ndbcluster_start_slave ($) {
my $use_ndbcluster= shift;
if ( ! $use_ndbcluster ) sub ndbcluster_start ($$) {
my $cluster= shift;
my $extra_args= shift;
mtr_verbose("ndbcluster_start '$cluster->{'name'}'");
if ( $glob_use_running_ndbcluster )
{ {
$using_ndbcluster_slave= 0;
return 0; return 0;
} }
if ( $glob_use_running_ndbcluster_slave )
if ( $cluster->{'pid'} )
{ {
$using_ndbcluster_slave= 1; mtr_error("Cluster '$cluster->{'name'}' already started");
return 0;
} }
# FIXME, we want to _append_ output to file $file_ndb_testrun_log instead of /dev/null my $pid= ndb_mgmd_start($cluster);
#mtr_report("Starting ndbcluster slave");
if ( mtr_run("$glob_mysql_test_dir/ndb/ndbcluster", # FIXME Should not be needed
["--port=$opt_ndbcluster_port_slave", # Unfortunately cluster will fail
"--data-dir=$opt_vardir", # if ndb_mgmd has not started properly
"--verbose=2", # Wait for the ndb_mgmd pid file to be created
"--ndbd-nodes=1", if (!sleep_until_file_created($cluster->{'path_pid'},
"--core"], 60,
"", "/dev/null", "", "") ) $pid))
{ {
mtr_error("Error ndbcluster_start_slave"); mtr_warning("Failed to start ndb_mgmd for $cluster->{'name'} cluster");
$using_ndbcluster_slave= 0;
return 1; return 1;
} }
$using_ndbcluster_slave= 1;
for ( my $idx= 0; $idx < $cluster->{'nodes'}; $idx++ )
{
ndbd_start($cluster, $idx, $extra_args);
}
return 0; return 0;
} }
sub ndbcluster_stop_slave () {
if ( ! $using_ndbcluster_slave or $glob_use_running_ndbcluster_slave ) sub rm_ndbcluster_tables ($) {
my $dir= shift;
foreach my $bin ( glob("$dir/cluster/apply_status*"),
glob("$dir/cluster/schema*") )
{ {
$using_ndbcluster_slave= 0; unlink($bin);
return;
} }
# FIXME, we want to _append_ output to file $file_ndb_testrun_log instead of /dev/null
#mtr_report("Stopping ndbcluster slave");
mtr_run("$glob_mysql_test_dir/ndb/ndbcluster",
["--port=$opt_ndbcluster_port_slave",
"--data-dir=$opt_vardir",
"--verbose=2",
"--stop"],
"", "/dev/null", "", "");
rm_ndbcluster_tables ($slave->[0]->{'path_myddir'});
$using_ndbcluster_slave= 0;
return;
} }
...@@ -1711,10 +1774,9 @@ sub run_benchmarks ($) { ...@@ -1711,10 +1774,9 @@ sub run_benchmarks ($) {
my $args; my $args;
if ( ! $glob_use_embedded_server and ! $opt_local_master ) if ( ! $glob_use_embedded_server )
{ {
$master->[0]->{'pid'}= mysqld_start('master',0,[],[], mysqld_start($master->[0],[],[]);
$using_ndbcluster_master);
if ( ! $master->[0]->{'pid'} ) if ( ! $master->[0]->{'pid'} )
{ {
mtr_error("Can't start the mysqld server"); mtr_error("Can't start the mysqld server");
...@@ -1723,7 +1785,7 @@ sub run_benchmarks ($) { ...@@ -1723,7 +1785,7 @@ sub run_benchmarks ($) {
mtr_init_args(\$args); mtr_init_args(\$args);
mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_mysock'}); mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_sock'});
mtr_add_arg($args, "--user=%s", $opt_user); mtr_add_arg($args, "--user=%s", $opt_user);
if ( $opt_small_bench ) if ( $opt_small_bench )
...@@ -1802,7 +1864,7 @@ sub run_suite () { ...@@ -1802,7 +1864,7 @@ sub run_suite () {
! $glob_use_running_server and ! $glob_use_running_server and
! $glob_use_embedded_server ) ! $glob_use_embedded_server )
{ {
stop_masters_slaves(); stop_all_servers();
} }
if ( $opt_gcov ) if ( $opt_gcov )
...@@ -1864,42 +1926,51 @@ sub mysql_install_db () { ...@@ -1864,42 +1926,51 @@ sub mysql_install_db () {
im_prepare_env($instance_manager); im_prepare_env($instance_manager);
} }
if ( ndbcluster_install() )
{ my $cluster_started_ok= 1; # Assume it can be started
if ( $opt_force)
if (ndbcluster_start_install($clusters->[0]) ||
$use_slaves && ndbcluster_start_install($clusters->[1]))
{ {
# failed to install, disable usage and flag that its no ok mtr_warning("Failed to start install of cluster");
mtr_report("ndbcluster_install failed, continuing without cluster"); $cluster_started_ok= 0;
$opt_with_ndbcluster= 0;
$flag_ndb_status_ok= 0;
$ENV{'NDB_STATUS_OK'}= "NO";
} }
else
foreach my $cluster (@{$clusters})
{ {
print "Aborting: Failed to install ndb cluster\n";
print "To continue, re-run with '--force'.\n"; next if !$cluster->{'pid'};
mtr_exit(1);
$cluster->{'installed_ok'}= "YES"; # Assume install suceeds
if (ndbcluster_wait_started($cluster))
{
# failed to install, disable usage and flag that its no ok
mtr_report("ndbcluster_install of $cluster->{'name'} failed, " .
"continuing without it");
$cluster->{"installed_ok"}= "NO";
$cluster_started_ok= 0;
} }
} }
if ( $use_slaves and ndbcluster_install_slave() ) if ( ! $cluster_started_ok )
{ {
if ( $opt_force) if ( $opt_force)
{ {
# failed to install, disable usage and flag that its no ok # Continue without cluster
mtr_report("ndbcluster_install_slave failed, " .
"continuing without slave cluster");
$opt_with_ndbcluster_slave= 0;
$flag_ndb_slave_status_ok= 0;
} }
else else
{ {
print "Aborting: Failed to install ndb cluster\n"; mtr_error("To continue, re-run with '--force'.");
print "To continue, re-run with '--force'.\n";
mtr_exit(1);
} }
} }
# Stop clusters...
stop_all_servers();
return 0; return 0;
} }
...@@ -2088,8 +2159,6 @@ sub run_testcase ($) { ...@@ -2088,8 +2159,6 @@ sub run_testcase ($) {
my $tname= $tinfo->{'name'}; my $tname= $tinfo->{'name'};
my $ndbcluster_opt;
mtr_tonewfile($path_current_test_log,"$tname\n"); # Always tell where we are mtr_tonewfile($path_current_test_log,"$tname\n"); # Always tell where we are
# output current test to ndbcluster log file to enable diagnostics # output current test to ndbcluster log file to enable diagnostics
...@@ -2109,67 +2178,24 @@ sub run_testcase ($) { ...@@ -2109,67 +2178,24 @@ sub run_testcase ($) {
return; return;
} }
if ( $tinfo->{'ndb_test'} and ! $flag_ndb_status_ok ) # If test needs cluster, check that master installed ok
if ( $tinfo->{'ndb_test'} and $clusters->[0]->{'installed_ok'} eq "NO" )
{ {
mtr_report_test_name($tinfo); mtr_report_test_name($tinfo);
mtr_report_test_failed($tinfo); mtr_report_test_failed($tinfo);
return; return;
} }
# ---------------------------------------------------------------------- # If test needs slave cluster, check that it installed ok
# If not using a running servers we may need to stop and restart. if ( $tinfo->{'ndb_test'} and $tinfo->{'slave_num'} and
# We restart in the case we have initiation scripts, server options $clusters->[1]->{'installed_ok'} eq "NO" )
# etc to run. But we also restart again after the test first restart
# and test is run, to get back to normal server settings.
#
# To make the code a bit more clean, we actually only stop servers
# here, and mark this to be done. Then a generic "start" part will
# start up the needed servers again.
# ----------------------------------------------------------------------
if ( ! $glob_use_running_server and ! $glob_use_embedded_server )
{
# We try to find out if we are to restart the server
my $do_restart= 0; # Assumes we don't have to
if ( $tinfo->{'master_sh'} )
{
$do_restart= 1; # Always restart if script to run
}
elsif ( $opt_with_ndbcluster and $tinfo->{'ndb_test'} != $using_ndbcluster_master )
{
$do_restart= 1; # Restart without cluster
}
elsif ( $master->[0]->{'running_master_is_special'} and
$master->[0]->{'running_master_is_special'}->{'timezone'} eq
$tinfo->{'timezone'} and
mtr_same_opts($master->[0]->{'running_master_is_special'}->{'master_opt'},
$tinfo->{'master_opt'}) )
{
# If running master was started with special settings, but
# the current test requuires the same ones, we *don't* restart.
$do_restart= 0;
}
elsif ( $tinfo->{'master_restart'} or
$master->[0]->{'running_master_is_special'} )
{
$do_restart= 1;
}
if ( $do_restart )
{ {
stop_masters(); mtr_report_test_name($tinfo);
delete $master->[0]->{'running_master_is_special'}; # Forget history mtr_report_test_failed($tinfo);
return;
} }
# ---------------------------------------------------------------------- run_testcase_stop_servers($tinfo);
# Always terminate all slaves, if any. Else we may have useless
# reconnection attempts and error messages in case the slave and
# master servers restart.
# ----------------------------------------------------------------------
stop_slaves();
}
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Prepare to start masters. Even if we use embedded, we want to run # Prepare to start masters. Even if we use embedded, we want to run
...@@ -2178,18 +2204,12 @@ sub run_testcase ($) { ...@@ -2178,18 +2204,12 @@ sub run_testcase ($) {
$ENV{'TZ'}= $tinfo->{'timezone'}; $ENV{'TZ'}= $tinfo->{'timezone'};
mtr_report_test_name($tinfo);
mtr_tofile($master->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n"); mtr_tofile($master->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
if ( $master->[1]->{'pid'} ) if ( $master->[1]->{'pid'} )
{ {
mtr_tofile($master->[1]->{'path_myerr'},"CURRENT_TEST: $tname\n"); mtr_tofile($master->[1]->{'path_myerr'},"CURRENT_TEST: $tname\n");
} }
# FIXME test cases that depend on each other, prevent this from
# being at this location.
# do_before_start_master($tname,$tinfo->{'master_sh'});
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# If any mysqld servers running died, we have to know # If any mysqld servers running died, we have to know
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
...@@ -2197,159 +2217,43 @@ sub run_testcase ($) { ...@@ -2197,159 +2217,43 @@ sub run_testcase ($) {
mtr_record_dead_children(); mtr_record_dead_children();
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Start masters # Start masters needed by the testcase
# ----------------------------------------------------------------------
run_testcase_start_servers($tinfo);
# ----------------------------------------------------------------------
# If --start-and-exit or --start-dirty given, stop here to let user manually
# run tests
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
if ( ! $glob_use_running_server and ! $glob_use_embedded_server ) if ( $opt_start_and_exit or $opt_start_dirty )
{ {
# FIXME give the args to the embedded server?! mtr_report("\nServers started, exiting");
# FIXME what does $opt_local_master mean?! exit(0);
# FIXME split up start and check that started so that can do }
# starts in parallel, masters and slaves at the same time.
# ----------------------------------------------------------------------
# Run the test case
# ----------------------------------------------------------------------
if ( $tinfo->{'component_id'} eq 'mysqld' and ! $opt_local_master ) mtr_report_test_name($tinfo);
{
# remove the old reject file
if ( $opt_suite eq "main" )
{ {
if ( $opt_with_ndbcluster and $master->[0]->{'ndbcluster'} ) unlink("r/$tname.reject");
}
else
{ {
# Cluster is not started unlink("suite/$opt_suite/r/$tname.reject");
}
unlink($path_timefile);
# Call ndbcluster_start to check if test case needs cluster my $res= run_mysqltest($tinfo);
# Start it if not already started if ( $res == 0 )
$master->[0]->{'ndbcluster'}= ndbcluster_start($tinfo->{'ndb_test'});
if ( $master->[0]->{'ndbcluster'} )
{ {
report_failure_and_restart($tinfo); mtr_report_test_passed($tinfo);
return;
}
}
if ( ! $master->[0]->{'pid'} )
{
# FIXME not correct location for do_before_start_master()
do_before_start_master($tname,$tinfo->{'master_sh'});
$master->[0]->{'pid'}=
mysqld_start('master',0,$tinfo->{'master_opt'},[],
$using_ndbcluster_master);
if ( ! $master->[0]->{'pid'} )
{
report_failure_and_restart($tinfo);
return;
}
}
if ( $using_ndbcluster_master and ! $master->[1]->{'pid'} )
{
# Test needs cluster, start an extra mysqld connected to cluster
# First wait for first mysql server to have created ndb system tables ok
if ( ! sleep_until_file_created("$master->[0]->{'path_myddir'}/cluster/apply_status.ndb",
$master->[0]->{'start_timeout'},
$master->[0]->{'pid'}))
{
report_failure_and_restart($tinfo);
return;
}
mtr_tofile($master->[1]->{'path_myerr'},"CURRENT_TEST: $tname\n");
$master->[1]->{'pid'}=
mysqld_start('master',1,$tinfo->{'master_opt'},[],
$using_ndbcluster_master);
if ( ! $master->[1]->{'pid'} )
{
report_failure_and_restart($tinfo);
return;
}
}
if ( $tinfo->{'master_restart'} )
{
# Save this test case information, so next can examine it
$master->[0]->{'running_master_is_special'}= $tinfo;
}
}
elsif ( ! $opt_skip_im and $tinfo->{'component_id'} eq 'im' )
{
# We have to create defaults file every time, in order to ensure that it
# will be the same for each test. The problem is that test can change the
# file (by SET/UNSET commands), so w/o recreating the file, execution of
# one test can affect the other.
im_create_defaults_file($instance_manager);
im_start($instance_manager, $tinfo->{im_opts});
}
# ----------------------------------------------------------------------
# Start slaves - if needed
# ----------------------------------------------------------------------
if ( $tinfo->{'slave_num'} )
{
mtr_tofile($slave->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
do_before_start_slave($tname,$tinfo->{'slave_sh'});
for ( my $idx= 0; $idx < $tinfo->{'slave_num'}; $idx++ )
{
if ( ! $slave->[$idx]->{'pid'} )
{
$ndbcluster_opt= 0;
if ( $idx == 0)
{
if ( $slave->[0]->{'ndbcluster'} )
{
$slave->[0]->{'ndbcluster'}=
ndbcluster_start_slave($tinfo->{'ndb_test'});
if ( $slave->[0]->{'ndbcluster'} )
{
report_failure_and_restart($tinfo);
return;
}
}
$ndbcluster_opt= $using_ndbcluster_slave;
}
$slave->[$idx]->{'pid'}=
mysqld_start('slave',$idx,
$tinfo->{'slave_opt'}, $tinfo->{'slave_mi'},
$ndbcluster_opt);
if ( ! $slave->[$idx]->{'pid'} )
{
report_failure_and_restart($tinfo);
return;
}
}
}
}
}
# ----------------------------------------------------------------------
# If --start-and-exit or --start-dirty given, stop here to let user manually
# run tests
# ----------------------------------------------------------------------
if ( $opt_start_and_exit or $opt_start_dirty )
{
mtr_report("\nServers started, exiting");
exit(0);
}
# ----------------------------------------------------------------------
# Run the test case
# ----------------------------------------------------------------------
{
# remove the old reject file
if ( $opt_suite eq "main" )
{
unlink("r/$tname.reject");
}
else
{
unlink("suite/$opt_suite/r/$tname.reject");
}
unlink($path_timefile);
my $res= run_mysqltest($tinfo);
if ( $res == 0 )
{
mtr_report_test_passed($tinfo);
} }
elsif ( $res == 62 ) elsif ( $res == 62 )
{ {
...@@ -2370,6 +2274,7 @@ sub run_testcase ($) { ...@@ -2370,6 +2274,7 @@ sub run_testcase ($) {
"mysqltest returned unexpected code $res, " . "mysqltest returned unexpected code $res, " .
"it has probably crashed"); "it has probably crashed");
} }
report_failure_and_restart($tinfo); report_failure_and_restart($tinfo);
} }
# Save info from this testcase run to mysqltest.log # Save info from this testcase run to mysqltest.log
...@@ -2450,20 +2355,20 @@ sub restore_installed_db ($) { ...@@ -2450,20 +2355,20 @@ sub restore_installed_db ($) {
if ($opt_with_ndbcluster) if ($opt_with_ndbcluster)
{ {
# Remove the ndb_*_fs dirs, forcing a clean start of ndb # Remove the ndb_*_fs dirs, forcing a clean start of ndb
rmtree("$path_ndb_data_dir/ndb_1_fs"); rmtree("$clusters->[0]->{'data_dir'}/ndb_1_fs");
rmtree("$path_ndb_data_dir/ndb_2_fs"); rmtree("$clusters->[0]->{'data_dir'}/ndb_2_fs");
if ( $opt_with_ndbcluster_slave ) if ( $opt_with_ndbcluster_slave )
{ {
# Remove also the ndb_*_fs dirs for slave cluster # Remove also the ndb_*_fs dirs for slave cluster
rmtree("$path_ndb_slave_data_dir/ndb_1_fs"); rmtree("$clusters->[1]->{'data_dir'}/ndb_1_fs");
} }
} }
} }
else else
{ {
# No snapshot existed, just stop all processes # No snapshot existed, just stop all processes
stop_masters_slaves(); stop_all_servers();
} }
} }
...@@ -2489,7 +2394,7 @@ sub report_failure_and_restart ($) { ...@@ -2489,7 +2394,7 @@ sub report_failure_and_restart ($) {
! $glob_use_running_server and ! $glob_use_running_server and
! $glob_use_embedded_server ) ! $glob_use_embedded_server )
{ {
stop_masters_slaves(); stop_all_servers();
} }
mtr_exit(1); mtr_exit(1);
...@@ -2583,18 +2488,17 @@ sub do_before_start_slave ($$) { ...@@ -2583,18 +2488,17 @@ sub do_before_start_slave ($$) {
} }
sub mysqld_arguments ($$$$$$) { sub mysqld_arguments ($$$$$) {
my $args= shift; my $args= shift;
my $type= shift; # master/slave/bootstrap my $type= shift;
my $idx= shift; my $idx= shift;
my $extra_opt= shift; my $extra_opt= shift;
my $slave_master_info= shift; my $slave_master_info= shift;
my $using_ndbcluster= shift;
my $sidx= ""; # Index as string, 0 is empty string my $sidx= ""; # Index as string, 0 is empty string
if ( $idx > 0 ) if ( $idx > 0 )
{ {
$sidx= sprintf("%d", $idx); # sprintf not needed in Perl for this $sidx= "$idx";
} }
my $prefix= ""; # If mysqltest server arg my $prefix= ""; # If mysqltest server arg
...@@ -2634,12 +2538,12 @@ sub mysqld_arguments ($$$$$$) { ...@@ -2634,12 +2538,12 @@ sub mysqld_arguments ($$$$$$) {
$opt_vardir, $sidx); $opt_vardir, $sidx);
} }
mtr_add_arg($args, "%s--pid-file=%s", $prefix, mtr_add_arg($args, "%s--pid-file=%s", $prefix,
$master->[$idx]->{'path_mypid'}); $master->[$idx]->{'path_pid'});
mtr_add_arg($args, "%s--port=%d", $prefix, mtr_add_arg($args, "%s--port=%d", $prefix,
$master->[$idx]->{'path_myport'}); $master->[$idx]->{'port'});
mtr_add_arg($args, "%s--server-id=%d", $prefix, $id); mtr_add_arg($args, "%s--server-id=%d", $prefix, $id);
mtr_add_arg($args, "%s--socket=%s", $prefix, mtr_add_arg($args, "%s--socket=%s", $prefix,
$master->[$idx]->{'path_mysock'}); $master->[$idx]->{'path_sock'});
mtr_add_arg($args, "%s--innodb_data_file_path=ibdata1:10M:autoextend", $prefix); mtr_add_arg($args, "%s--innodb_data_file_path=ibdata1:10M:autoextend", $prefix);
mtr_add_arg($args, "%s--local-infile", $prefix); mtr_add_arg($args, "%s--local-infile", $prefix);
mtr_add_arg($args, "%s--datadir=%s", $prefix, mtr_add_arg($args, "%s--datadir=%s", $prefix,
...@@ -2650,7 +2554,9 @@ sub mysqld_arguments ($$$$$$) { ...@@ -2650,7 +2554,9 @@ sub mysqld_arguments ($$$$$$) {
mtr_add_arg($args, "%s--skip-innodb", $prefix); mtr_add_arg($args, "%s--skip-innodb", $prefix);
} }
if ( $opt_skip_ndbcluster || !$using_ndbcluster) my $cluster= $clusters->[$master->[$idx]->{'cluster'}];
if ( $opt_skip_ndbcluster ||
!$cluster->{'pid'})
{ {
mtr_add_arg($args, "%s--skip-ndbcluster", $prefix); mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
} }
...@@ -2658,7 +2564,7 @@ sub mysqld_arguments ($$$$$$) { ...@@ -2658,7 +2564,7 @@ sub mysqld_arguments ($$$$$$) {
{ {
mtr_add_arg($args, "%s--ndbcluster", $prefix); mtr_add_arg($args, "%s--ndbcluster", $prefix);
mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix, mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix,
$opt_ndbconnectstring); $cluster->{'connect_string'});
mtr_add_arg($args, "%s--ndb-extra-logging", $prefix); mtr_add_arg($args, "%s--ndb-extra-logging", $prefix);
} }
} }
...@@ -2684,14 +2590,14 @@ sub mysqld_arguments ($$$$$$) { ...@@ -2684,14 +2590,14 @@ sub mysqld_arguments ($$$$$$) {
$slave->[$idx]->{'path_mylog'}); $slave->[$idx]->{'path_mylog'});
mtr_add_arg($args, "%s--master-retry-count=10", $prefix); mtr_add_arg($args, "%s--master-retry-count=10", $prefix);
mtr_add_arg($args, "%s--pid-file=%s", $prefix, mtr_add_arg($args, "%s--pid-file=%s", $prefix,
$slave->[$idx]->{'path_mypid'}); $slave->[$idx]->{'path_pid'});
mtr_add_arg($args, "%s--port=%d", $prefix, mtr_add_arg($args, "%s--port=%d", $prefix,
$slave->[$idx]->{'path_myport'}); $slave->[$idx]->{'port'});
mtr_add_arg($args, "%s--relay-log=%s/log/slave%s-relay-bin", $prefix, mtr_add_arg($args, "%s--relay-log=%s/log/slave%s-relay-bin", $prefix,
$opt_vardir, $sidx); $opt_vardir, $sidx);
mtr_add_arg($args, "%s--report-host=127.0.0.1", $prefix); mtr_add_arg($args, "%s--report-host=127.0.0.1", $prefix);
mtr_add_arg($args, "%s--report-port=%d", $prefix, mtr_add_arg($args, "%s--report-port=%d", $prefix,
$slave->[$idx]->{'path_myport'}); $slave->[$idx]->{'port'});
mtr_add_arg($args, "%s--report-user=root", $prefix); mtr_add_arg($args, "%s--report-user=root", $prefix);
mtr_add_arg($args, "%s--skip-innodb", $prefix); mtr_add_arg($args, "%s--skip-innodb", $prefix);
mtr_add_arg($args, "%s--skip-ndbcluster", $prefix); mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
...@@ -2703,7 +2609,7 @@ sub mysqld_arguments ($$$$$$) { ...@@ -2703,7 +2609,7 @@ sub mysqld_arguments ($$$$$$) {
mtr_add_arg($args, "%s--slave-load-tmpdir=%s", $prefix, mtr_add_arg($args, "%s--slave-load-tmpdir=%s", $prefix,
"../tmp"); "../tmp");
mtr_add_arg($args, "%s--socket=%s", $prefix, mtr_add_arg($args, "%s--socket=%s", $prefix,
$slave->[$idx]->{'path_mysock'}); $slave->[$idx]->{'path_sock'});
mtr_add_arg($args, "%s--set-variable=slave_net_timeout=10", $prefix); mtr_add_arg($args, "%s--set-variable=slave_net_timeout=10", $prefix);
if ( @$slave_master_info ) if ( @$slave_master_info )
...@@ -2720,20 +2626,22 @@ sub mysqld_arguments ($$$$$$) { ...@@ -2720,20 +2626,22 @@ sub mysqld_arguments ($$$$$$) {
mtr_add_arg($args, "%s--master-host=127.0.0.1", $prefix); mtr_add_arg($args, "%s--master-host=127.0.0.1", $prefix);
mtr_add_arg($args, "%s--master-password=", $prefix); mtr_add_arg($args, "%s--master-password=", $prefix);
mtr_add_arg($args, "%s--master-port=%d", $prefix, mtr_add_arg($args, "%s--master-port=%d", $prefix,
$master->[0]->{'path_myport'}); # First master $master->[0]->{'port'}); # First master
mtr_add_arg($args, "%s--server-id=%d", $prefix, $slave_server_id); mtr_add_arg($args, "%s--server-id=%d", $prefix, $slave_server_id);
mtr_add_arg($args, "%s--rpl-recovery-rank=%d", $prefix, $slave_rpl_rank); mtr_add_arg($args, "%s--rpl-recovery-rank=%d", $prefix, $slave_rpl_rank);
} }
if ( $opt_skip_ndbcluster_slave ) if ( $opt_skip_ndbcluster_slave ||
$slave->[$idx]->{'cluster'} == -1 ||
!$clusters->[$slave->[$idx]->{'cluster'}]->{'pid'} )
{ {
mtr_add_arg($args, "%s--skip-ndbcluster", $prefix); mtr_add_arg($args, "%s--skip-ndbcluster", $prefix);
} }
if ( $idx == 0 and $using_ndbcluster_slave ) else
{ {
mtr_add_arg($args, "%s--ndbcluster", $prefix); mtr_add_arg($args, "%s--ndbcluster", $prefix);
mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix, mtr_add_arg($args, "%s--ndb-connectstring=%s", $prefix,
$opt_ndbconnectstring_slave); $clusters->[$slave->[$idx]->{'cluster'}]->{'connect_string'});
mtr_add_arg($args, "%s--ndb-extra-logging", $prefix); mtr_add_arg($args, "%s--ndb-extra-logging", $prefix);
} }
} # end slave } # end slave
...@@ -2796,13 +2704,6 @@ sub mysqld_arguments ($$$$$$) { ...@@ -2796,13 +2704,6 @@ sub mysqld_arguments ($$$$$$) {
mtr_add_arg($args, "%s--init-rpl-role=master", $prefix); mtr_add_arg($args, "%s--init-rpl-role=master", $prefix);
} }
# FIXME strange,.....
# FIXME MYSQL_MYPORT is not set anythere?!
if ( $opt_local_master )
{
mtr_add_arg($args, "%s--host=127.0.0.1", $prefix);
mtr_add_arg($args, "%s--port=%s", $prefix, $ENV{'MYSQL_MYPORT'});
}
} }
foreach my $arg ( @opt_extra_mysqld_opt, @$extra_opt ) foreach my $arg ( @opt_extra_mysqld_opt, @$extra_opt )
...@@ -2832,23 +2733,24 @@ sub mysqld_arguments ($$$$$$) { ...@@ -2832,23 +2733,24 @@ sub mysqld_arguments ($$$$$$) {
# #
############################################################################## ##############################################################################
sub mysqld_start ($$$$$) { sub mysqld_start ($$$) {
my $type= shift; # master/slave/bootstrap my $mysqld= shift;
my $idx= shift;
my $extra_opt= shift; my $extra_opt= shift;
my $slave_master_info= shift; my $slave_master_info= shift;
my $using_ndbcluster= shift;
my $args; # Arg vector my $args; # Arg vector
my $exe; my $exe;
my $pid= -1; my $pid= -1;
my $wait_for_pid_file= 1;
my $type= $mysqld->{'type'};
my $idx= $mysqld->{'idx'};
if ( $type eq 'master' ) if ( $type eq 'master' )
{ {
$exe= $exe_master_mysqld; $exe= $exe_master_mysqld;
} }
elsif ( $type eq 'slave' ) if ( $type eq 'slave' )
{ {
$exe= $exe_slave_mysqld; $exe= $exe_slave_mysqld;
} }
...@@ -2864,8 +2766,7 @@ sub mysqld_start ($$$$$) { ...@@ -2864,8 +2766,7 @@ sub mysqld_start ($$$$$) {
valgrind_arguments($args, \$exe); valgrind_arguments($args, \$exe);
} }
mysqld_arguments($args,$type,$idx,$extra_opt,$slave_master_info, mysqld_arguments($args,$type,$idx,$extra_opt,$slave_master_info);
$using_ndbcluster);
if ( $opt_gdb || $opt_manual_gdb) if ( $opt_gdb || $opt_manual_gdb)
{ {
...@@ -2890,6 +2791,11 @@ sub mysqld_start ($$$$$) { ...@@ -2890,6 +2791,11 @@ sub mysqld_start ($$$$$) {
# Indicate the exe should not be started # Indicate the exe should not be started
$exe= undef; $exe= undef;
} }
else
{
# Default to not wait until pid file has been created
$wait_for_pid_file= 0;
}
if ($exe_libtool and $opt_valgrind) if ($exe_libtool and $opt_valgrind)
{ {
...@@ -2900,43 +2806,35 @@ sub mysqld_start ($$$$$) { ...@@ -2900,43 +2806,35 @@ sub mysqld_start ($$$$$) {
} }
if ( $type eq 'master' ) if ( defined $exe )
{ {
if ( ! defined $exe or
$pid= mtr_spawn($exe, $args, "", $pid= mtr_spawn($exe, $args, "",
$master->[$idx]->{'path_myerr'}, $mysqld->{'path_myerr'},
$master->[$idx]->{'path_myerr'}, $mysqld->{'path_myerr'},
"", "",
{ append_log_file => 1 }) ) { append_log_file => 1 });
{
return sleep_until_file_created($master->[$idx]->{'path_mypid'},
$master->[$idx]->{'start_timeout'},
$pid);
}
} }
if ( $type eq 'slave' )
{ if ( $wait_for_pid_file && !sleep_until_file_created($mysqld->{'path_pid'},
if ( ! defined $exe or $mysqld->{'start_timeout'},
$pid= mtr_spawn($exe, $args, "", $pid))
$slave->[$idx]->{'path_myerr'},
$slave->[$idx]->{'path_myerr'},
"",
{ append_log_file => 1 }) )
{ {
return sleep_until_file_created($slave->[$idx]->{'path_mypid'},
$master->[$idx]->{'start_timeout'}, mtr_error("Failed to start mysqld $mysqld->{'type'}");
$pid);
}
} }
return 0;
# Remember pid of the started process
$mysqld->{'pid'}= $pid;
mtr_verbose("mysqld pid: $pid");
return $pid;
} }
sub stop_masters_slaves () { sub stop_all_servers () {
print "Ending Tests\n"; print "Stopping All Servers\n";
if ( $instance_manager->{'pid'} ) if ( $instance_manager->{'pid'} )
{ {
...@@ -2944,72 +2842,392 @@ sub stop_masters_slaves () { ...@@ -2944,72 +2842,392 @@ sub stop_masters_slaves () {
im_stop($instance_manager); im_stop($instance_manager);
} }
print "Shutting-down MySQL daemon\n\n"; my %admin_pids; # hash of admin processes that requests shutdown
stop_masters(); my @kill_pids; # list of processes to shutdown/kill
print "Master(s) shutdown finished\n"; my $pid;
stop_slaves();
print "Slave(s) shutdown finished\n"; # Start shutdown of all started masters
foreach my $mysqld (@{$master}, @{$slave})
{
if ( $mysqld->{'pid'} )
{
$pid= mtr_mysqladmin_start($mysqld, "shutdown", 70);
$admin_pids{$pid}= 1;
push(@kill_pids,{
pid => $mysqld->{'pid'},
pidfile => $mysqld->{'path_pid'},
sockfile => $mysqld->{'path_sock'},
port => $mysqld->{'port'},
});
$mysqld->{'pid'}= 0; # Assume we are done with it
}
}
# Start shutdown of clusters
foreach my $cluster (@{$clusters})
{
if ( $cluster->{'pid'} )
{
$pid= mtr_ndbmgm_start($cluster, "shutdown");
$admin_pids{$pid}= 1;
push(@kill_pids,{
pid => $cluster->{'pid'},
pidfile => $cluster->{'path_pid'}
});
$cluster->{'pid'}= 0; # Assume we are done with it
foreach my $ndbd (@{$cluster->{'ndbds'}})
{
if ( $ndbd->{'pid'} )
{
push(@kill_pids,{
pid => $ndbd->{'pid'},
pidfile => $ndbd->{'path_pid'},
});
$ndbd->{'pid'}= 0;
}
}
}
}
# Wait blocking until all shutdown processes has completed
mtr_wait_blocking(\%admin_pids);
# Make sure that process has shutdown else try to kill them
mtr_check_stop_servers(\@kill_pids);
foreach my $mysqld (@{$master}, @{$slave})
{
rm_ndbcluster_tables($mysqld->{'path_myddir'});
}
} }
sub stop_masters () { # ----------------------------------------------------------------------
# If not using a running servers we may need to stop and restart.
# We restart in the case we have initiation scripts, server options
# etc to run. But we also restart again after the test first restart
# and test is run, to get back to normal server settings.
#
# To make the code a bit more clean, we actually only stop servers
# here, and mark this to be done. Then a generic "start" part will
# start up the needed servers again.
# ----------------------------------------------------------------------
my @args; sub run_testcase_stop_servers($) {
my $tinfo= shift;
for ( my $idx; $idx < 2; $idx++ ) if ( $glob_use_running_server || $glob_use_embedded_server )
{ {
# FIXME if we hit ^C before fully started, this test will prevent return;
# the mysqld process from being killed }
if ( $master->[$idx]->{'pid'} )
# We try to find out if we are to restart the server
my $do_restart= 0; # Assumes we don't have to
if ( $tinfo->{'master_sh'} )
{
$do_restart= 1; # Always restart if script to run
mtr_report("Restart because: Always restart if script to run");
}
elsif ( $opt_with_ndbcluster and
$tinfo->{'ndb_test'} == 0 and
$clusters->[0]->{'pid'} != 0 )
{
$do_restart= 1; # Restart without cluster
mtr_report("Restart because: Test does not need cluster");
}
elsif ( $opt_with_ndbcluster and
$tinfo->{'ndb_test'} == 1 and
$clusters->[0]->{'pid'} == 0 )
{
$do_restart= 1; # Restart with cluster
mtr_report("Restart because: Test need cluster");
}
elsif ( $master->[0]->{'running_master_is_special'} and
$master->[0]->{'running_master_is_special'}->{'timezone'} eq
$tinfo->{'timezone'} and
mtr_same_opts($master->[0]->{'running_master_is_special'}->{'master_opt'},
$tinfo->{'master_opt'}) )
{ {
push(@args,{ # If running master was started with special settings, but
pid => $master->[$idx]->{'pid'}, # the current test requuires the same ones, we *don't* restart.
pidfile => $master->[$idx]->{'path_mypid'}, $do_restart= 0;
sockfile => $master->[$idx]->{'path_mysock'}, mtr_report("Skip restart: options are equal " .
port => $master->[$idx]->{'path_myport'}, join(" ", @{$tinfo->{'master_opt'}}));
}
elsif ( $tinfo->{'master_restart'} or
$master->[0]->{'running_master_is_special'} )
{
$do_restart= 1;
mtr_report("Restart because: master_restart or running_master_is_special");
}
# Check that running master was started with same options
# as the current test requires
elsif (! mtr_same_opts($master->[0]->{'master_opt'},
$tinfo->{'master_opt'}) )
{
$do_restart= 1;
mtr_report("Restart because: running with different options");
}
my $pid;
my %admin_pids; # hash of admin processes that requests shutdown
my @kill_pids; # list of processes to shutdown/kill
# Remember if we restarted for this test case
$tinfo->{'restarted'}= $do_restart;
if ( $do_restart )
{
delete $master->[0]->{'running_master_is_special'}; # Forget history
# Start shutdown of all started masters
foreach my $mysqld (@{$master})
{
if ( $mysqld->{'pid'} )
{
$pid= mtr_mysqladmin_start($mysqld, "shutdown", 70);
$admin_pids{$pid}= 1;
push(@kill_pids,{
pid => $mysqld->{'pid'},
pidfile => $mysqld->{'path_pid'},
sockfile => $mysqld->{'path_sock'},
port => $mysqld->{'port'},
}); });
$master->[$idx]->{'pid'}= 0; # Assume we are done with it
$mysqld->{'pid'}= 0; # Assume we are done with it
} }
} }
if ( ! $master->[0]->{'ndbcluster'} ) # Start shutdown of master cluster
my $cluster= $clusters->[0];
if ( $cluster->{'pid'} )
{ {
ndbcluster_stop(); $pid= mtr_ndbmgm_start($cluster, "shutdown");
$master->[0]->{'ndbcluster'}= 1; $admin_pids{$pid}= 1;
push(@kill_pids,{
pid => $cluster->{'pid'},
pidfile => $cluster->{'path_pid'}
});
$cluster->{'pid'}= 0; # Assume we are done with it
foreach my $ndbd (@{$cluster->{'ndbds'}})
{
push(@kill_pids,{
pid => $ndbd->{'pid'},
pidfile => $ndbd->{'path_pid'},
});
$ndbd->{'pid'}= 0; # Assume we are done with it
}
}
} }
mtr_stop_mysqld_servers(\@args);
}
# ----------------------------------------------------------------------
# Always terminate all slaves, if any. Else we may have useless
# reconnection attempts and error messages in case the slave and
# master servers restart.
# ----------------------------------------------------------------------
sub stop_slaves () { # Start shutdown of all started slaves
my $force= shift; foreach my $mysqld (@{$slave})
{
if ( $mysqld->{'pid'} )
{
$pid= mtr_mysqladmin_start($mysqld, "shutdown", 70);
$admin_pids{$pid}= 1;
push(@kill_pids,{
pid => $mysqld->{'pid'},
pidfile => $mysqld->{'path_pid'},
sockfile => $mysqld->{'path_sock'},
port => $mysqld->{'port'},
});
my @args;
for ( my $idx; $idx < 3; $idx++ ) $mysqld->{'pid'}= 0; # Assume we are done with it
}
}
# Start shutdown of slave cluster
my $cluster= $clusters->[1];
if ( $cluster->{'pid'} )
{ {
if ( $slave->[$idx]->{'pid'} ) $pid= mtr_ndbmgm_start($cluster, "shutdown");
$admin_pids{$pid}= 1;
push(@kill_pids,{
pid => $cluster->{'pid'},
pidfile => $cluster->{'path_pid'}
});
$cluster->{'pid'}= 0; # Assume we are done with it
foreach my $ndbd (@{$cluster->{'ndbds'}} )
{ {
push(@args,{ push(@kill_pids,{
pid => $slave->[$idx]->{'pid'}, pid => $ndbd->{'pid'},
pidfile => $slave->[$idx]->{'path_mypid'}, pidfile => $ndbd->{'path_pid'},
sockfile => $slave->[$idx]->{'path_mysock'},
port => $slave->[$idx]->{'path_myport'},
}); });
$slave->[$idx]->{'pid'}= 0; # Assume we are done with it $ndbd->{'pid'}= 0; # Assume we are done with it
} }
} }
if ( ! $slave->[0]->{'ndbcluster'} ) # ----------------------------------------------------------------------
# Shutdown has now been started and lists for the shutdown processes
# and the processes to be killed has been created
# ----------------------------------------------------------------------
# Wait blocking until all shutdown processes has completed
mtr_wait_blocking(\%admin_pids);
# Make sure that process has shutdown else try to kill them
mtr_check_stop_servers(\@kill_pids);
foreach my $mysqld (@{$master}, @{$slave})
{ {
ndbcluster_stop_slave(); if ( ! $mysqld->{'pid'} )
$slave->[0]->{'ndbcluster'}= 1; {
rm_ndbcluster_tables($mysqld->{'path_myddir'});
}
} }
}
sub run_testcase_start_servers($) {
my $tinfo= shift;
my $tname= $tinfo->{'name'};
mtr_stop_mysqld_servers(\@args); if ( $glob_use_running_server or $glob_use_embedded_server )
{
return;
}
if ( $tinfo->{'component_id'} eq 'mysqld' )
{
if ( $opt_with_ndbcluster and
!$clusters->[0]->{'pid'} and
$tinfo->{'ndb_test'} )
{
# Test need cluster, cluster is not started, start it
ndbcluster_start($clusters->[0], "");
}
if ( !$master->[0]->{'pid'} )
{
# Master mysqld is not started
do_before_start_master($tname,$tinfo->{'master_sh'});
mysqld_start($master->[0],$tinfo->{'master_opt'},[]);
# Remember options used to start
$master->[0]->{'master_opt'}= $tinfo->{'master_opt'};
}
if ( $clusters->[0]->{'pid'} and ! $master->[1]->{'pid'} )
{
# Test needs cluster, start an extra mysqld connected to cluster
# First wait for first mysql server to have created ndb system tables ok
# FIXME This is a workaround so that only one mysqld creates the tables
if ( ! sleep_until_file_created(
"$master->[0]->{'path_myddir'}/cluster/apply_status.ndb",
$master->[0]->{'start_timeout'},
$master->[0]->{'pid'}))
{
mtr_report("Failed to create 'cluster/apply_status' table");
report_failure_and_restart($tinfo);
return;
}
mtr_tofile($master->[1]->{'path_myerr'},"CURRENT_TEST: $tname\n");
mysqld_start($master->[1],$tinfo->{'master_opt'},[]);
}
if ( $tinfo->{'master_restart'} )
{
# Save this test case information, so next can examine it
$master->[0]->{'running_master_is_special'}= $tinfo;
}
}
elsif ( ! $opt_skip_im and $tinfo->{'component_id'} eq 'im' )
{
# We have to create defaults file every time, in order to ensure that it
# will be the same for each test. The problem is that test can change the
# file (by SET/UNSET commands), so w/o recreating the file, execution of
# one test can affect the other.
im_create_defaults_file($instance_manager);
im_start($instance_manager, $tinfo->{im_opts});
}
# ----------------------------------------------------------------------
# Start slaves - if needed
# ----------------------------------------------------------------------
if ( $tinfo->{'slave_num'} )
{
mtr_tofile($slave->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
do_before_start_slave($tname,$tinfo->{'slave_sh'});
if ( $opt_with_ndbcluster and
!$clusters->[1]->{'pid'} and
$tinfo->{'ndb_test'} )
{
# Test need slave cluster, cluster is not started, start it
ndbcluster_start($clusters->[1], "");
}
for ( my $idx= 0; $idx < $tinfo->{'slave_num'}; $idx++ )
{
if ( ! $slave->[$idx]->{'pid'} )
{
mysqld_start($slave->[$idx],$tinfo->{'slave_opt'},
$tinfo->{'slave_mi'});
}
}
}
# Wait for clusters to start
foreach my $cluster (@{$clusters})
{
next if !$cluster->{'pid'};
if (ndbcluster_wait_started($cluster))
{
# failed to start
mtr_report("Start of $cluster->{'name'} cluster failed, ");
}
}
# Wait for mysqld's to start
foreach my $mysqld (@{$master},@{$slave})
{
next if !$mysqld->{'pid'};
if (mysqld_wait_started($mysqld))
{
mtr_error("Failed to start $mysqld->{'type'} mysqld $mysqld->{'idx'}");
}
}
} }
############################################################################## ##############################################################################
# #
# Instance Manager management routines. # Instance Manager management routines.
...@@ -3174,9 +3392,12 @@ sub im_stop($) { ...@@ -3174,9 +3392,12 @@ sub im_stop($) {
# Before a testcase, run in record mode, save result file to var # Before a testcase, run in record mode, save result file to var
# After testcase, run and compare with the recorded file, they should be equal! # After testcase, run and compare with the recorded file, they should be equal!
# #
sub run_check_testcase ($) { sub run_check_testcase ($$) {
my $mode= shift; my $mode= shift;
my $mysqld= shift;
my $name= "check-" . $mysqld->{'type'} . $mysqld->{'idx'};
my $args; my $args;
mtr_init_args(\$args); mtr_init_args(\$args);
...@@ -3187,14 +3408,14 @@ sub run_check_testcase ($) { ...@@ -3187,14 +3408,14 @@ sub run_check_testcase ($) {
mtr_add_arg($args, "--skip-safemalloc"); mtr_add_arg($args, "--skip-safemalloc");
mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir); mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir);
mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_mysock'}); mtr_add_arg($args, "--socket=%s", $mysqld->{'path_sock'});
mtr_add_arg($args, "--port=%d", $master->[0]->{'path_myport'}); mtr_add_arg($args, "--port=%d", $mysqld->{'port'});
mtr_add_arg($args, "--database=test"); mtr_add_arg($args, "--database=test");
mtr_add_arg($args, "--user=%s", $opt_user); mtr_add_arg($args, "--user=%s", $opt_user);
mtr_add_arg($args, "--password="); mtr_add_arg($args, "--password=");
mtr_add_arg($args, "-R"); mtr_add_arg($args, "-R");
mtr_add_arg($args, "$opt_vardir/tmp/check-testcase.result"); mtr_add_arg($args, "$opt_vardir/tmp/$name.result");
if ( $mode eq "before" ) if ( $mode eq "before" )
{ {
...@@ -3207,8 +3428,8 @@ sub run_check_testcase ($) { ...@@ -3207,8 +3428,8 @@ sub run_check_testcase ($) {
if ( $res == 1 and $mode = "after") if ( $res == 1 and $mode = "after")
{ {
mtr_run("diff",["-u", mtr_run("diff",["-u",
"$opt_vardir/tmp/check-testcase.result", "$opt_vardir/tmp/$name.result",
"$opt_vardir/tmp/check-testcase.reject"], "$opt_vardir/tmp/$name.reject"],
"", "", "", ""); "", "", "", "");
} }
elsif ( $res ) elsif ( $res )
...@@ -3222,8 +3443,8 @@ sub run_mysqltest ($) { ...@@ -3222,8 +3443,8 @@ sub run_mysqltest ($) {
my $tinfo= shift; my $tinfo= shift;
my $cmdline_mysqlcheck= "$exe_mysqlcheck --no-defaults -uroot " . my $cmdline_mysqlcheck= "$exe_mysqlcheck --no-defaults -uroot " .
"--port=$master->[0]->{'path_myport'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_mysock'} --password="; "--socket=$master->[0]->{'path_sock'} --password=";
if ( $opt_debug ) if ( $opt_debug )
{ {
$cmdline_mysqlcheck .= $cmdline_mysqlcheck .=
...@@ -3231,11 +3452,11 @@ sub run_mysqltest ($) { ...@@ -3231,11 +3452,11 @@ sub run_mysqltest ($) {
} }
my $cmdline_mysqldump= "$exe_mysqldump --no-defaults -uroot " . my $cmdline_mysqldump= "$exe_mysqldump --no-defaults -uroot " .
"--port=$master->[0]->{'path_myport'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_mysock'} --password="; "--socket=$master->[0]->{'path_sock'} --password=";
my $cmdline_mysqldumpslave= "$exe_mysqldump --no-defaults -uroot " . my $cmdline_mysqldumpslave= "$exe_mysqldump --no-defaults -uroot " .
"--socket=$slave->[0]->{'path_mysock'} --password="; "--socket=$slave->[0]->{'path_sock'} --password=";
if ( $opt_debug ) if ( $opt_debug )
{ {
...@@ -3248,8 +3469,8 @@ sub run_mysqltest ($) { ...@@ -3248,8 +3469,8 @@ sub run_mysqltest ($) {
unless ( $glob_win32 ) unless ( $glob_win32 )
{ {
$cmdline_mysqlslap= "$exe_mysqlslap -uroot " . $cmdline_mysqlslap= "$exe_mysqlslap -uroot " .
"--port=$master->[0]->{'path_myport'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_mysock'} --password= " . "--socket=$master->[0]->{'path_sock'} --password= " .
"--lock-directory=$opt_tmpdir"; "--lock-directory=$opt_tmpdir";
if ( $opt_debug ) if ( $opt_debug )
{ {
...@@ -3259,8 +3480,8 @@ sub run_mysqltest ($) { ...@@ -3259,8 +3480,8 @@ sub run_mysqltest ($) {
} }
my $cmdline_mysqlimport= "$exe_mysqlimport -uroot " . my $cmdline_mysqlimport= "$exe_mysqlimport -uroot " .
"--port=$master->[0]->{'path_myport'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_mysock'} --password="; "--socket=$master->[0]->{'path_sock'} --password=";
if ( $opt_debug ) if ( $opt_debug )
{ {
$cmdline_mysqlimport .= $cmdline_mysqlimport .=
...@@ -3268,8 +3489,8 @@ sub run_mysqltest ($) { ...@@ -3268,8 +3489,8 @@ sub run_mysqltest ($) {
} }
my $cmdline_mysqlshow= "$exe_mysqlshow -uroot " . my $cmdline_mysqlshow= "$exe_mysqlshow -uroot " .
"--port=$master->[0]->{'path_myport'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_mysock'} --password="; "--socket=$master->[0]->{'path_sock'} --password=";
if ( $opt_debug ) if ( $opt_debug )
{ {
$cmdline_mysqlshow .= $cmdline_mysqlshow .=
...@@ -3289,13 +3510,13 @@ sub run_mysqltest ($) { ...@@ -3289,13 +3510,13 @@ sub run_mysqltest ($) {
my $cmdline_mysql= my $cmdline_mysql=
"$exe_mysql --no-defaults --host=localhost --user=root --password= " . "$exe_mysql --no-defaults --host=localhost --user=root --password= " .
"--port=$master->[0]->{'path_myport'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_mysock'}"; "--socket=$master->[0]->{'path_sock'}";
my $cmdline_mysql_client_test= my $cmdline_mysql_client_test=
"$exe_mysql_client_test --no-defaults --testcase --user=root --silent " . "$exe_mysql_client_test --no-defaults --testcase --user=root --silent " .
"--port=$master->[0]->{'path_myport'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_mysock'}"; "--socket=$master->[0]->{'path_sock'}";
if ( $glob_use_embedded_server ) if ( $glob_use_embedded_server )
{ {
...@@ -3308,8 +3529,8 @@ sub run_mysqltest ($) { ...@@ -3308,8 +3529,8 @@ sub run_mysqltest ($) {
my $cmdline_mysql_fix_system_tables= my $cmdline_mysql_fix_system_tables=
"$exe_mysql_fix_system_tables --no-defaults --host=localhost --user=root --password= " . "$exe_mysql_fix_system_tables --no-defaults --host=localhost --user=root --password= " .
"--basedir=$glob_basedir --bindir=$path_client_bindir --verbose " . "--basedir=$glob_basedir --bindir=$path_client_bindir --verbose " .
"--port=$master->[0]->{'path_myport'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_mysock'}"; "--socket=$master->[0]->{'path_sock'}";
$ENV{'MYSQL'}= $cmdline_mysql; $ENV{'MYSQL'}= $cmdline_mysql;
$ENV{'MYSQL_CHECK'}= $cmdline_mysqlcheck; $ENV{'MYSQL_CHECK'}= $cmdline_mysqlcheck;
...@@ -3326,12 +3547,12 @@ sub run_mysqltest ($) { ...@@ -3326,12 +3547,12 @@ sub run_mysqltest ($) {
$ENV{'UDF_EXAMPLE_LIB'}= $ENV{'UDF_EXAMPLE_LIB'}=
($lib_udf_example ? basename($lib_udf_example) : ""); ($lib_udf_example ? basename($lib_udf_example) : "");
$ENV{'NDB_STATUS_OK'}= $flag_ndb_status_ok ? "YES" : "NO"; $ENV{'NDB_STATUS_OK'}= $clusters->[0]->{'installed_ok'};
$ENV{'NDB_SLAVE_STATUS_OK'}= $flag_ndb_slave_status_ok ? "YES" : "NO"; $ENV{'NDB_SLAVE_STATUS_OK'}= $clusters->[0]->{'installed_ok'};;
$ENV{'NDB_EXTRA_TEST'}= $opt_ndb_extra_test; $ENV{'NDB_EXTRA_TEST'}= $opt_ndb_extra_test;
$ENV{'NDB_MGM'}= $exe_ndb_mgm; $ENV{'NDB_MGM'}= $exe_ndb_mgm;
$ENV{'NDB_BACKUP_DIR'}= $path_ndb_data_dir; $ENV{'NDB_BACKUP_DIR'}= $clusters->[0]->{'data_dir'};
$ENV{'NDB_DATA_DIR'}= $path_ndb_data_dir; $ENV{'NDB_DATA_DIR'}= $clusters->[0]->{'data_dir'};
$ENV{'NDB_TOOLS_DIR'}= $path_ndb_tools_dir; $ENV{'NDB_TOOLS_DIR'}= $path_ndb_tools_dir;
$ENV{'NDB_TOOLS_OUTPUT'}= $file_ndb_testrun_log; $ENV{'NDB_TOOLS_OUTPUT'}= $file_ndb_testrun_log;
$ENV{'NDB_CONNECTSTRING'}= $opt_ndbconnectstring; $ENV{'NDB_CONNECTSTRING'}= $opt_ndbconnectstring;
...@@ -3356,8 +3577,8 @@ sub run_mysqltest ($) { ...@@ -3356,8 +3577,8 @@ sub run_mysqltest ($) {
} }
else # component_id == mysqld else # component_id == mysqld
{ {
mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_mysock'}); mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_sock'});
mtr_add_arg($args, "--port=%d", $master->[0]->{'path_myport'}); mtr_add_arg($args, "--port=%d", $master->[0]->{'port'});
mtr_add_arg($args, "--database=test"); mtr_add_arg($args, "--database=test");
mtr_add_arg($args, "--user=%s", $opt_user); mtr_add_arg($args, "--user=%s", $opt_user);
mtr_add_arg($args, "--password="); mtr_add_arg($args, "--password=");
...@@ -3444,7 +3665,7 @@ sub run_mysqltest ($) { ...@@ -3444,7 +3665,7 @@ sub run_mysqltest ($) {
if ( $glob_use_embedded_server ) if ( $glob_use_embedded_server )
{ {
mysqld_arguments($args,'master',0,$tinfo->{'master_opt'},[],0); mysqld_arguments($args,'master',0,$tinfo->{'master_opt'},[]);
} }
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
...@@ -3501,14 +3722,26 @@ sub run_mysqltest ($) { ...@@ -3501,14 +3722,26 @@ sub run_mysqltest ($) {
if ( $opt_check_testcases ) if ( $opt_check_testcases )
{ {
run_check_testcase("before"); foreach my $mysqld (@{$master}, @{$slave})
{
if ($mysqld->{'pid'})
{
run_check_testcase("before", $mysqld);
}
}
} }
my $res = mtr_run_test($exe,$args,"","",$path_timefile,""); my $res = mtr_run_test($exe,$args,"","",$path_timefile,"");
if ( $opt_check_testcases ) if ( $opt_check_testcases )
{ {
run_check_testcase("after"); foreach my $mysqld (@{$master}, @{$slave})
{
if ($mysqld->{'pid'})
{
run_check_testcase("after", $mysqld);
}
}
} }
return $res; return $res;
...@@ -3829,6 +4062,7 @@ Misc options ...@@ -3829,6 +4062,7 @@ Misc options
comment=STR Write STR to the output comment=STR Write STR to the output
notimer Don't show test case execution time notimer Don't show test case execution time
script-debug Debug this script itself script-debug Debug this script itself
verbose More verbose output
start-and-exit Only initialize and start the servers, using the start-and-exit Only initialize and start the servers, using the
startup settings for the specified test case (if any) startup settings for the specified test case (if any)
start-dirty Only start the servers (without initialization) for start-dirty Only start the servers (without initialization) for
......
...@@ -780,12 +780,6 @@ t1 CREATE TABLE `t1` ( ...@@ -780,12 +780,6 @@ t1 CREATE TABLE `t1` (
`i` int(11) DEFAULT NULL `i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 MAX_ROWS=4294967295 ) ENGINE=MyISAM DEFAULT CHARSET=latin1 MAX_ROWS=4294967295
drop table t1; drop table t1;
create table t1(f1 varchar(800) binary not null, key(f1)) engine = innodb
character set utf8 collate utf8_general_ci;
Warnings:
Warning 1071 Specified key was too long; max key length is 765 bytes
insert into t1 values('aaa');
drop table t1;
CREATE TABLE t1 (a int, b int); CREATE TABLE t1 (a int, b int);
insert into t1 values (1,1),(1,2); insert into t1 values (1,1),(1,2);
CREATE TABLE t2 (primary key (a)) select * from t1; CREATE TABLE t2 (primary key (a)) select * from t1;
......
...@@ -653,15 +653,6 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -653,15 +653,6 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 range k2 k2 4 NULL 6 Using where; Using index 1 SIMPLE t2 range k2 k2 4 NULL 6 Using where; Using index
1 SIMPLE t1 index NULL PRIMARY 3 NULL 15 Using index 1 SIMPLE t1 index NULL PRIMARY 3 NULL 15 Using index
drop table t1, t2; drop table t1, t2;
create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB;
insert into t1 values (1, 3);
select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ;
count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ
1
select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ;
Case When Count(*) < MAX_REQ Then 1 Else 0 End
1
drop table t1;
create table t1 (a char(10)); create table t1 (a char(10));
insert into t1 values ('a'),('b'),('c'); insert into t1 values ('a'),('b'),('c');
select coercibility(max(a)) from t1; select coercibility(max(a)) from t1;
......
create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB;
insert into t1 values (1, 3);
select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ;
count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ
1
select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ;
Case When Count(*) < MAX_REQ Then 1 Else 0 End
1
drop table t1;
create table t1m (a int) engine=myisam;
create table t1i (a int) engine=innodb;
create table t2m (a int) engine=myisam;
create table t2i (a int) engine=innodb;
insert into t2m values (5);
insert into t2i values (5);
select min(a) from t1m;
min(a)
NULL
select min(7) from t1m;
min(7)
NULL
select min(7) from DUAL;
min(7)
NULL
explain select min(7) from t2m join t1m;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
select min(7) from t2m join t1m;
min(7)
NULL
select max(a) from t1m;
max(a)
NULL
select max(7) from t1m;
max(7)
NULL
select max(7) from DUAL;
max(7)
NULL
explain select max(7) from t2m join t1m;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
select max(7) from t2m join t1m;
max(7)
NULL
select 1, min(a) from t1m where a=99;
1 min(a)
1 NULL
select 1, min(a) from t1m where 1=99;
1 min(a)
1 NULL
select 1, min(1) from t1m where a=99;
1 min(1)
1 NULL
select 1, min(1) from t1m where 1=99;
1 min(1)
1 NULL
select 1, max(a) from t1m where a=99;
1 max(a)
1 NULL
select 1, max(a) from t1m where 1=99;
1 max(a)
1 NULL
select 1, max(1) from t1m where a=99;
1 max(1)
1 NULL
select 1, max(1) from t1m where 1=99;
1 max(1)
1 NULL
select min(a) from t1i;
min(a)
NULL
select min(7) from t1i;
min(7)
NULL
select min(7) from DUAL;
min(7)
NULL
explain select min(7) from t2i join t1i;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2i ALL NULL NULL NULL NULL 1
1 SIMPLE t1i ALL NULL NULL NULL NULL 1
select min(7) from t2i join t1i;
min(7)
NULL
select max(a) from t1i;
max(a)
NULL
select max(7) from t1i;
max(7)
NULL
select max(7) from DUAL;
max(7)
NULL
explain select max(7) from t2i join t1i;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2i ALL NULL NULL NULL NULL 1
1 SIMPLE t1i ALL NULL NULL NULL NULL 1
select max(7) from t2i join t1i;
max(7)
NULL
select 1, min(a) from t1i where a=99;
1 min(a)
1 NULL
select 1, min(a) from t1i where 1=99;
1 min(a)
1 NULL
select 1, min(1) from t1i where a=99;
1 min(1)
1 NULL
select 1, min(1) from t1i where 1=99;
1 min(1)
1 NULL
select 1, max(a) from t1i where a=99;
1 max(a)
1 NULL
select 1, max(a) from t1i where 1=99;
1 max(a)
1 NULL
select 1, max(1) from t1i where a=99;
1 max(1)
1 NULL
select 1, max(1) from t1i where 1=99;
1 max(1)
1 NULL
explain select count(*), min(7), max(7) from t1m, t1i;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1m system NULL NULL NULL NULL 0 const row not found
1 SIMPLE t1i ALL NULL NULL NULL NULL 1
select count(*), min(7), max(7) from t1m, t1i;
count(*) min(7) max(7)
0 NULL NULL
explain select count(*), min(7), max(7) from t1m, t2i;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1m system NULL NULL NULL NULL 0 const row not found
1 SIMPLE t2i ALL NULL NULL NULL NULL 1
select count(*), min(7), max(7) from t1m, t2i;
count(*) min(7) max(7)
0 NULL NULL
explain select count(*), min(7), max(7) from t2m, t1i;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2m system NULL NULL NULL NULL 1
1 SIMPLE t1i ALL NULL NULL NULL NULL 1
select count(*), min(7), max(7) from t2m, t1i;
count(*) min(7) max(7)
0 NULL NULL
drop table t1m, t1i, t2m, t2i;
create table t4 (
pk_col int auto_increment primary key, a1 char(64), a2 char(64), b char(16), c char(16) not null, d char(16), dummy char(64) default ' '
) engine=innodb;
insert into t4 (a1, a2, b, c, d) values
('a','a','a','a111','xy1'),('a','a','a','b111','xy2'),('a','a','a','c111','xy3'),('a','a','a','d111','xy4'),
('a','a','b','e112','xy1'),('a','a','b','f112','xy2'),('a','a','b','g112','xy3'),('a','a','b','h112','xy4'),
('a','b','a','i121','xy1'),('a','b','a','j121','xy2'),('a','b','a','k121','xy3'),('a','b','a','l121','xy4'),
('a','b','b','m122','xy1'),('a','b','b','n122','xy2'),('a','b','b','o122','xy3'),('a','b','b','p122','xy4'),
('b','a','a','a211','xy1'),('b','a','a','b211','xy2'),('b','a','a','c211','xy3'),('b','a','a','d211','xy4'),
('b','a','b','e212','xy1'),('b','a','b','f212','xy2'),('b','a','b','g212','xy3'),('b','a','b','h212','xy4'),
('b','b','a','i221','xy1'),('b','b','a','j221','xy2'),('b','b','a','k221','xy3'),('b','b','a','l221','xy4'),
('b','b','b','m222','xy1'),('b','b','b','n222','xy2'),('b','b','b','o222','xy3'),('b','b','b','p222','xy4'),
('c','a','a','a311','xy1'),('c','a','a','b311','xy2'),('c','a','a','c311','xy3'),('c','a','a','d311','xy4'),
('c','a','b','e312','xy1'),('c','a','b','f312','xy2'),('c','a','b','g312','xy3'),('c','a','b','h312','xy4'),
('c','b','a','i321','xy1'),('c','b','a','j321','xy2'),('c','b','a','k321','xy3'),('c','b','a','l321','xy4'),
('c','b','b','m322','xy1'),('c','b','b','n322','xy2'),('c','b','b','o322','xy3'),('c','b','b','p322','xy4'),
('d','a','a','a411','xy1'),('d','a','a','b411','xy2'),('d','a','a','c411','xy3'),('d','a','a','d411','xy4'),
('d','a','b','e412','xy1'),('d','a','b','f412','xy2'),('d','a','b','g412','xy3'),('d','a','b','h412','xy4'),
('d','b','a','i421','xy1'),('d','b','a','j421','xy2'),('d','b','a','k421','xy3'),('d','b','a','l421','xy4'),
('d','b','b','m422','xy1'),('d','b','b','n422','xy2'),('d','b','b','o422','xy3'),('d','b','b','p422','xy4'),
('a','a','a','a111','xy1'),('a','a','a','b111','xy2'),('a','a','a','c111','xy3'),('a','a','a','d111','xy4'),
('a','a','b','e112','xy1'),('a','a','b','f112','xy2'),('a','a','b','g112','xy3'),('a','a','b','h112','xy4'),
('a','b','a','i121','xy1'),('a','b','a','j121','xy2'),('a','b','a','k121','xy3'),('a','b','a','l121','xy4'),
('a','b','b','m122','xy1'),('a','b','b','n122','xy2'),('a','b','b','o122','xy3'),('a','b','b','p122','xy4'),
('b','a','a','a211','xy1'),('b','a','a','b211','xy2'),('b','a','a','c211','xy3'),('b','a','a','d211','xy4'),
('b','a','b','e212','xy1'),('b','a','b','f212','xy2'),('b','a','b','g212','xy3'),('b','a','b','h212','xy4'),
('b','b','a','i221','xy1'),('b','b','a','j221','xy2'),('b','b','a','k221','xy3'),('b','b','a','l221','xy4'),
('b','b','b','m222','xy1'),('b','b','b','n222','xy2'),('b','b','b','o222','xy3'),('b','b','b','p222','xy4'),
('c','a','a','a311','xy1'),('c','a','a','b311','xy2'),('c','a','a','c311','xy3'),('c','a','a','d311','xy4'),
('c','a','b','e312','xy1'),('c','a','b','f312','xy2'),('c','a','b','g312','xy3'),('c','a','b','h312','xy4'),
('c','b','a','i321','xy1'),('c','b','a','j321','xy2'),('c','b','a','k321','xy3'),('c','b','a','l321','xy4'),
('c','b','b','m322','xy1'),('c','b','b','n322','xy2'),('c','b','b','o322','xy3'),('c','b','b','p322','xy4'),
('d','a','a','a411','xy1'),('d','a','a','b411','xy2'),('d','a','a','c411','xy3'),('d','a','a','d411','xy4'),
('d','a','b','e412','xy1'),('d','a','b','f412','xy2'),('d','a','b','g412','xy3'),('d','a','b','h412','xy4'),
('d','b','a','i421','xy1'),('d','b','a','j421','xy2'),('d','b','a','k421','xy3'),('d','b','a','l421','xy4'),
('d','b','b','m422','xy1'),('d','b','b','n422','xy2'),('d','b','b','o422','xy3'),('d','b','b','p422','xy4');
create index idx12672_0 on t4 (a1);
create index idx12672_1 on t4 (a1,a2,b,c);
create index idx12672_2 on t4 (a1,a2,b);
analyze table t4;
Table Op Msg_type Msg_text
test.t4 analyze status OK
select distinct a1 from t4 where pk_col not in (1,2,3,4);
a1
a
b
c
d
drop table t4;
create table t1 (
a varchar(30), b varchar(30), primary key(a), key(b)
) engine=innodb;
select distinct a from t1;
a
drop table t1;
create table t1(a int, key(a)) engine=innodb;
insert into t1 values(1);
select a, count(a) from t1 group by a with rollup;
a count(a)
1 1
NULL 1
drop table t1;
create table t1 (f1 int, f2 char(1), primary key(f1,f2)) engine=innodb;
insert into t1 values ( 1,"e"),(2,"a"),( 3,"c"),(4,"d");
alter table t1 drop primary key, add primary key (f2, f1);
explain select distinct f1 a, f1 b from t1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL PRIMARY 5 NULL 4 Using index; Using temporary
explain select distinct f1, f2 from t1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range NULL PRIMARY 5 NULL 3 Using index for group-by; Using temporary
drop table t1;
...@@ -326,3 +326,9 @@ ERROR 23000: Duplicate entry '1' for key 'PRIMARY' ...@@ -326,3 +326,9 @@ ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
SELECT * from t2; SELECT * from t2;
a b a b
drop table t1,t2; drop table t1,t2;
create table t1(f1 varchar(800) binary not null, key(f1)) engine = innodb
character set utf8 collate utf8_general_ci;
Warnings:
Warning 1071 Specified key was too long; max key length is 765 bytes
insert into t1 values('aaa');
drop table t1;
...@@ -1135,25 +1135,6 @@ id select_type table type possible_keys key key_len ref rows Extra ...@@ -1135,25 +1135,6 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 4 Using where 1 SIMPLE t2 ALL PRIMARY NULL NULL NULL 4 Using where
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.a 1 1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.a 1
DROP TABLE t1,t2; DROP TABLE t1,t2;
CREATE TABLE t1 (id int(11) NOT NULL PRIMARY KEY, name varchar(20),
INDEX (name)) ENGINE=InnoDB;
CREATE TABLE t2 (id int(11) NOT NULL PRIMARY KEY, fkey int(11),
FOREIGN KEY (fkey) REFERENCES t2(id)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1,'A1'),(2,'A2'),(3,'B');
INSERT INTO t2 VALUES (1,1),(2,2),(3,2),(4,3),(5,3);
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index
1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%' OR FALSE;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 index NULL fkey 5 NULL 5 Using index
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.fkey 1 Using where
DROP TABLE t1,t2;
DROP VIEW IF EXISTS v1,v2; DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2; DROP TABLE IF EXISTS t1,t2;
CREATE TABLE t1 (a int); CREATE TABLE t1 (a int);
......
CREATE TABLE t1 (id int(11) NOT NULL PRIMARY KEY, name varchar(20),
INDEX (name)) ENGINE=InnoDB;
CREATE TABLE t2 (id int(11) NOT NULL PRIMARY KEY, fkey int(11),
FOREIGN KEY (fkey) REFERENCES t2(id)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1,'A1'),(2,'A2'),(3,'B');
INSERT INTO t2 VALUES (1,1),(2,2),(3,2),(4,3),(5,3);
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index
1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%' OR FALSE;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index PRIMARY,name name 23 NULL 3 Using where; Using index
1 SIMPLE t2 ref fkey fkey 5 test.t1.id 1 Using where; Using index
DROP TABLE t1,t2;
...@@ -70,3 +70,5 @@ show status like "Qcache_hits"; ...@@ -70,3 +70,5 @@ show status like "Qcache_hits";
Variable_name Value Variable_name Value
Qcache_hits 0 Qcache_hits 0
drop table t1, t2; drop table t1, t2;
set GLOBAL query_cache_size=0;
set GLOBAL query_cache_size=0;
...@@ -660,11 +660,6 @@ partition by list (a) ...@@ -660,11 +660,6 @@ partition by list (a)
alter table t1 rebuild partition; alter table t1 rebuild partition;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
drop table t1; drop table t1;
create table t1 (a int) engine=innodb partition by hash(a) ;
show table status like 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
t1 InnoDB 10 Compact 2 8192 16384 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned
drop table t1;
create table t2 (s1 int not null auto_increment, primary key (s1)) partition by list (s1) (partition p1 values in (1),partition p2 values in (2),partition p3 values in (3),partition p4 values in (4)); create table t2 (s1 int not null auto_increment, primary key (s1)) partition by list (s1) (partition p1 values in (1),partition p2 values in (2),partition p3 values in (3),partition p4 values in (4));
insert into t2 values (null),(null),(null); insert into t2 values (null),(null),(null);
select * from t2; select * from t2;
...@@ -739,6 +734,7 @@ CALL test.p1(13); ...@@ -739,6 +734,7 @@ CALL test.p1(13);
Warnings: Warnings:
Warning 1196 Some non-transactional changed tables couldn't be rolled back Warning 1196 Some non-transactional changed tables couldn't be rolled back
drop table t1; drop table t1;
drop procedure test.p1;
CREATE TABLE t1 (a int not null) CREATE TABLE t1 (a int not null)
partition by key(a) partition by key(a)
(partition p0 COMMENT='first partition'); (partition p0 COMMENT='first partition');
......
create table t1 (a int) engine=innodb partition by hash(a) ;
show table status like 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
t1 InnoDB 10 Compact 2 8192 16384 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned
drop table t1;
...@@ -33,3 +33,5 @@ n ...@@ -33,3 +33,5 @@ n
1234 1234
DROP DATABASE mysqltest1; DROP DATABASE mysqltest1;
stop slave; stop slave;
use test;
drop table t1;
...@@ -73,3 +73,4 @@ CREATE TABLE t1 ( a INT UNIQUE ); ...@@ -73,3 +73,4 @@ CREATE TABLE t1 ( a INT UNIQUE );
SET FOREIGN_KEY_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
INSERT INTO t1 VALUES (1),(1); INSERT INTO t1 VALUES (1),(1);
Got one of the listed errors Got one of the listed errors
drop table t1;
...@@ -79,3 +79,4 @@ terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by ...@@ -79,3 +79,4 @@ terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
ERROR 23000: Duplicate entry '2003-03-22' for key 'day' ERROR 23000: Duplicate entry '2003-03-22' for key 'day'
drop table t2; drop table t2;
drop table t2; drop table t2;
drop table t1;
...@@ -194,3 +194,4 @@ idpro price nbprice ...@@ -194,3 +194,4 @@ idpro price nbprice
1 1.0000 3 1 1.0000 3
2 1.0000 2 2 1.0000 2
3 2.0000 1 3 2.0000 1
DROP TABLE t1, t2;
...@@ -194,3 +194,4 @@ idpro price nbprice ...@@ -194,3 +194,4 @@ idpro price nbprice
1 1.0000 3 1 1.0000 3
2 1.0000 2 2 1.0000 2
3 2.0000 1 3 2.0000 1
DROP TABLE t1, t2;
...@@ -43,3 +43,4 @@ DROP PROCEDURE IF EXISTS mysqltest1.p1; ...@@ -43,3 +43,4 @@ DROP PROCEDURE IF EXISTS mysqltest1.p1;
DROP PROCEDURE IF EXISTS mysqltest1.p2; DROP PROCEDURE IF EXISTS mysqltest1.p2;
DROP TABLE IF EXISTS mysqltest1.t1; DROP TABLE IF EXISTS mysqltest1.t1;
DROP TABLE IF EXISTS mysqltest1.t2; DROP TABLE IF EXISTS mysqltest1.t2;
DROP DATABASE mysqltest1;
...@@ -43,3 +43,4 @@ DROP PROCEDURE IF EXISTS mysqltest1.p1; ...@@ -43,3 +43,4 @@ DROP PROCEDURE IF EXISTS mysqltest1.p1;
DROP PROCEDURE IF EXISTS mysqltest1.p2; DROP PROCEDURE IF EXISTS mysqltest1.p2;
DROP TABLE IF EXISTS mysqltest1.t1; DROP TABLE IF EXISTS mysqltest1.t1;
DROP TABLE IF EXISTS mysqltest1.t2; DROP TABLE IF EXISTS mysqltest1.t2;
DROP DATABASE mysqltest1;
...@@ -49,4 +49,4 @@ select * from t1; ...@@ -49,4 +49,4 @@ select * from t1;
a b a b
select * from t2; select * from t2;
a b a b
drop table t1; drop table t1, t2;
...@@ -15,3 +15,4 @@ slave_load_tmpdir SLAVE_LOAD_TMPDIR ...@@ -15,3 +15,4 @@ slave_load_tmpdir SLAVE_LOAD_TMPDIR
show variables like 'slave_skip_errors'; show variables like 'slave_skip_errors';
Variable_name Value Variable_name Value
slave_skip_errors 3,100,137,643,1752 slave_skip_errors 3,100,137,643,1752
set global slave_net_timeout=default;
...@@ -314,16 +314,6 @@ select * from db_bug14533.t1; ...@@ -314,16 +314,6 @@ select * from db_bug14533.t1;
ERROR 42000: SELECT command denied to user 'user_bug14533'@'localhost' for table 't1' ERROR 42000: SELECT command denied to user 'user_bug14533'@'localhost' for table 't1'
drop user user_bug14533@localhost; drop user user_bug14533@localhost;
drop database db_bug14533; drop database db_bug14533;
CREATE DATABASE db_bug7787;
use db_bug7787;
CREATE PROCEDURE p1()
SHOW INNODB STATUS;
Warnings:
Warning 1541 The syntax 'SHOW INNODB STATUS' is deprecated and will be removed in MySQL 5.2. Please use 'SHOW ENGINE INNODB STATUS' instead.
GRANT EXECUTE ON PROCEDURE p1 TO user_bug7787@localhost;
DROP DATABASE db_bug7787;
drop user user_bug7787@localhost;
use test;
---> connection: root ---> connection: root
DROP DATABASE IF EXISTS mysqltest; DROP DATABASE IF EXISTS mysqltest;
......
...@@ -4796,22 +4796,6 @@ i ...@@ -4796,22 +4796,6 @@ i
0 0
drop table t3| drop table t3|
drop procedure bug16887| drop procedure bug16887|
create table t3 (f1 int, f2 varchar(3), primary key(f1)) engine=innodb|
insert into t3 values (1,'aaa'),(2,'bbb'),(3,'ccc')|
CREATE FUNCTION bug13575 ( p1 integer )
returns varchar(3)
BEGIN
DECLARE v1 VARCHAR(10) DEFAULT null;
SELECT f2 INTO v1 FROM t3 WHERE f1 = p1;
RETURN v1;
END|
select distinct f1, bug13575(f1) from t3 order by f1|
f1 bug13575(f1)
1 aaa
2 bbb
3 ccc
drop function bug13575;
drop table t3|
drop procedure if exists bug16474_1| drop procedure if exists bug16474_1|
drop procedure if exists bug16474_2| drop procedure if exists bug16474_2|
delete from t1| delete from t1|
......
...@@ -530,3 +530,29 @@ count(*) ...@@ -530,3 +530,29 @@ count(*)
drop table t3, t4| drop table t3, t4|
drop procedure bug14210| drop procedure bug14210|
set @@session.max_heap_table_size=default| set @@session.max_heap_table_size=default|
CREATE DATABASE db_bug7787|
use db_bug7787|
CREATE PROCEDURE p1()
SHOW INNODB STATUS; |
Warnings:
Warning 1541 The syntax 'SHOW INNODB STATUS' is deprecated and will be removed in MySQL 5.2. Please use 'SHOW ENGINE INNODB STATUS' instead.
GRANT EXECUTE ON PROCEDURE p1 TO user_bug7787@localhost|
DROP DATABASE db_bug7787|
drop user user_bug7787@localhost|
use test|
create table t3 (f1 int, f2 varchar(3), primary key(f1)) engine=innodb|
insert into t3 values (1,'aaa'),(2,'bbb'),(3,'ccc')|
CREATE FUNCTION bug13575 ( p1 integer )
returns varchar(3)
BEGIN
DECLARE v1 VARCHAR(10) DEFAULT null;
SELECT f2 INTO v1 FROM t3 WHERE f1 = p1;
RETURN v1;
END|
select distinct f1, bug13575(f1) from t3 order by f1|
f1 bug13575(f1)
1 aaa
2 bbb
3 ccc
drop function bug13575|
drop table t3|
...@@ -670,13 +670,6 @@ alter table t1 max_rows=100000000000; ...@@ -670,13 +670,6 @@ alter table t1 max_rows=100000000000;
show create table t1; show create table t1;
drop table t1; drop table t1;
#
# Bug#17530: Incorrect key truncation on table creation caused server crash.
#
create table t1(f1 varchar(800) binary not null, key(f1)) engine = innodb
character set utf8 collate utf8_general_ci;
insert into t1 values('aaa');
drop table t1;
# End of 5.0 tests # End of 5.0 tests
......
...@@ -378,13 +378,15 @@ explain ...@@ -378,13 +378,15 @@ explain
select concat(min(t1.a1),min(t2.a4)) from t1, t2 where t2.a4 <> 'AME'; select concat(min(t1.a1),min(t2.a4)) from t1, t2 where t2.a4 <> 'AME';
drop table t1, t2; drop table t1, t2;
--disable_warnings # Moved to func_group_innodb
create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB; #--disable_warnings
--enable_warnings #create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB;
insert into t1 values (1, 3); #--enable_warnings
select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ; #insert into t1 values (1, 3);
select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ; #select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ;
drop table t1; #select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ;
#drop table t1;
create table t1 (a char(10)); create table t1 (a char(10));
insert into t1 values ('a'),('b'),('c'); insert into t1 values ('a'),('b'),('c');
...@@ -539,6 +541,11 @@ INSERT INTO t1 VALUES ...@@ -539,6 +541,11 @@ INSERT INTO t1 VALUES
SELECT MAX(id) FROM t1 WHERE id < 3 AND a=2 AND b=6; SELECT MAX(id) FROM t1 WHERE id < 3 AND a=2 AND b=6;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #12882 min/max inconsistent on empty table
#
# Test case moved to func_group_innodb
# End of 4.1 tests # End of 4.1 tests
# #
......
#
# Test of group functions that depend on innodb
#
--source include/have_innodb.inc
--disable_warnings
create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB;
--enable_warnings
insert into t1 values (1, 3);
select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ;
select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ;
drop table t1;
#
# Bug #12882 min/max inconsistent on empty table
#
--disable_warnings
create table t1m (a int) engine=myisam;
create table t1i (a int) engine=innodb;
create table t2m (a int) engine=myisam;
create table t2i (a int) engine=innodb;
--enable_warnings
insert into t2m values (5);
insert into t2i values (5);
# test with MyISAM
select min(a) from t1m;
select min(7) from t1m;
select min(7) from DUAL;
explain select min(7) from t2m join t1m;
select min(7) from t2m join t1m;
select max(a) from t1m;
select max(7) from t1m;
select max(7) from DUAL;
explain select max(7) from t2m join t1m;
select max(7) from t2m join t1m;
select 1, min(a) from t1m where a=99;
select 1, min(a) from t1m where 1=99;
select 1, min(1) from t1m where a=99;
select 1, min(1) from t1m where 1=99;
select 1, max(a) from t1m where a=99;
select 1, max(a) from t1m where 1=99;
select 1, max(1) from t1m where a=99;
select 1, max(1) from t1m where 1=99;
# test with InnoDB
select min(a) from t1i;
select min(7) from t1i;
select min(7) from DUAL;
explain select min(7) from t2i join t1i;
select min(7) from t2i join t1i;
select max(a) from t1i;
select max(7) from t1i;
select max(7) from DUAL;
explain select max(7) from t2i join t1i;
select max(7) from t2i join t1i;
select 1, min(a) from t1i where a=99;
select 1, min(a) from t1i where 1=99;
select 1, min(1) from t1i where a=99;
select 1, min(1) from t1i where 1=99;
select 1, max(a) from t1i where a=99;
select 1, max(a) from t1i where 1=99;
select 1, max(1) from t1i where a=99;
select 1, max(1) from t1i where 1=99;
# mixed MyISAM/InnoDB test
explain select count(*), min(7), max(7) from t1m, t1i;
select count(*), min(7), max(7) from t1m, t1i;
explain select count(*), min(7), max(7) from t1m, t2i;
select count(*), min(7), max(7) from t1m, t2i;
explain select count(*), min(7), max(7) from t2m, t1i;
select count(*), min(7), max(7) from t2m, t1i;
drop table t1m, t1i, t2m, t2i;
...@@ -659,7 +659,30 @@ select a1 from t1 where a2 = 'b' group by a1; ...@@ -659,7 +659,30 @@ select a1 from t1 where a2 = 'b' group by a1;
explain select distinct a1 from t1 where a2 = 'b'; explain select distinct a1 from t1 where a2 = 'b';
select distinct a1 from t1 where a2 = 'b'; select distinct a1 from t1 where a2 = 'b';
drop table t1,t2,t3; #
# Bug #12672: primary key implcitly included in every innodb index
#
# Test case moved to group_min_max_innodb
#
# Bug #6142: a problem with the empty innodb table
#
# Test case moved to group_min_max_innodb
#
# Bug #9798: group by with rollup
#
# Test case moved to group_min_max_innodb
#
# Bug #13293 Wrongly used index results in endless loop.
#
# Test case moved to group_min_max_innodb
# #
# Bug #14920 Ordering aggregated result sets with composite primary keys # Bug #14920 Ordering aggregated result sets with composite primary keys
# corrupts resultset # corrupts resultset
......
#
# Test file for WL#1724 (Min/Max Optimization for Queries with Group By Clause).
# The queries in this file test query execution via QUICK_GROUP_MIN_MAX_SELECT
# that depends on InnoDB
#
--source include/have_innodb.inc
#
# Bug #12672: primary key implcitly included in every innodb index
#
--disable_warnings
create table t4 (
pk_col int auto_increment primary key, a1 char(64), a2 char(64), b char(16), c char(16) not null, d char(16), dummy char(64) default ' '
) engine=innodb;
--enable_warnings
insert into t4 (a1, a2, b, c, d) values
('a','a','a','a111','xy1'),('a','a','a','b111','xy2'),('a','a','a','c111','xy3'),('a','a','a','d111','xy4'),
('a','a','b','e112','xy1'),('a','a','b','f112','xy2'),('a','a','b','g112','xy3'),('a','a','b','h112','xy4'),
('a','b','a','i121','xy1'),('a','b','a','j121','xy2'),('a','b','a','k121','xy3'),('a','b','a','l121','xy4'),
('a','b','b','m122','xy1'),('a','b','b','n122','xy2'),('a','b','b','o122','xy3'),('a','b','b','p122','xy4'),
('b','a','a','a211','xy1'),('b','a','a','b211','xy2'),('b','a','a','c211','xy3'),('b','a','a','d211','xy4'),
('b','a','b','e212','xy1'),('b','a','b','f212','xy2'),('b','a','b','g212','xy3'),('b','a','b','h212','xy4'),
('b','b','a','i221','xy1'),('b','b','a','j221','xy2'),('b','b','a','k221','xy3'),('b','b','a','l221','xy4'),
('b','b','b','m222','xy1'),('b','b','b','n222','xy2'),('b','b','b','o222','xy3'),('b','b','b','p222','xy4'),
('c','a','a','a311','xy1'),('c','a','a','b311','xy2'),('c','a','a','c311','xy3'),('c','a','a','d311','xy4'),
('c','a','b','e312','xy1'),('c','a','b','f312','xy2'),('c','a','b','g312','xy3'),('c','a','b','h312','xy4'),
('c','b','a','i321','xy1'),('c','b','a','j321','xy2'),('c','b','a','k321','xy3'),('c','b','a','l321','xy4'),
('c','b','b','m322','xy1'),('c','b','b','n322','xy2'),('c','b','b','o322','xy3'),('c','b','b','p322','xy4'),
('d','a','a','a411','xy1'),('d','a','a','b411','xy2'),('d','a','a','c411','xy3'),('d','a','a','d411','xy4'),
('d','a','b','e412','xy1'),('d','a','b','f412','xy2'),('d','a','b','g412','xy3'),('d','a','b','h412','xy4'),
('d','b','a','i421','xy1'),('d','b','a','j421','xy2'),('d','b','a','k421','xy3'),('d','b','a','l421','xy4'),
('d','b','b','m422','xy1'),('d','b','b','n422','xy2'),('d','b','b','o422','xy3'),('d','b','b','p422','xy4'),
('a','a','a','a111','xy1'),('a','a','a','b111','xy2'),('a','a','a','c111','xy3'),('a','a','a','d111','xy4'),
('a','a','b','e112','xy1'),('a','a','b','f112','xy2'),('a','a','b','g112','xy3'),('a','a','b','h112','xy4'),
('a','b','a','i121','xy1'),('a','b','a','j121','xy2'),('a','b','a','k121','xy3'),('a','b','a','l121','xy4'),
('a','b','b','m122','xy1'),('a','b','b','n122','xy2'),('a','b','b','o122','xy3'),('a','b','b','p122','xy4'),
('b','a','a','a211','xy1'),('b','a','a','b211','xy2'),('b','a','a','c211','xy3'),('b','a','a','d211','xy4'),
('b','a','b','e212','xy1'),('b','a','b','f212','xy2'),('b','a','b','g212','xy3'),('b','a','b','h212','xy4'),
('b','b','a','i221','xy1'),('b','b','a','j221','xy2'),('b','b','a','k221','xy3'),('b','b','a','l221','xy4'),
('b','b','b','m222','xy1'),('b','b','b','n222','xy2'),('b','b','b','o222','xy3'),('b','b','b','p222','xy4'),
('c','a','a','a311','xy1'),('c','a','a','b311','xy2'),('c','a','a','c311','xy3'),('c','a','a','d311','xy4'),
('c','a','b','e312','xy1'),('c','a','b','f312','xy2'),('c','a','b','g312','xy3'),('c','a','b','h312','xy4'),
('c','b','a','i321','xy1'),('c','b','a','j321','xy2'),('c','b','a','k321','xy3'),('c','b','a','l321','xy4'),
('c','b','b','m322','xy1'),('c','b','b','n322','xy2'),('c','b','b','o322','xy3'),('c','b','b','p322','xy4'),
('d','a','a','a411','xy1'),('d','a','a','b411','xy2'),('d','a','a','c411','xy3'),('d','a','a','d411','xy4'),
('d','a','b','e412','xy1'),('d','a','b','f412','xy2'),('d','a','b','g412','xy3'),('d','a','b','h412','xy4'),
('d','b','a','i421','xy1'),('d','b','a','j421','xy2'),('d','b','a','k421','xy3'),('d','b','a','l421','xy4'),
('d','b','b','m422','xy1'),('d','b','b','n422','xy2'),('d','b','b','o422','xy3'),('d','b','b','p422','xy4');
create index idx12672_0 on t4 (a1);
create index idx12672_1 on t4 (a1,a2,b,c);
create index idx12672_2 on t4 (a1,a2,b);
analyze table t4;
select distinct a1 from t4 where pk_col not in (1,2,3,4);
drop table t4;
#
# Bug #6142: a problem with the empty innodb table
#
--disable_warnings
create table t1 (
a varchar(30), b varchar(30), primary key(a), key(b)
) engine=innodb;
--enable_warnings
select distinct a from t1;
drop table t1;
#
# Bug #9798: group by with rollup
#
--disable_warnings
create table t1(a int, key(a)) engine=innodb;
--enable_warnings
insert into t1 values(1);
select a, count(a) from t1 group by a with rollup;
drop table t1;
#
# Bug #13293 Wrongly used index results in endless loop.
#
create table t1 (f1 int, f2 char(1), primary key(f1,f2)) engine=innodb;
insert into t1 values ( 1,"e"),(2,"a"),( 3,"c"),(4,"d");
alter table t1 drop primary key, add primary key (f2, f1);
explain select distinct f1 a, f1 b from t1;
explain select distinct f1, f2 from t1;
drop table t1;
...@@ -272,3 +272,11 @@ TRUNCATE table t2; ...@@ -272,3 +272,11 @@ TRUNCATE table t2;
INSERT INTO t2 select * from t1; INSERT INTO t2 select * from t1;
SELECT * from t2; SELECT * from t2;
drop table t1,t2; drop table t1,t2;
#
# Bug#17530: Incorrect key truncation on table creation caused server crash.
#
create table t1(f1 varchar(800) binary not null, key(f1)) engine = innodb
character set utf8 collate utf8_general_ci;
insert into t1 values('aaa');
drop table t1;
...@@ -763,22 +763,8 @@ DROP TABLE t1,t2; ...@@ -763,22 +763,8 @@ DROP TABLE t1,t2;
# Test for bug #17164: ORed FALSE blocked conversion of outer join into join # Test for bug #17164: ORed FALSE blocked conversion of outer join into join
# #
CREATE TABLE t1 (id int(11) NOT NULL PRIMARY KEY, name varchar(20), # Test case moved to join_outer_innodb
INDEX (name)) ENGINE=InnoDB;
CREATE TABLE t2 (id int(11) NOT NULL PRIMARY KEY, fkey int(11),
FOREIGN KEY (fkey) REFERENCES t2(id)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1,'A1'),(2,'A2'),(3,'B');
INSERT INTO t2 VALUES (1,1),(2,2),(3,2),(4,3),(5,3);
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%';
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%' OR FALSE;
DROP TABLE t1,t2;
# #
# Bug 19396: LEFT OUTER JOIN over views in curly braces # Bug 19396: LEFT OUTER JOIN over views in curly braces
......
#
# test of left outer join for tests that depends on innodb
#
--source include/have_innodb.inc
#
# Test for bug #17164: ORed FALSE blocked conversion of outer join into join
#
CREATE TABLE t1 (id int(11) NOT NULL PRIMARY KEY, name varchar(20),
INDEX (name)) ENGINE=InnoDB;
CREATE TABLE t2 (id int(11) NOT NULL PRIMARY KEY, fkey int(11),
FOREIGN KEY (fkey) REFERENCES t2(id)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1,'A1'),(2,'A2'),(3,'B');
INSERT INTO t2 VALUES (1,1),(2,2),(3,2),(4,3),(5,3);
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%';
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%' OR FALSE;
DROP TABLE t1,t2;
...@@ -63,3 +63,10 @@ show status like "Qcache_hits"; ...@@ -63,3 +63,10 @@ show status like "Qcache_hits";
drop table t1, t2; drop table t1, t2;
# Turn off query cache on server1
connection server1;
set GLOBAL query_cache_size=0;
# Turn off query cache on server2
connection server2;
set GLOBAL query_cache_size=0;
...@@ -769,13 +769,6 @@ alter table t1 rebuild partition; ...@@ -769,13 +769,6 @@ alter table t1 rebuild partition;
drop table t1; drop table t1;
#
# Bug #14673: Wrong InnoDB default row format
#
create table t1 (a int) engine=innodb partition by hash(a) ;
show table status like 't1';
drop table t1;
# #
# Bug #14526: Partitions: indexed searches fail # Bug #14526: Partitions: indexed searches fail
# #
...@@ -866,6 +859,7 @@ delimiter ;| ...@@ -866,6 +859,7 @@ delimiter ;|
CALL test.p1(12); CALL test.p1(12);
CALL test.p1(13); CALL test.p1(13);
drop table t1; drop table t1;
drop procedure test.p1;
# #
# Bug 13520: Problem with delimiters in COMMENT DATA DIRECTORY .. # Bug 13520: Problem with delimiters in COMMENT DATA DIRECTORY ..
......
--source include/have_innodb.inc
#
# Bug #14673: Wrong InnoDB default row format
#
create table t1 (a int) engine=innodb partition by hash(a) ;
show table status like 't1';
drop table t1;
...@@ -56,3 +56,7 @@ connection slave; ...@@ -56,3 +56,7 @@ connection slave;
stop slave; stop slave;
#system rm -rf $MYSQLTEST_VARDIR/master-data/mysqltest1; #system rm -rf $MYSQLTEST_VARDIR/master-data/mysqltest1;
connection master;
use test;
drop table t1;
...@@ -89,5 +89,5 @@ select * from t2; ...@@ -89,5 +89,5 @@ select * from t2;
# cleanup # cleanup
connection master; connection master;
drop table t1; drop table t1, t2;
sync_slave_with_master; sync_slave_with_master;
...@@ -12,3 +12,6 @@ show variables like 'slave_load_tmpdir'; ...@@ -12,3 +12,6 @@ show variables like 'slave_load_tmpdir';
# We just set some arbitrary values in variables-master.opt so we can test # We just set some arbitrary values in variables-master.opt so we can test
# that a list of values works correctly # that a list of values works correctly
show variables like 'slave_skip_errors'; show variables like 'slave_skip_errors';
# Cleanup
set global slave_net_timeout=default;
...@@ -526,29 +526,6 @@ drop user user_bug14533@localhost; ...@@ -526,29 +526,6 @@ drop user user_bug14533@localhost;
drop database db_bug14533; drop database db_bug14533;
#
# BUG#7787: Stored procedures: improper warning for "grant execute" statement
#
# Prepare.
CREATE DATABASE db_bug7787;
use db_bug7787;
# Test.
CREATE PROCEDURE p1()
SHOW INNODB STATUS;
GRANT EXECUTE ON PROCEDURE p1 TO user_bug7787@localhost;
# Cleanup.
DROP DATABASE db_bug7787;
drop user user_bug7787@localhost;
use test;
# #
# WL#2897: Complete definer support in the stored routines. # WL#2897: Complete definer support in the stored routines.
# #
......
...@@ -5636,23 +5636,6 @@ call bug16887()| ...@@ -5636,23 +5636,6 @@ call bug16887()|
drop table t3| drop table t3|
drop procedure bug16887| drop procedure bug16887|
#
# Bug#13575 SP funcs in select with distinct/group and order by can
# produce bad data
#
create table t3 (f1 int, f2 varchar(3), primary key(f1)) engine=innodb|
insert into t3 values (1,'aaa'),(2,'bbb'),(3,'ccc')|
CREATE FUNCTION bug13575 ( p1 integer )
returns varchar(3)
BEGIN
DECLARE v1 VARCHAR(10) DEFAULT null;
SELECT f2 INTO v1 FROM t3 WHERE f1 = p1;
RETURN v1;
END|
select distinct f1, bug13575(f1) from t3 order by f1|
drop function bug13575;
drop table t3|
# #
# BUG#16474: SP crashed MySQL # BUG#16474: SP crashed MySQL
# (when using "order by localvar", where 'localvar' is just that. # (when using "order by localvar", where 'localvar' is just that.
......
...@@ -552,6 +552,45 @@ drop table t3, t4| ...@@ -552,6 +552,45 @@ drop table t3, t4|
drop procedure bug14210| drop procedure bug14210|
set @@session.max_heap_table_size=default| set @@session.max_heap_table_size=default|
#
# BUG#7787: Stored procedures: improper warning for "grant execute" statement
#
# Prepare.
CREATE DATABASE db_bug7787|
use db_bug7787|
# Test.
CREATE PROCEDURE p1()
SHOW INNODB STATUS; |
GRANT EXECUTE ON PROCEDURE p1 TO user_bug7787@localhost|
# Cleanup.
DROP DATABASE db_bug7787|
drop user user_bug7787@localhost|
use test|
#
# Bug#13575 SP funcs in select with distinct/group and order by can
# produce bad data
#
create table t3 (f1 int, f2 varchar(3), primary key(f1)) engine=innodb|
insert into t3 values (1,'aaa'),(2,'bbb'),(3,'ccc')|
CREATE FUNCTION bug13575 ( p1 integer )
returns varchar(3)
BEGIN
DECLARE v1 VARCHAR(10) DEFAULT null;
SELECT f2 INTO v1 FROM t3 WHERE f1 = p1;
RETURN v1;
END|
select distinct f1, bug13575(f1) from t3 order by f1|
drop function bug13575|
drop table t3|
# #
# BUG#NNNN: New bug synopsis # BUG#NNNN: New bug synopsis
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define USES_TYPES /* sys/types is included */
#include "mysys_priv.h" #include "mysys_priv.h"
#include <sys/stat.h> #include <sys/stat.h>
#include <m_string.h> #include <m_string.h>
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define USES_TYPES
#include "my_global.h" #include "my_global.h"
#if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__NETWARE__) #if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__NETWARE__)
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define USES_TYPES /* sys/types is included */
#include "mysys_priv.h" #include "mysys_priv.h"
#include <my_dir.h> /* for stat */ #include <my_dir.h> /* for stat */
#include <m_string.h> #include <m_string.h>
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define USES_TYPES
#include "mysys_priv.h" #include "mysys_priv.h"
#include <my_dir.h> #include <my_dir.h>
#include "mysys_err.h" #include "mysys_err.h"
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define USES_TYPES
#include "mysys_priv.h" #include "mysys_priv.h"
#include "mysys_err.h" #include "mysys_err.h"
#include <my_dir.h> #include <my_dir.h>
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
/* TODO: check for overun of memory for names. */ /* TODO: check for overun of memory for names. */
/* Convert MSDOS-TIME to standar time_t (still needed?) */ /* Convert MSDOS-TIME to standar time_t (still needed?) */
#define USES_TYPES /* sys/types is included */
#include "mysys_priv.h" #include "mysys_priv.h"
#include <m_string.h> #include <m_string.h>
#include <my_dir.h> /* Structs used by my_dir,includes sys/types */ #include <my_dir.h> /* Structs used by my_dir,includes sys/types */
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define USES_TYPES
#include "mysys_priv.h" #include "mysys_priv.h"
#include "mysys_err.h" #include "mysys_err.h"
#include <my_dir.h> #include <my_dir.h>
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define USES_TYPES /* sys/types is included */
#include "mysys_priv.h" #include "mysys_priv.h"
#include <my_dir.h> #include <my_dir.h>
#include <m_string.h> #include <m_string.h>
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define USES_TYPES
#include "mysys_priv.h" #include "mysys_priv.h"
#include <my_dir.h> #include <my_dir.h>
#include "mysys_err.h" #include "mysys_err.h"
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
/* TODO: Test all functions */ /* TODO: Test all functions */
#define USES_TYPES
#include "mysys_priv.h" #include "mysys_priv.h"
#include "my_dir.h" #include "my_dir.h"
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
str is a (long) to record position where 0 is the first position. str is a (long) to record position where 0 is the first position.
*/ */
#define USES_TYPES
#include "mysql_priv.h" #include "mysql_priv.h"
#include <m_ctype.h> #include <m_ctype.h>
#include <assert.h> #include <assert.h>
......
...@@ -92,7 +92,7 @@ int main(int argc, char** argv){ ...@@ -92,7 +92,7 @@ int main(int argc, char** argv){
wait_status= NDB_MGM_NODE_STATUS_STARTED; wait_status= NDB_MGM_NODE_STATUS_STARTED;
} }
if (waitClusterStatus(_hostName, wait_status, _timeout) != 0) if (waitClusterStatus(_hostName, wait_status, _timeout*10) != 0)
return NDBT_ProgramExit(NDBT_FAILED); return NDBT_ProgramExit(NDBT_FAILED);
return NDBT_ProgramExit(NDBT_OK); return NDBT_ProgramExit(NDBT_OK);
} }
...@@ -311,7 +311,7 @@ waitClusterStatus(const char* _addr, ...@@ -311,7 +311,7 @@ waitClusterStatus(const char* _addr,
} }
g_info << "Waiting for cluster enter state " g_info << "Waiting for cluster enter state "
<< ndb_mgm_get_node_status_string(_status)<< endl; << ndb_mgm_get_node_status_string(_status)<< endl;
NdbSleep_SecSleep(1); NdbSleep_MilliSleep(100);
attempts++; attempts++;
} }
return 0; return 0;
......
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