#!/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#14400 - Query joins wrong rows from table which is subject of \"concurrent insert\"" 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" 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* bug14400* ####################################################################### # # Run in a loop until it fails. # ROUND=1 while [ "$ROUND" -lt 200 ] do echo 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 5 echo "######################################################################" echo "#" echo "# Creating tables." "$MYSQLC" $PORT_1 $SOCK_1 $USER_1 $CLNT_1 < bug14400-0.log DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( c1 varchar(250) NOT NULL ) ENGINE=MyISAM; DROP TABLE IF EXISTS t2; CREATE TABLE t2 ( c1 varchar(250) NOT NULL, PRIMARY KEY (c1) ) ENGINE=MyISAM; EOF echo sleep 2 echo "######################################################################" echo "#" echo "# Loading data into t1." perl -e 'print "INSERT INTO t1 VALUES ('\''test000001'\'')"; for($idx= 2; $idx <= 25000; $idx++) { printf ",('\''test%06d'\'')", $idx; } print ";\n"; print "INSERT INTO t1 VALUES ('\''test025001'\'')"; for($idx= 25002; $idx <= 50000; $idx++) { printf ",('\''test%06d'\'')", $idx; } print ";\n"; print "INSERT INTO t1 VALUES ('\''test050001'\'')"; for($idx= 50002; $idx <= 75000; $idx++) { printf ",('\''test%06d'\'')", $idx; } print ";\n"; print "INSERT INTO t1 VALUES ('\''test075001'\'')"; for($idx= 75002; $idx <= 100000; $idx++) { printf ",('\''test%06d'\'')", $idx; } print ";\n"; print "SELECT COUNT(*) FROM t1;\n";' | \ "$MYSQLC" $PORT_1 $SOCK_1 $USER_1 $CLNT_1 >> bug14400-0.log echo sleep 2 echo "######################################################################" echo "#" echo "# Starting client 1 (select from t1,t2)." perl -e 'for ($idx=1; $idx<100000; $idx++) { print "SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1;\n" };' | \ "$MYSQLC" $PORT_1 $SOCK_1 $USER_1 $CLNT_1 \ > bug14400-1.log 2>&1 & CLNT_1_PID=$! echo "Process_id $CLNT_1_PID" echo sleep 2 echo "######################################################################" echo "#" echo "# Starting client 2 (insert into t2)." perl -e 'for ($idx= 1; $idx < 1000000; $idx++) { printf "INSERT INTO t2 VALUES ('\''test%06d'\'');\n", $idx; }' | \ "$MYSQLC" $PORT_1 $SOCK_1 $USER_1 $CLNT_1 \ > bug14400-2.log 2>&1 & CLNT_2_PID=$! echo "Process_id $CLNT_2_PID" echo sleep 2 echo "######################################################################" echo "#" echo "# Waiting for completion of round $ROUND..." exec 6>&2 2>/dev/null while kill -0 $CLNT_1_PID && \ kill -0 $CLNT_2_PID do sleep 5 done sleep 2 kill $CLNT_1_PID kill $CLNT_2_PID sleep 2 echo exec 2>&6 echo "######################################################################" echo "#" echo "# Stopping database server." "$MYSQLA" $PORT_1 $SOCK_1 -u root shutdown sleep 3 if [ "`echo core*`" != "core*" ] || grep -H "ERROR" `uname -n`.err \ || egrep -Hi "error|corrupt|crash" bug14400-*.log \ || egrep -v '^SELECT|^---|^ |^$' bug14400-1.log then break fi echo echo $ROUND rounds echo ROUND=`expr $ROUND + 1` done echo "# End of Test." echo "#" echo "######################################################################"