Commit aafe189a authored by unknown's avatar unknown
Browse files

Bug#20166 mysql-test-run.pl does not test system privilege tables creation

 - Add test of bootstrap mode
 - Make mysqld return error if bootstrap failed  


mysql-test/mysql-test-run.pl:
  Remove options --skip-grant-tables as that is always
  turned on by --bootstrap
  Remove options --console as that does not affect --bootstrap mode
  at all
  Add environment variable MYSQLD_BOOTSTRAP_CMD containing path 
  to mysqld and the arguments used for bootstrap
sql/sql_parse.cc:
  Abort bootstrap if execution fails
  Report error to stderr/log
mysql-test/r/bootstrap.result:
  New BitKeeper file ``mysql-test/r/bootstrap.result''
mysql-test/t/bootstrap.test:
  New BitKeeper file ``mysql-test/t/bootstrap.test''
parent dcd3b8d4
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -2890,8 +2890,6 @@ sub install_db ($$) {

  mtr_add_arg($args, "--no-defaults");
  mtr_add_arg($args, "--bootstrap");
  mtr_add_arg($args, "--console");
  mtr_add_arg($args, "--skip-grant-tables");
  mtr_add_arg($args, "--basedir=%s", $path_my_basedir);
  mtr_add_arg($args, "--datadir=%s", $data_dir);
  mtr_add_arg($args, "--skip-innodb");
@@ -2918,6 +2916,11 @@ sub install_db ($$) {
  # --bootstrap, to accommodate this.
  my $exe_mysqld_bootstrap = $ENV{'MYSQLD_BOOTSTRAP'} || $exe_mysqld;

  # ----------------------------------------------------------------------
  # export MYSQLD_BOOTSTRAP_CMD variable containing <path>/mysqld <args>
  # ----------------------------------------------------------------------
  $ENV{'MYSQLD_BOOTSTRAP_CMD'}= "$exe_mysqld_bootstrap " . join(" ", @$args);

  # Log bootstrap command
  my $path_bootstrap_log= "$opt_vardir/log/bootstrap.log";
  mtr_tofile($path_bootstrap_log,
+8 −0
Original line number Diff line number Diff line
drop table if exists t1;
drop table t1;
drop table t1;
ERROR 42S02: Unknown table 't1'
set @my_max_allowed_packet= @@max_allowed_packet;
set global max_allowed_packet=100*@@max_allowed_packet;
set global max_allowed_packet=@my_max_allowed_packet;
drop table t1;
+46 −0
Original line number Diff line number Diff line
#
# test mysqld in bootstrap mode
#
--disable_warnings
drop table if exists t1;
--enable_warnings


#
# Check that --bootstrap reads from stdin
#
--write_file $MYSQLTEST_VARDIR/tmp/bootstrap.sql
use test;
CREATE TABLE t1(a int);
EOF
--exec $MYSQLD_BOOTSTRAP_CMD < $MYSQLTEST_VARDIR/tmp/bootstrap.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1
drop table t1;

#
# Check that --bootstrap of file with SQL error returns error
#
--write_file $MYSQLTEST_VARDIR/tmp/bootstrap_error.sql
use test;
CREATE TABLE t1;
EOF
--error 1
--exec $MYSQLD_BOOTSTRAP_CMD  < $MYSQLTEST_VARDIR/tmp/bootstrap_error.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1
# Table t1 should not exists
--error 1051
drop table t1;

#
# Bootstrap with a query larger than 2*thd->net.max_packet
#
set @my_max_allowed_packet= @@max_allowed_packet;
set global max_allowed_packet=100*@@max_allowed_packet;
--disable_query_log
create table t1 select 2 as a, concat(repeat('MySQL', @@max_allowed_packet/10), ';') as b;
eval select * into outfile '$MYSQLTEST_VARDIR/tmp/long_query.sql' from t1;
--enable_query_log
--error 1
--exec $MYSQLD_BOOTSTRAP_CMD < $MYSQLTEST_VARDIR/tmp/long_query.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1

set global max_allowed_packet=@my_max_allowed_packet;
drop table t1;
+12 −1
Original line number Diff line number Diff line
@@ -1308,6 +1308,7 @@ pthread_handler_t handle_bootstrap(void *arg)
    thd->query= thd->memdup_w_gap(buff, length+1, 
				  thd->db_length+1+QUERY_CACHE_FLAGS_SIZE);
    thd->query[length] = '\0';
    DBUG_PRINT("query",("%-.4096s",thd->query));
    /*
      We don't need to obtain LOCK_thread_count here because in bootstrap
      mode we have only one thread.
@@ -1315,16 +1316,26 @@ pthread_handler_t handle_bootstrap(void *arg)
    thd->query_id=next_query_id();
    mysql_parse(thd,thd->query,length);
    close_thread_tables(thd);			// Free tables

    if (thd->is_fatal_error)
      break;

    if (thd->net.report_error)
    {
      /* The query failed, send error to log and abort bootstrap */
      net_send_error(thd);
      thd->fatal_error();
      break;
    }

    free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
#ifdef USING_TRANSACTIONS
    free_root(&thd->transaction.mem_root,MYF(MY_KEEP_PREALLOC));
#endif
  }

  /* thd->fatal_error should be set in case something went wrong */
end:
  /* Remember the exit code of bootstrap */
  bootstrap_error= thd->is_fatal_error;

  net_end(&thd->net);