summaryrefslogtreecommitdiff
path: root/mysql-test
diff options
context:
space:
mode:
authorBjorn Munch <Bjorn.Munch@sun.com>2010-02-22 14:52:11 +0100
committerBjorn Munch <Bjorn.Munch@sun.com>2010-02-22 14:52:11 +0100
commit38e811b83999c06d8d887c76ceb47b7de229da43 (patch)
tree5d8f58b7cdfa07f84d1ad9d29e8f802a03399c43 /mysql-test
parent5181551dee3306bcee410a31738e1a3ee9c2c501 (diff)
parentc4de42d6f9c9310c916e3b254fbb741851586bf4 (diff)
downloadmariadb-git-38e811b83999c06d8d887c76ceb47b7de229da43.tar.gz
merge from 5.1-mtr
Diffstat (limited to 'mysql-test')
-rw-r--r--mysql-test/include/mtr_warnings.sql13
-rw-r--r--mysql-test/lib/My/SafeProcess.pm133
-rwxr-xr-xmysql-test/lib/My/SafeProcess/safe_process_win.cc22
-rw-r--r--mysql-test/lib/mtr_cases.pm28
-rw-r--r--mysql-test/lib/mtr_gprof.pl45
-rw-r--r--mysql-test/lib/mtr_misc.pl13
-rw-r--r--mysql-test/lib/mtr_report.pm37
-rw-r--r--mysql-test/lib/mtr_stress.pl2
-rw-r--r--mysql-test/lib/v1/mtr_stress.pl2
-rwxr-xr-xmysql-test/lib/v1/mysql-test-run.pl5
-rwxr-xr-xmysql-test/mysql-test-run.pl313
-rw-r--r--mysql-test/r/mysqltest.result74
-rw-r--r--mysql-test/r/variables_community.result (renamed from mysql-test/r/variables+c.result)0
-rw-r--r--mysql-test/suite/sys_vars/t/innodb_table_locks_func.test1
-rw-r--r--mysql-test/suite/sys_vars/t/sql_low_priority_updates_func.test1
-rw-r--r--mysql-test/t/mysqltest.test200
-rw-r--r--mysql-test/t/partition_innodb_semi_consistent.test1
-rw-r--r--mysql-test/t/variables_community.test (renamed from mysql-test/t/variables+c.test)0
18 files changed, 650 insertions, 240 deletions
diff --git a/mysql-test/include/mtr_warnings.sql b/mysql-test/include/mtr_warnings.sql
index b2cc86fbd46..291c4c1cbe6 100644
--- a/mysql-test/include/mtr_warnings.sql
+++ b/mysql-test/include/mtr_warnings.sql
@@ -175,6 +175,19 @@ INSERT INTO global_suppressions VALUES
("Can't find file: '.\\\\test\\\\\\?{8}.frm'"),
("Slave: Unknown table 't1' Error_code: 1051"),
+ /* Messages from valgrind */
+ ("==[0-9]*== Memcheck,"),
+ ("==[0-9]*== Copyright"),
+ ("==[0-9]*== Using"),
+ ("==[0-9]*== For more details"),
+ /* This comes with innodb plugin tests */
+ ("==[0-9]*== Warning: set address range perms: large range"),
+
+ /* valgrind warnings: invalid file descriptor -1 in syscall
+ write()/read(). Bug #50414 */
+ ("==[0-9]*== Warning: invalid file descriptor -1 in syscall write()"),
+ ("==[0-9]*== Warning: invalid file descriptor -1 in syscall read()"),
+
/*
Transient network failures that cause warnings on reconnect.
BUG#47743 and BUG#47983.
diff --git a/mysql-test/lib/My/SafeProcess.pm b/mysql-test/lib/My/SafeProcess.pm
index 7e102b628ca..bfcad910a16 100644
--- a/mysql-test/lib/My/SafeProcess.pm
+++ b/mysql-test/lib/My/SafeProcess.pm
@@ -81,24 +81,28 @@ sub is_child {
}
-# Find the safe process binary or script
my @safe_process_cmd;
my $safe_kill;
-if (IS_WIN32PERL or IS_CYGWIN){
- # Use my_safe_process.exe
- my $exe= my_find_bin(".", ["lib/My/SafeProcess", "My/SafeProcess"],
- "my_safe_process");
- push(@safe_process_cmd, $exe);
-
- # Use my_safe_kill.exe
- $safe_kill= my_find_bin(".", "lib/My/SafeProcess", "my_safe_kill");
-}
-else
-{
- # Use my_safe_process
- my $exe= my_find_bin(".", ["lib/My/SafeProcess", "My/SafeProcess"],
- "my_safe_process");
- push(@safe_process_cmd, $exe);
+
+# Find the safe process binary or script
+sub find_bin {
+ if (IS_WIN32PERL or IS_CYGWIN)
+ {
+ # Use my_safe_process.exe
+ my $exe= my_find_bin(".", ["lib/My/SafeProcess", "My/SafeProcess"],
+ "my_safe_process");
+ push(@safe_process_cmd, $exe);
+
+ # Use my_safe_kill.exe
+ $safe_kill= my_find_bin(".", "lib/My/SafeProcess", "my_safe_kill");
+ }
+ else
+ {
+ # Use my_safe_process
+ my $exe= my_find_bin(".", ["lib/My/SafeProcess", "My/SafeProcess"],
+ "my_safe_process");
+ push(@safe_process_cmd, $exe);
+ }
}
@@ -184,63 +188,6 @@ sub run {
}
#
-# Start a process that returns after "duration" seconds
-# or when it's parent process does not exist anymore
-#
-sub timer {
- my $class= shift;
- my $duration= shift or croak "duration required";
- my $parent_pid= $$;
-
- my $pid= My::SafeProcess::Base::_safe_fork();
- if ($pid){
- # Parent
- my $proc= bless
- ({
- SAFE_PID => $pid,
- SAFE_NAME => "timer",
- PARENT => $$,
- }, $class);
-
- # Put the new process in list of running
- $running{$pid}= $proc;
- return $proc;
- }
-
- # Child, install signal handlers and sleep for "duration"
- $SIG{INT}= 'IGNORE';
-
- $SIG{TERM}= sub {
- #print STDERR "timer $$: woken up, exiting!\n";
- exit(0);
- };
-
- $0= "safe_timer($duration)";
-
- if (IS_WIN32PERL){
- # Just a thread in same process
- sleep($duration);
- print STDERR "timer $$: expired after $duration seconds\n";
- exit(0);
- }
-
- my $count_down= $duration;
- while($count_down--){
-
- # Check that parent is still alive
- if (kill(0, $parent_pid) == 0){
- #print STDERR "timer $$: parent gone, exiting!\n";
- exit(0);
- }
-
- sleep(1);
- }
- print STDERR "timer $$: expired after $duration seconds\n";
- exit(0);
-}
-
-
-#
# Shutdown process nicely, and wait for shutdown_timeout seconds
# If processes hasn't shutdown, kill them hard and wait for return
#
@@ -338,12 +285,12 @@ sub start_kill {
$ret= system($safe_kill, $winpid) >> 8;
if ($ret == 3){
- print "Couldn't open the winpid: $winpid ",
+ print "Couldn't open the winpid: $winpid ".
"for pid: $pid, try one more time\n";
sleep(1);
$winpid= _winpid($pid);
$ret= system($safe_kill, $winpid) >> 8;
- print "Couldn't open the winpid: $winpid ",
+ print "Couldn't open the winpid: $winpid ".
"for pid: $pid, continue and see what happens...\n";
}
}
@@ -538,6 +485,40 @@ sub wait_any {
#
+# Wait for any process to exit, or a timeout
+#
+# Returns a reference to the SafeProcess that
+# exited or a pseudo-process with $proc->{timeout} == 1
+#
+
+sub wait_any_timeout {
+ my $class= shift;
+ my $timeout= shift;
+ my $proc;
+ my $millis=10;
+
+ do {
+ ::mtr_milli_sleep($millis);
+ # Slowly increse interval up to max. 1 second
+ $millis++ if $millis < 1000;
+ # Return a "fake" process for timeout
+ if (::has_expired($timeout)) {
+ $proc= bless
+ ({
+ SAFE_PID => 0,
+ SAFE_NAME => "timer",
+ timeout => 1,
+ }, $class);
+ } else {
+ $proc= check_any();
+ }
+ } while (! $proc);
+
+ return $proc;
+}
+
+
+#
# Wait for all processes to exit
#
sub wait_all {
@@ -594,7 +575,7 @@ sub self2str {
sub _verbose {
return unless $_verbose;
- print STDERR " ## ", @_, "\n";
+ print STDERR " ## ". @_. "\n";
}
diff --git a/mysql-test/lib/My/SafeProcess/safe_process_win.cc b/mysql-test/lib/My/SafeProcess/safe_process_win.cc
index aa9093fb2b4..896bd599f4f 100755
--- a/mysql-test/lib/My/SafeProcess/safe_process_win.cc
+++ b/mysql-test/lib/My/SafeProcess/safe_process_win.cc
@@ -186,14 +186,20 @@ int main(int argc, const char** argv )
die("No real args -> nothing to do");
/* Copy the remaining args to child_arg */
for (int j= i+1; j < argc; j++) {
- if (strchr (argv[j], ' ')) {
- /* Protect with "" if this arg contains a space */
- to+= _snprintf(to, child_args + sizeof(child_args) - to,
- "\"%s\" ", argv[j]);
- } else {
- to+= _snprintf(to, child_args + sizeof(child_args) - to,
- "%s ", argv[j]);
- }
+ arg= argv[j];
+ if (strchr (arg, ' ') &&
+ arg[0] != '\"' &&
+ arg[strlen(arg)] != '\"')
+ {
+ /* Quote arg that contains spaces and are not quoted already */
+ to+= _snprintf(to, child_args + sizeof(child_args) - to,
+ "\"%s\" ", arg);
+ }
+ else
+ {
+ to+= _snprintf(to, child_args + sizeof(child_args) - to,
+ "%s ", arg);
+ }
}
break;
} else {
diff --git a/mysql-test/lib/mtr_cases.pm b/mysql-test/lib/mtr_cases.pm
index ef3c2a43e87..1b6896e5a80 100644
--- a/mysql-test/lib/mtr_cases.pm
+++ b/mysql-test/lib/mtr_cases.pm
@@ -40,7 +40,6 @@ our $default_storage_engine;
our $opt_with_ndbcluster_only;
our $defaults_file;
our $defaults_extra_file;
-our $reorder= 1;
our $quick_collect;
sub collect_option {
@@ -99,7 +98,8 @@ sub init_pattern {
#
##############################################################################
-sub collect_test_cases ($$) {
+sub collect_test_cases ($$$) {
+ my $opt_reorder= shift; # True if we're reordering tests
my $suites= shift; # Semicolon separated list of test suites
my $opt_cases= shift;
my $cases= []; # Array of hash(one hash for each testcase)
@@ -118,10 +118,16 @@ sub collect_test_cases ($$) {
!(IS_WINDOWS && $::opt_embedded_server) &&
$lib_innodb_plugin);
- foreach my $suite (split(",", $suites))
+ # If not reordering, we also shouldn't group by suites, unless
+ # no test cases were named.
+ # This also effects some logic in the loop following this.
+ if ($opt_reorder or !@$opt_cases)
{
- push(@$cases, collect_one_suite($suite, $opt_cases));
- last if $some_test_found;
+ foreach my $suite (split(",", $suites))
+ {
+ push(@$cases, collect_one_suite($suite, $opt_cases));
+ last if $some_test_found;
+ }
}
if ( @$opt_cases )
@@ -135,6 +141,7 @@ sub collect_test_cases ($$) {
my ($sname, $tname, $extension)= split_testname($test_name_spec);
foreach my $test ( @$cases )
{
+ last unless $opt_reorder;
# test->{name} is always in suite.name format
if ( $test->{name} =~ /.*\.$tname/ )
{
@@ -144,12 +151,13 @@ sub collect_test_cases ($$) {
}
if ( not $found )
{
+ $sname= "main" if !$opt_reorder and !$sname;
mtr_error("Could not find '$tname' in '$suites' suite(s)") unless $sname;
- # If suite was part of name, find it there
- my ($this_case) = collect_one_suite($sname, [ $tname ]);
- if ($this_case)
+ # If suite was part of name, find it there, may come with combinations
+ my @this_case = collect_one_suite($sname, [ $tname ]);
+ if (@this_case)
{
- push (@$cases, $this_case);
+ push (@$cases, @this_case);
}
else
{
@@ -159,7 +167,7 @@ sub collect_test_cases ($$) {
}
}
- if ( $reorder && !$quick_collect)
+ if ( $opt_reorder && !$quick_collect)
{
# Reorder the test cases in an order that will make them faster to run
my %sort_criteria;
diff --git a/mysql-test/lib/mtr_gprof.pl b/mysql-test/lib/mtr_gprof.pl
index f6615301dd7..5820a4007b8 100644
--- a/mysql-test/lib/mtr_gprof.pl
+++ b/mysql-test/lib/mtr_gprof.pl
@@ -20,43 +20,20 @@
use strict;
-# These are not to be prefixed with "mtr_"
+sub gprof_collect ($@) {
+ my ($exe_mysqld, @gprof_dirs)= @_;
-sub gprof_prepare ();
-sub gprof_collect ();
+ print ("Collecting gprof reports.....\n");
-##############################################################################
-#
-#
-#
-##############################################################################
-
-sub gprof_prepare () {
-
- rmtree($::opt_gprof_dir);
- mkdir($::opt_gprof_dir);
-}
-
-# FIXME what about master1 and slave1?!
-sub gprof_collect () {
-
- if ( -f "$::master->[0]->{'path_myddir'}/gmon.out" )
- {
- # FIXME check result code?!
- mtr_run("gprof",
- [$::exe_master_mysqld,
- "$::master->[0]->{'path_myddir'}/gmon.out"],
- $::opt_gprof_master, "", "", "");
- print "Master execution profile has been saved in $::opt_gprof_master\n";
- }
- if ( -f "$::slave->[0]->{'path_myddir'}/gmon.out" )
+ foreach my $datadir (@gprof_dirs)
{
- # FIXME check result code?!
- mtr_run("gprof",
- [$::exe_slave_mysqld,
- "$::slave->[0]->{'path_myddir'}/gmon.out"],
- $::opt_gprof_slave, "", "", "");
- print "Slave execution profile has been saved in $::opt_gprof_slave\n";
+ my $gprof_msg= "$datadir/gprof.msg";
+ my $gprof_err= "$datadir/gprof.err";
+ if ( -f "$datadir/gmon.out" )
+ {
+ system("gprof $exe_mysqld $datadir/gmon.out 2>$gprof_err >$gprof_msg");
+ print ("GPROF output in $gprof_msg, errors in $gprof_err\n");
+ }
}
}
diff --git a/mysql-test/lib/mtr_misc.pl b/mysql-test/lib/mtr_misc.pl
index 658eb270535..97eb693b52e 100644
--- a/mysql-test/lib/mtr_misc.pl
+++ b/mysql-test/lib/mtr_misc.pl
@@ -30,7 +30,9 @@ sub mtr_script_exists(@);
sub mtr_file_exists(@);
sub mtr_exe_exists(@);
sub mtr_exe_maybe_exists(@);
-
+sub mtr_milli_sleep($);
+sub start_timer($);
+sub has_expired($);
##############################################################################
#
@@ -167,11 +169,18 @@ sub mtr_exe_exists (@) {
}
-sub mtr_milli_sleep {
+sub mtr_milli_sleep ($) {
die "usage: mtr_milli_sleep(milliseconds)" unless @_ == 1;
my ($millis)= @_;
select(undef, undef, undef, ($millis/1000));
}
+# Simple functions to start and check timers (have to be actively polled)
+# Timer can be "killed" by setting it to 0
+
+sub start_timer ($) { return time + $_[0]; }
+
+sub has_expired ($) { return $_[0] && time gt $_[0]; }
+
1;
diff --git a/mysql-test/lib/mtr_report.pm b/mysql-test/lib/mtr_report.pm
index 937e19111fb..1c4b940bbee 100644
--- a/mysql-test/lib/mtr_report.pm
+++ b/mysql-test/lib/mtr_report.pm
@@ -69,7 +69,7 @@ sub _mtr_report_test_name ($) {
$tname.= " '$tinfo->{combination}'"
if defined $tinfo->{combination};
- print _name(), _timestamp();
+ print _name(). _timestamp();
printf "%-40s ", $tname;
my $worker = $tinfo->{worker};
printf "w$worker " if $worker;
@@ -222,8 +222,8 @@ sub mtr_report_test ($) {
}
-sub mtr_report_stats ($;$) {
- my ($tests, $dont_error)= @_;
+sub mtr_report_stats ($$;$) {
+ my ($prefix, $tests, $dont_error)= @_;
# ----------------------------------------------------------------------
# Find out how we where doing
@@ -328,6 +328,9 @@ sub mtr_report_stats ($;$) {
}
}
+ # Print summary line prefix
+ print "$prefix: ";
+
# Print a list of testcases that failed
if ( $tot_failed != 0 )
{
@@ -387,13 +390,13 @@ sub mtr_report_stats ($;$) {
##############################################################################
sub mtr_print_line () {
- print '-' x 60, "\n";
+ print '-' x 60 . "\n";
}
sub mtr_print_thick_line {
my $char= shift || '=';
- print $char x 78, "\n";
+ print $char x 78 . "\n";
}
@@ -451,7 +454,7 @@ sub _timestamp {
# Always print message to screen
sub mtr_print (@) {
- print _name(), join(" ", @_), "\n";
+ print _name(). join(" ", @_). "\n";
}
@@ -459,22 +462,22 @@ sub mtr_print (@) {
sub mtr_report (@) {
if (defined $verbose)
{
- print _name(), join(" ", @_), "\n";
+ print _name(). join(" ", @_). "\n";
}
}
# Print warning to screen
sub mtr_warning (@) {
- print STDERR _name(), _timestamp(),
- "mysql-test-run: WARNING: ", join(" ", @_), "\n";
+ print STDERR _name(). _timestamp().
+ "mysql-test-run: WARNING: ". join(" ", @_). "\n";
}
# Print error to screen and then exit
sub mtr_error (@) {
- print STDERR _name(), _timestamp(),
- "mysql-test-run: *** ERROR: ", join(" ", @_), "\n";
+ print STDERR _name(). _timestamp().
+ "mysql-test-run: *** ERROR: ". join(" ", @_). "\n";
if (IS_WINDOWS)
{
POSIX::_exit(1);
@@ -489,8 +492,8 @@ sub mtr_error (@) {
sub mtr_debug (@) {
if ( $verbose > 2 )
{
- print STDERR _name(),
- _timestamp(), "####: ", join(" ", @_), "\n";
+ print STDERR _name().
+ _timestamp(). "####: ". join(" ", @_). "\n";
}
}
@@ -498,8 +501,8 @@ sub mtr_debug (@) {
sub mtr_verbose (@) {
if ( $verbose )
{
- print STDERR _name(), _timestamp(),
- "> ",join(" ", @_),"\n";
+ print STDERR _name(). _timestamp().
+ "> ".join(" ", @_)."\n";
}
}
@@ -509,8 +512,8 @@ sub mtr_verbose_restart (@) {
my $proc= $server->{proc};
if ( $verbose_restart )
{
- print STDERR _name(),_timestamp(),
- "> Restart $proc - ",join(" ", @args),"\n";
+ print STDERR _name()._timestamp().
+ "> Restart $proc - ".join(" ", @args)."\n";
}
}
diff --git a/mysql-test/lib/mtr_stress.pl b/mysql-test/lib/mtr_stress.pl
index cd5c7b0dbb7..702bc178ae5 100644
--- a/mysql-test/lib/mtr_stress.pl
+++ b/mysql-test/lib/mtr_stress.pl
@@ -150,7 +150,7 @@ sub run_stress_test ()
mtr_add_arg($args, "--verbose");
mtr_add_arg($args, "--cleanup");
mtr_add_arg($args, "--log-error-details");
- mtr_add_arg($args, "--abort-on-error");
+ mtr_add_arg($args, "--abort-on-error=1");
if ( $::opt_stress_init_file )
{
diff --git a/mysql-test/lib/v1/mtr_stress.pl b/mysql-test/lib/v1/mtr_stress.pl
index 93b06b32c5f..40800c9729b 100644
--- a/mysql-test/lib/v1/mtr_stress.pl
+++ b/mysql-test/lib/v1/mtr_stress.pl
@@ -150,7 +150,7 @@ sub run_stress_test ()
mtr_add_arg($args, "--verbose");
mtr_add_arg($args, "--cleanup");
mtr_add_arg($args, "--log-error-details");
- mtr_add_arg($args, "--abort-on-error");
+ mtr_add_arg($args, "--abort-on-error=1");
if ( $::opt_stress_init_file )
{
diff --git a/mysql-test/lib/v1/mysql-test-run.pl b/mysql-test/lib/v1/mysql-test-run.pl
index caece1d355d..5d06d9c4dd8 100755
--- a/mysql-test/lib/v1/mysql-test-run.pl
+++ b/mysql-test/lib/v1/mysql-test-run.pl
@@ -905,6 +905,11 @@ sub command_line_setup () {
mtr_report("Using default engine '$used_default_engine'")
if defined $used_default_engine;
+ if ($glob_win32 and defined $opt_mem) {
+ mtr_report("--mem not supported on Windows, ignored");
+ $opt_mem= undef;
+ }
+
# --------------------------------------------------------------------------
# Check if we should speed up tests by trying to run on tmpfs
# --------------------------------------------------------------------------
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 58317bb9f2e..a35741bebda 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -68,8 +68,8 @@ use My::File::Path; # Patched version of File::Path
use File::Basename;
use File::Copy;
use File::Find;
-use File::Temp qw / tempdir /;
-use File::Spec::Functions qw / splitdir /;
+use File::Temp qw/tempdir/;
+use File::Spec::Functions qw/splitdir/;
use My::Platform;
use My::SafeProcess;
use My::ConfigFactory;
@@ -87,6 +87,7 @@ use IO::Select;
require "lib/mtr_process.pl";
require "lib/mtr_io.pl";
require "lib/mtr_gcov.pl";
+require "lib/mtr_gprof.pl";
require "lib/mtr_misc.pl";
$SIG{INT}= sub { mtr_error("Got ^C signal"); };
@@ -118,6 +119,8 @@ END {
}
}
+sub env_or_val($$) { defined $ENV{$_[0]} ? $ENV{$_[0]} : $_[1] }
+
my $path_config_file; # The generated config file, var/my.cnf
# Visual Studio produces executables in different sub-directories based on the
@@ -167,6 +170,9 @@ our $opt_gcov_exe= "gcov";
our $opt_gcov_err= "mysql-test-gcov.msg";
our $opt_gcov_msg= "mysql-test-gcov.err";
+our $opt_gprof;
+our %gprof_dirs;
+
our $glob_debugger= 0;
our $opt_gdb;
our $opt_client_gdb;
@@ -185,7 +191,9 @@ our $opt_experimental;
our $experimental_test_cases;
my $baseport;
+# $opt_build_thread may later be set from $opt_port_base
my $opt_build_thread= $ENV{'MTR_BUILD_THREAD'} || "auto";
+my $opt_port_base= $ENV{'MTR_PORT_BASE'} || "auto";
my $build_thread= 0;
my $opt_record;
@@ -195,6 +203,7 @@ my $opt_skip_core;
our $opt_check_testcases= 1;
my $opt_mark_progress;
+my $opt_max_connections;
my $opt_sleep;
@@ -213,7 +222,8 @@ my $start_only;
my $opt_wait_all;
my $opt_repeat= 1;
my $opt_retry= 3;
-my $opt_retry_failure= 2;
+my $opt_retry_failure= env_or_val(MTR_RETRY_FAILURE => 2);
+my $opt_reorder= 1;
my $opt_strace_client;
@@ -226,6 +236,7 @@ my @default_valgrind_args= ("--show-reachable=yes");
my @valgrind_args;
my $opt_valgrind_path;
my $opt_callgrind;
+my %mysqld_logs;
my $opt_debug_sync_timeout= 300; # Default timeout for WAIT_FOR actions.
our $opt_warnings= 1;
@@ -242,9 +253,9 @@ our %mysqld_variables;
my $source_dist= 0;
-my $opt_max_save_core= $ENV{MTR_MAX_SAVE_CORE} || 5;
-my $opt_max_save_datadir= $ENV{MTR_MAX_SAVE_DATADIR} || 20;
-my $opt_max_test_fail= $ENV{MTR_MAX_TEST_FAIL} || 10;
+my $opt_max_save_core= env_or_val(MTR_MAX_SAVE_CORE => 5);
+my $opt_max_save_datadir= env_or_val(MTR_MAX_SAVE_DATADIR => 20);
+my $opt_max_test_fail= env_or_val(MTR_MAX_TEST_FAIL => 10);
my $opt_parallel= $ENV{MTR_PARALLEL} || 1;
@@ -265,6 +276,9 @@ sub main {
command_line_setup();
+ # --help will not reach here, so now it's safe to assume we have binaries
+ My::SafeProcess::find_bin();
+
if ( $opt_gcov ) {
gcov_prepare($basedir);
}
@@ -294,7 +308,7 @@ sub main {
}
mtr_report("Collecting tests...");
- my $tests= collect_test_cases($opt_suites, \@opt_cases);
+ my $tests= collect_test_cases($opt_reorder, $opt_suites, \@opt_cases);
if ( $opt_report_features ) {
# Put "report features" as the first test to run
@@ -411,7 +425,7 @@ sub main {
$opt_gcov_msg, $opt_gcov_err);
}
- mtr_report_stats($completed);
+ mtr_report_stats("Completed", $completed);
exit(0);
}
@@ -435,7 +449,7 @@ sub run_test_server ($$$) {
my $result;
my $exe_mysqld= find_mysqld($basedir) || ""; # Used as hint to CoreDump
- my $suite_timeout_proc= My::SafeProcess->timer(suite_timeout());
+ my $suite_timeout= start_timer(suite_timeout());
my $s= IO::Select->new();
$s->add($server);
@@ -456,7 +470,6 @@ sub run_test_server ($$$) {
mtr_verbose("Child closed socket");
$s->remove($sock);
if (--$childs == 0){
- $suite_timeout_proc->kill();
return $completed;
}
next;
@@ -525,15 +538,13 @@ sub run_test_server ($$$) {
if ( !$opt_force ) {
# Test has failed, force is off
- $suite_timeout_proc->kill();
push(@$completed, $result);
return $completed;
}
elsif ($opt_max_test_fail > 0 and
$num_failed_test >= $opt_max_test_fail) {
- $suite_timeout_proc->kill();
push(@$completed, $result);
- mtr_report_stats($completed, 1);
+ mtr_report_stats("Too many failed", $completed, 1);
mtr_report("Too many tests($num_failed_test) failed!",
"Terminating...");
return undef;
@@ -620,9 +631,9 @@ sub run_test_server ($$$) {
next;
}
- # Prefer same configuration
- if (defined $result and
- $result->{template_path} eq $t->{template_path})
+ # Prefer same configuration, or just use next if --noreorder
+ if (!$opt_reorder or (defined $result and
+ $result->{template_path} eq $t->{template_path}))
{
#mtr_report("Test uses same config => good match");
# Test uses same config => good match
@@ -663,9 +674,9 @@ sub run_test_server ($$$) {
# ----------------------------------------------------
# Check if test suite timer expired
# ----------------------------------------------------
- if ( ! $suite_timeout_proc->wait_one(0) )
+ if ( has_expired($suite_timeout) )
{
- mtr_report_stats($completed, 1);
+ mtr_report_stats("Timeout", $completed, 1);
mtr_report("Test suite timeout! Terminating...");
return undef;
}
@@ -741,6 +752,12 @@ sub run_worker ($) {
elsif ($line eq 'BYE'){
mtr_report("Server said BYE");
stop_all_servers($opt_shutdown_timeout);
+ if ($opt_valgrind_mysqld) {
+ valgrind_exit_reports();
+ }
+ if ( $opt_gprof ) {
+ gprof_collect (find_mysqld($basedir), keys %gprof_dirs);
+ }
exit(0);
}
else {
@@ -783,11 +800,12 @@ sub set_vardir {
sub command_line_setup {
my $opt_comment;
my $opt_usage;
+ my $opt_list_options;
# Read the command line options
# Note: Keep list, and the order, in sync with usage at end of this file
Getopt::Long::Configure("pass_through");
- GetOptions(
+ my %options=(
# Control what engine/variation to run
'embedded-server' => \$opt_embedded_server,
'ps-protocol' => \$opt_ps_protocol,
@@ -824,6 +842,7 @@ sub command_line_setup {
# Specify ports
'build-thread|mtr-build-thread=i' => \$opt_build_thread,
+ 'port-base|mtr-port-base=i' => \$opt_port_base,
# Test case authoring
'record' => \$opt_record,
@@ -854,6 +873,7 @@ sub command_line_setup {
# Coverage, profiling etc
'gcov' => \$opt_gcov,
+ 'gprof' => \$opt_gprof,
'valgrind|valgrind-all' => \$opt_valgrind,
'valgrind-mysqltest' => \$opt_valgrind_mysqltest,
'valgrind-mysqld' => \$opt_valgrind_mysqld,
@@ -884,7 +904,7 @@ sub command_line_setup {
'report-features' => \$opt_report_features,
'comment=s' => \$opt_comment,
'fast' => \$opt_fast,
- 'reorder!' => \&collect_option,
+ 'reorder!' => \$opt_reorder,
'enable-disabled' => \&collect_option,
'verbose+' => \$opt_verbose,
'verbose-restart' => \&report_option,
@@ -904,11 +924,16 @@ sub command_line_setup {
'warnings!' => \$opt_warnings,
'timestamp' => \&report_option,
'timediff' => \&report_option,
+ 'max-connections=i' => \$opt_max_connections,
'help|h' => \$opt_usage,
- ) or usage("Can't read options");
+ 'list-options' => \$opt_list_options,
+ );
+
+ GetOptions(%options) or usage("Can't read options");
usage("") if $opt_usage;
+ list_options(\%options) if $opt_list_options;
# --------------------------------------------------------------------------
# Setup verbosity
@@ -924,6 +949,11 @@ sub command_line_setup {
# Find the absolute path to the test directory
$glob_mysql_test_dir= cwd();
+ if ($glob_mysql_test_dir =~ / /)
+ {
+ die("Working directory \"$glob_mysql_test_dir\" contains space\n".
+ "Bailing out, cannot function properly with space in path");
+ }
if (IS_CYGWIN)
{
# Use mixed path format i.e c:/path/to/
@@ -1076,6 +1106,21 @@ sub command_line_setup {
}
}
+ if (IS_WINDOWS and defined $opt_mem) {
+ mtr_report("--mem not supported on Windows, ignored");
+ $opt_mem= undef;
+ }
+
+ if ($opt_port_base ne "auto")
+ {
+ if (my $rem= $opt_port_base % 10)
+ {
+ mtr_warning ("Port base $opt_port_base rounded down to multiple of 10");
+ $opt_port_base-= $rem;
+ }
+ $opt_build_thread= $opt_port_base / 10 - 1000;
+ }
+
# --------------------------------------------------------------------------
# Check if we should speed up tests by trying to run on tmpfs
# --------------------------------------------------------------------------
@@ -1241,7 +1286,7 @@ sub command_line_setup {
# --------------------------------------------------------------------------
# Gcov flag
# --------------------------------------------------------------------------
- if ( $opt_gcov and ! $source_dist )
+ if ( ($opt_gcov or $opt_gprof) and ! $source_dist )
{
mtr_error("Coverage test needs the source - please use source dist");
}
@@ -1340,8 +1385,7 @@ sub command_line_setup {
push(@valgrind_args, @default_valgrind_args)
unless @valgrind_args;
- # Make valgrind run in quiet mode so it only print errors
- push(@valgrind_args, "--quiet" );
+ # Don't add --quiet; you will loose the summary reports.
mtr_report("Running valgrind with options \"",
join(" ", @valgrind_args), "\"");
@@ -1446,6 +1490,12 @@ sub collect_mysqld_features {
mtr_add_arg($args, "--verbose");
mtr_add_arg($args, "--help");
+ # Need --user=root if running as *nix root user
+ if (!IS_WINDOWS and $> == 0)
+ {
+ mtr_add_arg($args, "--user=root");
+ }
+
my $exe_mysqld= find_mysqld($basedir);
my $cmd= join(" ", $exe_mysqld, @$args);
my $list= `$cmd`;
@@ -1764,11 +1814,11 @@ sub environment_setup {
{
push(@ld_library_paths, "$basedir/libmysql/.libs/",
"$basedir/libmysql_r/.libs/",
- "$basedir/zlib.libs/");
+ "$basedir/zlib/.libs/");
}
else
{
- push(@ld_library_paths, "$basedir/lib");
+ push(@ld_library_paths, "$basedir/lib", "$basedir/lib/mysql");
}
}
@@ -2508,6 +2558,7 @@ sub create_config_file_for_extern {
# binlog reads from [client] and [mysqlbinlog]
[mysqlbinlog]
character-sets-dir= $path_charsetsdir
+local-load= $opt_tmpdir
# mysql_fix_privilege_tables.sh don't read from [client]
[mysql_fix_privilege_tables]
@@ -2937,11 +2988,11 @@ sub check_testcase($$)
# Return immediately if no check proceess was started
return 0 unless ( keys %started );
- my $timeout_proc= My::SafeProcess->timer(check_timeout());
+ my $timeout= start_timer(check_timeout());
while (1){
my $result;
- my $proc= My::SafeProcess->wait_any();
+ my $proc= My::SafeProcess->wait_any_timeout($timeout);
mtr_report("Got $proc");
if ( delete $started{$proc->pid()} ) {
@@ -2965,9 +3016,6 @@ sub check_testcase($$)
if ( keys(%started) == 0){
# All checks completed
-
- $timeout_proc->kill();
-
return 0;
}
# Wait for next process to exit
@@ -3008,10 +3056,9 @@ test case was executed:\n";
}
}
- elsif ( $proc eq $timeout_proc ) {
- $tinfo->{comment}.= "Timeout $timeout_proc for ".
- "'check-testcase' expired after ".check_timeout().
- " seconds";
+ elsif ( $proc->{timeout} ) {
+ $tinfo->{comment}.= "Timeout for 'check-testcase' expired after "
+ .check_timeout()." seconds";
$result= 4;
}
else {
@@ -3026,8 +3073,6 @@ test case was executed:\n";
# Kill any check processes still running
map($_->kill(), values(%started));
- $timeout_proc->kill();
-
return $result;
}
@@ -3099,11 +3144,11 @@ sub run_on_all($$)
# Return immediately if no check proceess was started
return 0 unless ( keys %started );
- my $timeout_proc= My::SafeProcess->timer(check_timeout());
+ my $timeout= start_timer(check_timeout());
while (1){
my $result;
- my $proc= My::SafeProcess->wait_any();
+ my $proc= My::SafeProcess->wait_any_timeout($timeout);
mtr_report("Got $proc");
if ( delete $started{$proc->pid()} ) {
@@ -3122,17 +3167,15 @@ sub run_on_all($$)
if ( keys(%started) == 0){
# All completed
- $timeout_proc->kill();
return 0;
}
# Wait for next process to exit
next;
}
- elsif ( $proc eq $timeout_proc ) {
- $tinfo->{comment}.= "Timeout $timeout_proc for '$run' ".
- "expired after ". check_timeout().
- " seconds";
+ elsif ($proc->{timeout}) {
+ $tinfo->{comment}.= "Timeout for '$run' expired after "
+ .check_timeout()." seconds";
}
else {
# Unknown process returned, most likley a crash, abort everything
@@ -3144,8 +3187,6 @@ sub run_on_all($$)
# Kill any check processes still running
map($_->kill(), values(%started));
- $timeout_proc->kill();
-
return 1;
}
mtr_error("INTERNAL_ERROR: run_on_all");
@@ -3252,9 +3293,11 @@ sub run_testcase ($) {
mtr_verbose("Running test:", $tinfo->{name});
- # Allow only alpanumerics pluss _ - + . in combination names
+ # Allow only alpanumerics pluss _ - + . in combination names,
+ # or anything beginning with -- (the latter comes from --combination)
my $combination= $tinfo->{combination};
- if ($combination && $combination !~ /^\w[-\w\.\+]+$/)
+ if ($combination && $combination !~ /^\w[-\w\.\+]+$/
+ && $combination !~ /^--/)
{
mtr_error("Combination '$combination' contains illegal characters");
}
@@ -3375,7 +3418,7 @@ sub run_testcase ($) {
}
}
- my $test_timeout_proc= My::SafeProcess->timer(testcase_timeout());
+ my $test_timeout= start_timer(testcase_timeout());
do_before_run_mysqltest($tinfo);
@@ -3383,9 +3426,6 @@ sub run_testcase ($) {
# Failed to record state of server or server crashed
report_failure_and_restart($tinfo);
- # Stop the test case timer
- $test_timeout_proc->kill();
-
return 1;
}
@@ -3403,20 +3443,20 @@ sub run_testcase ($) {
if ($proc)
{
mtr_verbose ("Found exited process $proc");
- # If that was the timeout, cancel waiting
- if ( $proc eq $test_timeout_proc )
- {
- $keep_waiting_proc = 0;
- }
}
else
{
$proc = $keep_waiting_proc;
+ # Also check if timer has expired, if so cancel waiting
+ if ( has_expired($test_timeout) )
+ {
+ $keep_waiting_proc = 0;
+ }
}
}
- else
+ if (! $keep_waiting_proc)
{
- $proc= My::SafeProcess->wait_any();
+ $proc= My::SafeProcess->wait_any_timeout($test_timeout);
}
# Will be restored if we need to keep waiting
@@ -3433,9 +3473,6 @@ sub run_testcase ($) {
# ----------------------------------------------------
if ($proc eq $test)
{
- # Stop the test case timer
- $test_timeout_proc->kill();
-
my $res= $test->exit_status();
if ($res == 0 and $opt_warnings and check_warnings($tinfo) )
@@ -3492,6 +3529,14 @@ sub run_testcase ($) {
run_on_all($tinfo, "analyze-$analyze");
}
+ # Wait a bit and see if a server died, if so report that instead
+ mtr_milli_sleep(100);
+ my $srvproc= My::SafeProcess::check_any();
+ if ($srvproc && grep($srvproc eq $_, started(all_servers()))) {
+ $proc= $srvproc;
+ goto SRVDIED;
+ }
+
# Test case failure reported by mysqltest
report_failure_and_restart($tinfo);
}
@@ -3499,7 +3544,7 @@ sub run_testcase ($) {
{
# mysqltest failed, probably crashed
$tinfo->{comment}=
- "mysqltest failed with unexpected return code $res";
+ "mysqltest failed with unexpected return code $res\n";
report_failure_and_restart($tinfo);
}
@@ -3517,6 +3562,7 @@ sub run_testcase ($) {
# ----------------------------------------------------
# Check if it was an expected crash
# ----------------------------------------------------
+ SRVDIED:
my $check_crash = check_expected_crash_and_restart($proc);
if ($check_crash)
{
@@ -3529,7 +3575,7 @@ sub run_testcase ($) {
# ----------------------------------------------------
# Stop the test case timer
# ----------------------------------------------------
- $test_timeout_proc->kill();
+ $test_timeout= 0;
# ----------------------------------------------------
# Check if it was a server that died
@@ -3568,7 +3614,7 @@ sub run_testcase ($) {
# ----------------------------------------------------
# Check if testcase timer expired
# ----------------------------------------------------
- if ( $proc eq $test_timeout_proc )
+ if ( $proc->{timeout} )
{
my $log_file_name= $opt_vardir."/log/".$tinfo->{shortname}.".log";
$tinfo->{comment}=
@@ -3690,16 +3736,24 @@ sub extract_warning_lines ($$) {
(
qr/^Warning:|mysqld: Warning|\[Warning\]/,
qr/^Error:|\[ERROR\]/,
- qr/^==\d*==/, # valgrind errors
+ qr/^==\d+==\s+\S/, # valgrind errors
qr/InnoDB: Warning|InnoDB: Error/,
qr/^safe_mutex:|allocated at line/,
qr/missing DBUG_RETURN/,
qr/Attempting backtrace/,
qr/Assertion .* failed/,
);
+ my $skip_valgrind= 0;
foreach my $line ( @lines )
{
+ if ($opt_valgrind_mysqld) {
+ # Skip valgrind summary from tests where server has been restarted
+ # Should this contain memory leaks, the final report will find it
+ $skip_valgrind= 1 if $line =~ /^==\d+== ERROR SUMMARY:/;
+ $skip_valgrind= 0 unless $line =~ /^==\d+==/;
+ next if $skip_valgrind;
+ }
foreach my $pat ( @patterns )
{
if ( $line =~ /$pat/ )
@@ -3739,7 +3793,6 @@ sub start_check_warnings ($$) {
mtr_add_arg($args, "--skip-safemalloc");
mtr_add_arg($args, "--test-file=%s", "include/check-warnings.test");
- mtr_add_arg($args, "--verbose");
if ( $opt_embedded_server )
{
@@ -3802,11 +3855,11 @@ sub check_warnings ($) {
# Return immediately if no check proceess was started
return 0 unless ( keys %started );
- my $timeout_proc= My::SafeProcess->timer(check_timeout());
+ my $timeout= start_timer(check_timeout());
while (1){
my $result= 0;
- my $proc= My::SafeProcess->wait_any();
+ my $proc= My::SafeProcess->wait_any_timeout($timeout);
mtr_report("Got $proc");
if ( delete $started{$proc->pid()} ) {
@@ -3835,9 +3888,6 @@ sub check_warnings ($) {
if ( keys(%started) == 0){
# All checks completed
-
- $timeout_proc->kill();
-
return $result;
}
# Wait for next process to exit
@@ -3854,10 +3904,9 @@ sub check_warnings ($) {
$result= 2;
}
}
- elsif ( $proc eq $timeout_proc ) {
- $tinfo->{comment}.= "Timeout $timeout_proc for ".
- "'check warnings' expired after ".check_timeout().
- " seconds";
+ elsif ( $proc->{timeout} ) {
+ $tinfo->{comment}.= "Timeout for 'check warnings' expired after "
+ .check_timeout()." seconds";
$result= 4;
}
else {
@@ -3871,8 +3920,6 @@ sub check_warnings ($) {
# Kill any check processes still running
map($_->kill(), values(%started));
- $timeout_proc->kill();
-
return $result;
}
@@ -3890,7 +3937,7 @@ sub check_expected_crash_and_restart {
foreach my $mysqld ( mysqlds() )
{
- next unless ( $mysqld->{proc} eq $proc );
+ next unless ( $mysqld->{proc} and $mysqld->{proc} eq $proc );
# Check if crash expected by looking at the .expect file
# in var/tmp
@@ -4088,6 +4135,20 @@ sub report_failure_and_restart ($) {
# about what failed has been saved to file. Save the report
# in tinfo
$tinfo->{logfile}= mtr_fromfile($logfile);
+ # If no newlines in the test log:
+ # (it will contain the CURRENT_TEST written by mtr, so is not empty)
+ if ($tinfo->{logfile} !~ /\n/)
+ {
+ # Show how far it got before suddenly failing
+ $tinfo->{comment}.= "mysqltest failed but provided no output\n";
+ my $log_file_name= $opt_vardir."/log/".$tinfo->{shortname}.".log";
+ if (-e $log_file_name) {
+ $tinfo->{comment}.=
+ "The result from queries just before the failure was:".
+ "\n< snip >\n".
+ mtr_lastlinesfromfile($log_file_name, 20)."\n";
+ }
+ }
}
else
{
@@ -4297,6 +4358,10 @@ sub mysqld_start ($$) {
# see the exact location where valgrind complains
$output= "$opt_vardir/log/".$mysqld->name().".trace";
}
+ # Remember this log file for valgrind error report search
+ $mysqld_logs{$output}= 1 if $opt_valgrind;
+ # Remember data dir for gmon.out files if using gprof
+ $gprof_dirs{$mysqld->value('datadir')}= 1 if $opt_gprof;
if ( defined $exe )
{
@@ -4846,6 +4911,10 @@ sub start_mysqltest ($) {
mtr_add_arg($args, "--ssl");
}
+ if ( $opt_max_connections ) {
+ mtr_add_arg($args, "--max-connections=%d", $opt_max_connections);
+ }
+
if ( $opt_embedded_server )
{
@@ -4946,7 +5015,7 @@ sub gdb_arguments {
my $type= shift;
# Write $args to gdb init file
- my $str= join(" ", @$$args);
+ my $str= join " ", map { s/"/\\"/g; "\"$_\""; } @$$args;
my $gdb_init_file= "$opt_vardir/tmp/gdbinit.$type";
# Remove the old gdbinit file
@@ -5010,7 +5079,7 @@ sub ddd_arguments {
my $type= shift;
# Write $args to ddd init file
- my $str= join(" ", @$$args);
+ my $str= join " ", map { s/"/\\"/g; "\"$_\""; } @$$args;
my $gdb_init_file= "$opt_vardir/tmp/gdbinit.$type";
# Remove the old gdbinit file
@@ -5074,9 +5143,9 @@ sub debugger_arguments {
{
# vc[express] /debugexe exe arg1 .. argn
- # Add /debugexe and name of the exe before args
- unshift(@$$args, "/debugexe");
+ # Add name of the exe and /debugexe before args
unshift(@$$args, "$$exe");
+ unshift(@$$args, "/debugexe");
# Set exe to debuggername
$$exe= $debugger;
@@ -5149,6 +5218,66 @@ sub valgrind_arguments {
}
}
+#
+# Search server logs for valgrind reports printed at mysqld termination
+#
+
+sub valgrind_exit_reports() {
+ foreach my $log_file (keys %mysqld_logs)
+ {
+ my @culprits= ();
+ my $valgrind_rep= "";
+ my $found_report= 0;
+ my $err_in_report= 0;
+
+ my $LOGF = IO::File->new($log_file)
+ or mtr_error("Could not open file '$log_file' for reading: $!");
+
+ while ( my $line = <$LOGF> )
+ {
+ if ($line =~ /^CURRENT_TEST: (.+)$/)
+ {
+ my $testname= $1;
+ # If we have a report, report it if needed and start new list of tests
+ if ($found_report)
+ {
+ if ($err_in_report)
+ {
+ mtr_print ("Valgrind report from $log_file after tests:\n",
+ @culprits);
+ mtr_print_line();
+ print ("$valgrind_rep\n");
+ $err_in_report= 0;
+ }
+ # Make ready to collect new report
+ @culprits= ();
+ $found_report= 0;
+ $valgrind_rep= "";
+ }
+ push (@culprits, $testname);
+ next;
+ }
+ # This line marks the start of a valgrind report
+ $found_report= 1 if $line =~ /ERROR SUMMARY:/;
+
+ if ($found_report) {
+ $line=~ s/^==\d+== //;
+ $valgrind_rep .= $line;
+ $err_in_report= 1 if $line =~ /ERROR SUMMARY: [1-9]/;
+ $err_in_report= 1 if $line =~ /definitely lost: [1-9]/;
+ $err_in_report= 1 if $line =~ /possibly lost: [1-9]/;
+ }
+ }
+
+ $LOGF= undef;
+
+ if ($err_in_report) {
+ mtr_print ("Valgrind report from $log_file after tests:\n", @culprits);
+ mtr_print_line();
+ print ("$valgrind_rep\n");
+ }
+ }
+}
#
# Usage
@@ -5228,6 +5357,11 @@ Options to control what test suites or cases to run
Options that specify ports
+ mtr-port-base=# Base for port numbers, ports from this number to
+ port-base=# number+9 are reserved. Should be divisible by 10;
+ if not it will be rounded down. May be set with
+ environment variable MTR_PORT_BASE. If this value is
+ set and is not "auto", it overrides build-thread.
mtr-build-thread=# Specify unique number to calculate port number(s) from.
build-thread=# Can be set in environment variable MTR_BUILD_THREAD.
Set MTR_BUILD_THREAD="auto" to automatically aquire
@@ -5339,9 +5473,22 @@ Misc options
timestamp Print timestamp before each test report line
timediff With --timestamp, also print time passed since
*previous* test started
+ max-connections=N Max number of open connection to server in mysqltest
HERE
exit(1);
}
+sub list_options ($) {
+ my $hash= shift;
+
+ for (keys %$hash) {
+ s/([:=].*|[+!])$//;
+ s/\|/\n--/g;
+ print "--$_\n" unless /list-options/;
+ }
+
+ exit(1);
+}
+
diff --git a/mysql-test/r/mysqltest.result b/mysql-test/r/mysqltest.result
index 2e3a9489593..67c08b0ae97 100644
--- a/mysql-test/r/mysqltest.result
+++ b/mysql-test/r/mysqltest.result
@@ -147,9 +147,10 @@ hello
hello
;;;;;;;;
# MySQL: -- The
-mysqltest: At line 1: End of line junk detected: "6"
-mysqltest: At line 1: End of line junk detected: "6"
-mysqltest: At line 1: Missing delimiter
+mysqltest: At line 1: Extra argument '6' passed to 'sleep'
+mysqltest: At line 1: Extra argument '6' passed to 'sleep'
+mysqltest: At line 1: Extra argument 'A comment
+show status' passed to 'sleep'
mysqltest: At line 1: End of line junk detected: "sleep 7
# Another comment
"
@@ -216,6 +217,12 @@ source database
echo message echo message
mysqltest: At line 1: Missing argument in exec
+1
+1
+2
+2
+X
+3
MySQL
"MySQL"
MySQL: The
@@ -348,8 +355,10 @@ here is the sourced script
here is the sourced script
"hello"
"hello"
-mysqltest: At line 1: Missing argument to sleep
-mysqltest: At line 1: Missing argument to real_sleep
+mysqltest: At line 2: Invalid argument to sleep "xyz"
+mysqltest: At line 2: Invalid argument to real_sleep "xyz"
+mysqltest: At line 1: Missing required argument 'sleep_delay' to command 'sleep'
+mysqltest: At line 1: Missing required argument 'sleep_delay' to command 'real_sleep'
mysqltest: At line 1: Invalid argument to sleep "abc"
mysqltest: At line 1: Invalid argument to real_sleep "abc"
1
@@ -377,6 +386,10 @@ test
test2
test3
test4
+outer
+true-inner
+true-inner again
+true-outer
Counter is greater than 0, (counter=10)
Counter is not 0, (counter=0)
1
@@ -417,6 +430,9 @@ mysqltest: At line 1: Wrong number of arguments to replace_column in 'replace_co
mysqltest: At line 1: Wrong column number to replace_column in 'replace_column a b'
mysqltest: At line 1: Wrong column number to replace_column in 'replace_column a 1'
mysqltest: At line 1: Wrong column number to replace_column in 'replace_column 1 b c '
+select "LONG_STRING" as x;
+x
+LONG_STRING
mysqltest: At line 1: Invalid integer argument "10!"
mysqltest: At line 1: Invalid integer argument "a"
mysqltest: At line 1: Missing required argument 'connection name' to command 'connect'
@@ -523,7 +539,28 @@ a D
1 1
1 4
drop table t1;
+create table t1 ( f1 char(10));
+insert into t1 values ("Abcd");
+select * from t1;
+f1
+Abcd
+select * from t2;;
+ERROR 42S02: Table 'test.t2' doesn't exist
+select * from t1;
+f1
+Abcd
+select * from t1;;
+Result coming up
+f1
+Abcd
+select * from t1;;
+f1
+Abcd
+mysqltest: At line 2: Cannot run query on connection between send and reap
+select * from t1;;
+drop table t1;
mysqltest: At line 1: Missing required argument 'filename' to command 'remove_file'
+mysqltest: At line 1: Missing required argument 'directory' to command 'remove_files_wildcard'
mysqltest: At line 1: Missing required argument 'filename' to command 'write_file'
mysqltest: At line 1: End of file encountered before 'EOF' delimiter was found
Content for test_file1
@@ -553,6 +590,8 @@ hello
mysqltest: At line 1: Max delimiter length(16) exceeded
hello
hello
+val is 5
+val is 5
mysqltest: At line 1: test of die
Some output
create table t1( a int, b char(255), c timestamp);
@@ -680,6 +719,29 @@ INSERT INTO t1 SELECT f1 - 256 FROM t1;
INSERT INTO t1 SELECT f1 - 512 FROM t1;
SELECT * FROM t1;
DROP TABLE t1;
+select "500g blåbærsyltetøy" as "will be lower cased";
+will be lower cased
+500g blåbærsyltetøy
+SELECT "UPPER" AS "WILL NOT BE lower cased";
+WILL NOT BE lower cased
+UPPER
+UP
+SELECT 0 as "UP AGAIN";
+UP AGAIN
+0
+select "abcdef" as "uvwxyz";
+uvwxyz
+abcdef
+select "xyz" as name union select "abc" as name order by name desc;
+name
+abc
+xyz
+select 1 as "some new text";
+some new text
+1
+select 0 as "will not lower case ÄËÐ";
+will not lower case ÄËÐ
+0
CREATE TABLE t1(
a int, b varchar(255), c datetime
);
@@ -726,6 +788,8 @@ mysqltest: At line 1: change user failed: Access denied for user 'root'@'localho
file1.txt
file1.txt
file2.txt
+file11.txt
+dir-list.txt
SELECT 'c:\\a.txt' AS col;
col
z
diff --git a/mysql-test/r/variables+c.result b/mysql-test/r/variables_community.result
index 7a2976d1267..7a2976d1267 100644
--- a/mysql-test/r/variables+c.result
+++ b/mysql-test/r/variables_community.result
diff --git a/mysql-test/suite/sys_vars/t/innodb_table_locks_func.test b/mysql-test/suite/sys_vars/t/innodb_table_locks_func.test
index 6638a20c926..330addd6b3b 100644
--- a/mysql-test/suite/sys_vars/t/innodb_table_locks_func.test
+++ b/mysql-test/suite/sys_vars/t/innodb_table_locks_func.test
@@ -78,6 +78,7 @@ COMMIT;
--echo 'CONNECTION con2'
CONNECTION con2;
+reap;
UNLOCK tables;
DROP TABLE t1;
diff --git a/mysql-test/suite/sys_vars/t/sql_low_priority_updates_func.test b/mysql-test/suite/sys_vars/t/sql_low_priority_updates_func.test
index 2ef6e34b0b3..5e0314c25ae 100644
--- a/mysql-test/suite/sys_vars/t/sql_low_priority_updates_func.test
+++ b/mysql-test/suite/sys_vars/t/sql_low_priority_updates_func.test
@@ -127,6 +127,7 @@ connection con0;
SET SESSION low_priority_updates = OFF;
--echo ** Connection con1 **
connection con1;
+reap;
SET SESSION low_priority_updates = OFF;
--echo ** Connection default**
connection default;
diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test
index bcf33aa8c27..25293ff29e7 100644
--- a/mysql-test/t/mysqltest.test
+++ b/mysql-test/t/mysqltest.test
@@ -605,6 +605,15 @@ echo ;
--error 1
--exec echo "--exec " | $MYSQL_TEST 2>&1
+# Multi-line exec
+exec $MYSQL
+ test -e "select 1";
+exec $MYSQL test -e "select
+ 2";
+let $query = select 3
+ as X;
+exec $MYSQL test -e "$query";
+
# ----------------------------------------------------------------------------
# Test let command
# ----------------------------------------------------------------------------
@@ -911,6 +920,28 @@ sleep 0.5;
sleep 1;
real_sleep 1;
+# Parameter from variable, legal and illegal
+let $sleep_var= 0.1;
+sleep $sleep_var;
+let $sleep_var= 1;
+--real_sleep $sleep_var
+
+--write_file $MYSQL_TMP_DIR/sleep.inc
+let $sleep_var= xyz;
+--sleep $sleep_var
+EOF
+--error 1
+--exec $MYSQL_TEST < $MYSQL_TMP_DIR/sleep.inc 2>&1
+--remove_file $MYSQL_TMP_DIR/sleep.inc
+
+--write_file $MYSQL_TMP_DIR/sleep.inc
+let $sleep_var= xyz;
+real_sleep $sleep_var;
+EOF
+--error 1
+--exec $MYSQL_TEST < $MYSQL_TMP_DIR/sleep.inc 2>&1
+--remove_file $MYSQL_TMP_DIR/sleep.inc
+
# Missing parameter
--error 1
--exec echo "sleep ;" | $MYSQL_TEST 2>&1
@@ -1006,6 +1037,37 @@ echo test3stop
--delimiter ;
echo test4;
+# ----------------------------------------------------------------------------
+# Test that delimiter within if() works in in various combinations
+# ----------------------------------------------------------------------------
+
+if (0)
+{
+ delimiter ||;
+ echo false-inner||
+ if (0)
+ {
+ delimiter *||
+ echo false-innerer*
+ delimiter ||*
+ }
+ echo false-inner again||
+}
+echo outer;
+if (1)
+{
+ delimiter /;
+ echo true-inner/
+ if (0)
+ {
+ delimiter %/
+ echo true-innerer%
+ }
+ echo true-inner again/
+}
+echo true-outer/
+delimiter ;/
+
# ----------------------------------------------------------------------------
# Test if
@@ -1285,6 +1347,17 @@ select "a" as col1, "c" as col2;
--error 1
--exec echo "--replace_column 1 b c " | $MYSQL_TEST 2>&1
+let $long_rep= 1234567890123456789012345678901234567890;
+let $long_rep= $long_rep,$long_rep;
+let $long_rep= $long_rep,$long_rep;
+let $long_rep= $long_rep,$long_rep;
+let $long_rep= $long_rep,$long_rep;
+let $long_rep= $long_rep,$long_rep;
+
+# This tests from strings > 1024 (here 1311)
+
+--replace_result $long_rep LONG_STRING
+eval select "$long_rep" as x;
# ----------------------------------------------------------------------------
# Test sync_with_master
@@ -1606,6 +1679,57 @@ select * from t1;
drop table t1;
# ----------------------------------------------------------------------------
+# Tests of send
+# ----------------------------------------------------------------------------
+
+create table t1 ( f1 char(10));
+insert into t1 values ("Abcd");
+
+# 1. Basic test
+
+send select * from t1;
+reap;
+
+# 2. Test with error
+
+--send select * from t2;
+--error ER_NO_SUCH_TABLE
+--reap
+
+# 3. test send of next stmt
+
+--send
+select * from t1;
+--reap
+
+# 4. Non-query stmt betwen send and reap allowed
+
+--send select * from t1;
+--sleep 0.05
+--echo Result coming up
+--reap
+
+# 5. Test of send_eval
+
+--let $my_stmt= select * from t1;
+--send_eval $my_stmt
+--reap
+
+# 6. Test that mysqltest does not allow query stmt between send and reap
+# Untestable directly as it causes mysqltest to fail
+
+--write_file $MYSQLTEST_VARDIR/tmp/mysqltest.in
+--send select * from t1;
+select 1;
+--reap
+EOF
+--error 1
+--exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/mysqltest.in 2>&1
+remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.in;
+
+drop table t1;
+
+# ----------------------------------------------------------------------------
# test for remove_file
# ----------------------------------------------------------------------------
@@ -1616,6 +1740,19 @@ drop table t1;
remove_file non_existing_file;
# ----------------------------------------------------------------------------
+# test for remove_files_wildcard
+# ----------------------------------------------------------------------------
+
+--error 1
+--exec echo "remove_files_wildcard ;" | $MYSQL_TEST 2>&1
+
+--error 1
+remove_files_wildcard non_existing_dir;
+
+--error 1
+remove_files_wildcard non_existing_dir non_existing_file;
+
+# ----------------------------------------------------------------------------
# test for write_file
# ----------------------------------------------------------------------------
--error 1
@@ -1905,6 +2042,20 @@ perl;
print "hello\n";
EOF
+# Test perl within while, also with if being false first iteration
+let $outer= 3;
+let $ifval= 0;
+while ($outer) {
+ if ($ifval) {
+ perl UNTIL;
+ my $val= 5;
+ print "val is $val\n";
+UNTIL
+ }
+ inc $ifval;
+ dec $outer;
+}
+
# ----------------------------------------------------------------------------
# test for die
# ----------------------------------------------------------------------------
@@ -2045,6 +2196,44 @@ INSERT INTO t1 SELECT f1 - 512 FROM t1;
SELECT * FROM t1;
--enable_result_log
DROP TABLE t1;
+
+# ----------------------------------------------------------------------------
+# test for lowercase_result
+# ----------------------------------------------------------------------------
+
+# 1. Basic test
+--lowercase_result
+SELECT "500g BLÅBÆRSYLTETØY" AS "WILL BE lower cased";
+
+# 2. test that it does not apply to next statement
+SELECT "UPPER" AS "WILL NOT BE lower cased";
+
+# 3. test that it does not affect non-SQL or the following statement
+--lowercase_result
+--echo UP
+SELECT 0 as "UP AGAIN";
+
+# 4. test that it works with eval and variables
+let $lower_stmt=SELECT "ABCdef" AS "uvwXYZ";
+--lowercase_result
+eval $lower_stmt;
+
+# 5. test that it works in combination with sort
+sorted_result;
+lowercase_result;
+SELECT "Xyz" AS Name UNION SELECT "Abc" as Name ORDER BY Name DESC;
+
+# 6. Test combination with replace, and that lower casing is done first
+--lowercase_result
+--replace_result old new
+SELECT 1 as "SOME OLD TEXT";
+
+# 7. Test missing lower casing of "unknown" characters
+--character_set utf8
+--lowercase_result
+SELECT 0 as "WILL NOT lower case ÄËÐ";
+--character_set latin1
+
# ----------------------------------------------------------------------------
# Some coverage tests
# ----------------------------------------------------------------------------
@@ -2230,9 +2419,14 @@ rmdir $MYSQLTEST_VARDIR/tmp/testdir;
cat_file $MYSQLTEST_VARDIR/tmp/testdir/file3.txt;
-remove_file $MYSQLTEST_VARDIR/tmp/testdir/file1.txt;
-remove_file $MYSQLTEST_VARDIR/tmp/testdir/file2.txt;
-remove_file $MYSQLTEST_VARDIR/tmp/testdir/file3.txt;
+list_files_write_file $MYSQLTEST_VARDIR/tmp/testdir/file11.txt $MYSQLTEST_VARDIR/tmp/testdir file?.txt;
+remove_files_wildcard $MYSQLTEST_VARDIR/tmp/testdir file?.txt;
+list_files_write_file $MYSQLTEST_VARDIR/tmp/testdir/dir-list.txt $MYSQLTEST_VARDIR/tmp/testdir file*.txt;
+cat_file $MYSQLTEST_VARDIR/tmp/testdir/dir-list.txt;
+remove_files_wildcard $MYSQLTEST_VARDIR/tmp/testdir file*.txt;
+list_files $MYSQLTEST_VARDIR/tmp/testdir;
+remove_files_wildcard $MYSQLTEST_VARDIR/tmp/testdir;
+list_files $MYSQLTEST_VARDIR/tmp/testdir;
rmdir $MYSQLTEST_VARDIR/tmp/testdir;
#
diff --git a/mysql-test/t/partition_innodb_semi_consistent.test b/mysql-test/t/partition_innodb_semi_consistent.test
index 6a6a7cf958e..2711d79f194 100644
--- a/mysql-test/t/partition_innodb_semi_consistent.test
+++ b/mysql-test/t/partition_innodb_semi_consistent.test
@@ -187,6 +187,7 @@ SELECT * FROM t1;
--echo # Switch to connection con2
connection con2;
+reap;
SELECT * FROM t1;
connection default;
diff --git a/mysql-test/t/variables+c.test b/mysql-test/t/variables_community.test
index 0092d34133d..0092d34133d 100644
--- a/mysql-test/t/variables+c.test
+++ b/mysql-test/t/variables_community.test