diff --git a/mysql-test/lib/My/Find.pm b/mysql-test/lib/My/Find.pm
index 8b90e757917..8557584bbc8 100644
--- a/mysql-test/lib/My/Find.pm
+++ b/mysql-test/lib/My/Find.pm
@@ -26,7 +26,7 @@ use Carp;
use My::Platform;
use base qw(Exporter);
-our @EXPORT= qw(my_find_bin my_find_dir NOT_REQUIRED);
+our @EXPORT= qw(my_find_bin my_find_dir my_find_file NOT_REQUIRED);
our $vs_config_dir;
@@ -77,6 +77,40 @@ sub my_find_bin {
}
+#
+# my_find_file - find a file with "name_1...name_n" in
+# paths "path_1...path_n" and return the full path
+#
+# Example:
+# my $mysqld_exe= my_find_file($basedir.
+# ["sql", "bin"],
+# "filename");
+#
+#
+# Also supports NOT_REQUIRED flag
+#
+# NOTE: The function honours MTR_VS_CONFIG environment variable
+#
+#
+sub my_find_file {
+ my ($base, $paths, $names, $required)= @_;
+ croak "usage: my_find_file(, , , [])"
+ unless @_ == 4 or @_ == 3;
+
+ # -------------------------------------------------------
+ # Find and return the first executable
+ # -------------------------------------------------------
+ foreach my $path (my_find_paths($base, $paths, $names, $bin_extension)) {
+ return $path if ( -f $path );
+ }
+ if (defined $required and $required == NOT_REQUIRED){
+ # Return empty string to indicate not found
+ return "";
+ }
+ find_error($base, $paths, $names);
+}
+
+
#
# my_find_dir - find the first existing directory in one of
# the given paths
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 53f916a630a..1eb767ee47f 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -188,8 +188,6 @@ my $exe_ndbd;
my $exe_ndb_mgmd;
my $exe_ndb_waiter;
-our $path_sql_dir;
-
our $debug_compiled_binaries;
our %mysqld_variables;
@@ -651,7 +649,6 @@ sub run_worker ($) {
setup_vardir();
check_running_as_root();
- mysql_install_db($thread_num);
if ( using_extern() ) {
create_config_file_for_extern(%opts_extern);
@@ -894,21 +891,10 @@ sub command_line_setup {
"$basedir/sql/share",
"$basedir/share");
+
$path_language= mtr_path_exists("$path_share/english");
$path_charsetsdir= mtr_path_exists("$path_share/charsets");
- # Look for SQL scripts directory
- if ( mtr_file_exists("$path_share/mysql_system_tables.sql") ne "")
- {
- # The SQL scripts are in path_share
- $path_sql_dir= $path_share;
- }
- else
- {
- $path_sql_dir= mtr_path_exists("$basedir/share",
- "$basedir/scripts");
- }
-
if (using_extern())
{
# Connect to the running mysqld and find out what it supports
@@ -2419,7 +2405,7 @@ sub initialize_servers {
remove_stale_vardir();
setup_vardir();
- mysql_install_db(0);
+ mysql_install_db(default_mysqld(), "$opt_vardir/install.db");
}
}
}
@@ -2474,9 +2460,33 @@ sub sql_to_bootstrap {
}
+sub default_mysqld {
+ # Generate new config file from template
+ my $config= My::ConfigFactory->new_config
+ ( {
+ basedir => $basedir,
+ template_path => "include/default_my.cnf",
+ vardir => $opt_vardir,
+ tmpdir => $opt_tmpdir,
+ baseport => 0,
+ user => $opt_user,
+ password => '',
+ }
+ );
+
+ my $mysqld= $config->group('mysqld.1')
+ or mtr_error("Couldn't find mysqld.1 in default config");
+ return $mysqld;
+}
+
+
sub mysql_install_db {
- my ($thread_num)= @_;
- my $data_dir= "$opt_vardir/install.db";
+ my ($mysqld, $datadir)= @_;
+
+ my $install_datadir= $datadir || $mysqld->value('datadir');
+ my $install_basedir= $mysqld->value('basedir');
+ my $install_lang= $mysqld->value('language');
+ my $install_chsdir= $mysqld->value('character-sets-dir');
mtr_report("Installing system database...");
@@ -2484,8 +2494,8 @@ sub mysql_install_db {
mtr_init_args(\$args);
mtr_add_arg($args, "--no-defaults");
mtr_add_arg($args, "--bootstrap");
- mtr_add_arg($args, "--basedir=%s", $basedir);
- mtr_add_arg($args, "--datadir=%s", $data_dir);
+ mtr_add_arg($args, "--basedir=%s", $install_basedir);
+ mtr_add_arg($args, "--datadir=%s", $install_datadir);
mtr_add_arg($args, "--loose-skip-innodb");
mtr_add_arg($args, "--loose-skip-ndbcluster");
mtr_add_arg($args, "--tmpdir=%s", "$opt_vardir/tmp/");
@@ -2497,47 +2507,60 @@ sub mysql_install_db {
$path_vardir_trace);
}
- mtr_add_arg($args, "--language=%s", $path_language);
- mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
+ mtr_add_arg($args, "--language=%s", $install_lang);
+ mtr_add_arg($args, "--character-sets-dir=%s", $install_chsdir);
# If DISABLE_GRANT_OPTIONS is defined when the server is compiled (e.g.,
# configure --disable-grant-options), mysqld will not recognize the
# --bootstrap or --skip-grant-tables options. The user can set
# MYSQLD_BOOTSTRAP to the full path to a mysqld which does accept
# --bootstrap, to accommodate this.
- my $exe_mysqld_bootstrap = $ENV{'MYSQLD_BOOTSTRAP'} || find_mysqld($basedir);
+ my $exe_mysqld_bootstrap =
+ $ENV{'MYSQLD_BOOTSTRAP'} || find_mysqld($install_basedir);
# ----------------------------------------------------------------------
# export MYSQLD_BOOTSTRAP_CMD variable containing /mysqld
# ----------------------------------------------------------------------
$ENV{'MYSQLD_BOOTSTRAP_CMD'}= "$exe_mysqld_bootstrap " . join(" ", @$args);
- return if $thread_num > 0; # Only generate MYSQLD_BOOTSTRAP_CMD in workers
+
# ----------------------------------------------------------------------
# Create the bootstrap.sql file
# ----------------------------------------------------------------------
my $bootstrap_sql_file= "$opt_vardir/tmp/bootstrap.sql";
- if (-f "$path_sql_dir/mysql_system_tables.sql")
+ my $path_sql= my_find_file($install_basedir,
+ ["mysql", "sql/share", "share", "scripts"],
+ "mysql_system_tables.sql",
+ NOT_REQUIRED);
+
+ if (-f $path_sql )
{
+ my $sql_dir= dirname($path_sql);
# Use the mysql database for system tables
mtr_tofile($bootstrap_sql_file, "use mysql\n");
# Add the offical mysql system tables
# for a production system
- mtr_appendfile_to_file("$path_sql_dir/mysql_system_tables.sql",
+ mtr_appendfile_to_file("$sql_dir/mysql_system_tables.sql",
$bootstrap_sql_file);
# Add the mysql system tables initial data
# for a production system
- mtr_appendfile_to_file("$path_sql_dir/mysql_system_tables_data.sql",
+ mtr_appendfile_to_file("$sql_dir/mysql_system_tables_data.sql",
$bootstrap_sql_file);
# Add test data for timezone - this is just a subset, on a real
# system these tables will be populated either by mysql_tzinfo_to_sql
# or by downloading the timezone table package from our website
- mtr_appendfile_to_file("$path_sql_dir/mysql_test_data_timezone.sql",
+ mtr_appendfile_to_file("$sql_dir/mysql_test_data_timezone.sql",
+ $bootstrap_sql_file);
+
+ # Fill help tables, just an empty file when running from bk repo
+ # but will be replaced by a real fill_help_tables.sql when
+ # building the source dist
+ mtr_appendfile_to_file("$sql_dir/fill_help_tables.sql",
$bootstrap_sql_file);
}
@@ -2545,7 +2568,7 @@ sub mysql_install_db {
{
# Install db from init_db.sql that exist in early 5.1 and 5.0
# versions of MySQL
- my $init_file= "$basedir/mysql-test/lib/init_db.sql";
+ my $init_file= "$install_basedir/mysql-test/lib/init_db.sql";
mtr_report(" - from '$init_file'");
my $text= mtr_grab_file($init_file) or
mtr_error("Can't open '$init_file': $!");
@@ -2554,12 +2577,6 @@ sub mysql_install_db {
sql_to_bootstrap($text));
}
- # Fill help tables, just an empty file when running from bk repo
- # but will be replaced by a real fill_help_tables.sql when
- # building the source dist
- mtr_appendfile_to_file("$path_sql_dir/fill_help_tables.sql",
- $bootstrap_sql_file);
-
# Remove anonymous users
mtr_tofile($bootstrap_sql_file,
"DELETE FROM mysql.user where user= '';\n");
@@ -2582,8 +2599,8 @@ sub mysql_install_db {
"$exe_mysqld_bootstrap " . join(" ", @$args) . "\n");
# Create directories mysql and test
- mkpath("$data_dir/mysql");
- mkpath("$data_dir/test");
+ mkpath("$install_datadir/mysql");
+ mkpath("$install_datadir/test");
if ( My::SafeProcess->run
(
@@ -4087,14 +4104,26 @@ sub start_servers($) {
}
}
- # Copy datadir from installed system db
- for my $path ( "$opt_vardir", "$opt_vardir/..") {
- my $install_db= "$path/install.db";
- copytree($install_db, $datadir)
- if -d $install_db;
+ my $mysqld_basedir= $mysqld->value('basedir');
+ if ( $basedir eq $mysqld_basedir )
+ {
+ # Copy datadir from installed system db
+ for my $path ( "$opt_vardir", "$opt_vardir/..") {
+ my $install_db= "$path/install.db";
+ copytree($install_db, $datadir)
+ if -d $install_db;
+ }
+ mtr_error("Failed to copy system db to '$datadir'")
+ unless -d $datadir;
+ }
+ else
+ {
+ mysql_install_db($mysqld);
+
+ mtr_error("Failed to install system db to '$datadir'")
+ unless -d $datadir;
+
}
- mtr_error("Failed to copy system db to '$datadir'")
- unless -d $datadir;
# Create the servers tmpdir
my $tmpdir= $mysqld->value('tmpdir');