#!/bin/sh
#
# Copyright (c) 2006 MySQL AB
# 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

echo "######################################################################"
echo "#"
echo "# Test Bug#19604 - CHECK TABLE with concurrent INSERT can reset auto_increment"
echo "#"

#######################################################################
#
# Settings. CAUTION: Paths are not space safe.
#

# BASEDIR="install directory"
# DATADIR="databases directory e.g. $BASEDIR/var"
TREEROOT="${TREEROOT:-$HOME}"

MYSQLD="$BASEDIR/libexec/mysqld"
MYSQLC="$BASEDIR/bin/mysql"
MYSQLA="$BASEDIR/bin/mysqladmin"
MYSQLT="$BASEDIR/bin/mysqltest"

PORT_1="${MYSQL_TCP_PORT:+--port=$MYSQL_TCP_PORT}"
SOCK_1="${MYSQL_UNIX_PORT:+--socket=$MYSQL_UNIX_PORT}"
USER_1="-u root -D test"
#CLNT_1="-A -v -f"
CLNT_1="-A -v"
DATA_1="--basedir=$BASEDIR --datadir=$DATADIR"
SERV_1="--log-error --core"
#SERV_1="$SERV_1 --delay-key-write=all"
DBUG_1= #"--debug=t:d:i:O,$DATADIR/mysqld.trace"
DBUG_1= #"--debug=d,thrlock:i:O,$DATADIR/mysqld.trace"

cd $DATADIR || exit $?
rm -f *.trace *.err core* test/#sql* bug19604*

#######################################################################
#
# Run in a loop until it fails.
#
ROUND=1
while :
do

  echo "######################################################################"
  echo "#"
  echo "# Starting database server."
  "$MYSQLD" $PORT_1 $SOCK_1 $DATA_1 $SERV_1 $DBUG_1 &
  SERV_1_PID=$!
  echo "Process_id $SERV_1_PID"
  echo
  sleep 9


  echo "######################################################################"
  echo "#"
  echo "# Creating table."
  "$MYSQLC" $PORT_1 $SOCK_1 $USER_1 $CLNT_1 <<EOF > bug19604-0.log

      DROP TABLE IF EXISTS t1;
      CREATE TABLE t1 (
          id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
          v1 CHAR(150),
          v2 CHAR(150),
          v3 CHAR(150),
          KEY(id,v1,v2,v3),
          KEY(v2,v3,v1),
          KEY(v3,v1,v2)
          ) ENGINE=MyISAM;

EOF
  echo
  sleep 2


  echo "######################################################################"
  echo "#"
  echo "# Preparing perl script."
  cat > bug19604.pl <<'EOF'
  #!/usr/bin/perl -w

      my $table= $ARGV[0];

      #
      # Loop on insert and flush.
      #
      for (my $insert= 500; $insert; $insert--)
      {
          #
          # Load keycache.
          #
          print "INSERT INTO ${table} (v1,v2,v3) VALUES 
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),
                  ('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');\n";

          if ( $insert % int(rand(10) + 1) == 1 )
          {
              print "CHECK TABLE ${table};\n";
              print "SHOW WARNINGS;\n";
          }
      }

      #
      # Check table.
      #
      print "CHECK TABLE ${table};\n";
      print "SHOW WARNINGS;\n";
EOF
  echo


  echo "######################################################################"
  echo "#"
  echo "# Starting client 1 (inserter)."
  perl bug19604.pl t1 2>/dev/null | \
      "$MYSQLC" $PORT_1 $SOCK_1 $USER_1 $CLNT_1 \
          > bug19604-1.log 2>&1 &
  CLNT_1_PID=$!
  echo "Process_id $CLNT_1_PID"
  echo
  sleep 2


  echo "######################################################################"
  echo "#"
  echo "# Starting client 2 (inserter)."
  perl bug19604.pl t1 2>/dev/null | \
      "$MYSQLC" $PORT_1 $SOCK_1 $USER_1 $CLNT_1 \
          > bug19604-2.log 2>&1 &
  CLNT_2_PID=$!
  echo "Process_id $CLNT_2_PID"
  echo
  sleep 2


  echo "######################################################################"
  echo "#"
  echo "# Starting client 3 (inserter)."
  perl bug19604.pl t1 2>/dev/null | \
      "$MYSQLC" $PORT_1 $SOCK_1 $USER_1 $CLNT_1 \
          > bug19604-3.log 2>&1 &
  CLNT_3_PID=$!
  echo "Process_id $CLNT_3_PID"
  echo
  sleep 2


  echo "######################################################################"
  echo "#"
  echo "# Waiting for completion..."
  exec 6>&2 2>/dev/null
  while kill -0 $CLNT_1_PID || \
        kill -0 $CLNT_2_PID || \
        kill -0 $CLNT_3_PID 
  do
      sleep 5
  done
  sleep 2
  kill $CLNT_1_PID
  kill $CLNT_2_PID
  kill $CLNT_3_PID
  sleep 2
  echo
  exec 2>&6


  echo "######################################################################"
  echo "#"
  echo "# Stopping database server."
  "$MYSQLA" $PORT_1 $SOCK_1 -u root shutdown
  sleep 9


  if [ "`echo core*`" != "core*" ] || grep -q "ERROR" `uname -n`.err \
       || egrep -qi "error|corrupt|crash" bug19604-*.log
  then
      break
  fi

  echo $ROUND rounds
  ROUND=`expr $ROUND + 1`
done


echo "# End of Test."
echo "#"
echo "######################################################################"

