3
# This is a test with uses two processes to a database.
4
# The other inserts records in two tables, the other does a lot of joins
6
# Every time the read thread outputs info, it does a ALTER TABLE command
7
# which should stop the insert thread until the ALTER TABLE command is ready.
9
# Warning, the output from this test will differ in 'found' from time to time,
10
# but there should never be any errors
16
srand 0; # Repeatable test
21
$dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstr\n";
22
$dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstr\n";
24
$firsttable = "test_lock_1";
25
$secondtable = "test_lock_2";
26
$dbh->Query("drop table $firsttable");
27
$dbh->Query("drop table $secondtable");
29
print "Creating tables $firsttable and $secondtable in database $test_db\n";
30
$dbh->Query("create table $firsttable (id int(6) not null, info char(32), auto int(11) not null auto_increment, primary key(id),key(auto))") or die $Mysql::db_errstr;
32
$dbh->Query("create table $secondtable (id int(6) not null, info varchar(32), key(id))") or die $Mysql::db_errstr;
34
$dbh=0; # Close handler
38
$dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstr\n";
39
$dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstr\n";
40
$first_id=1; $second_id=1;
41
$first_count=$second_count=0;
42
print "Writing started\n";
43
for ($i=1 ; $i <= $test_count ; $i++)
47
$sth=$dbh->Query("insert into $firsttable values ($first_id,'This is entry $i',NULL)") || die "Got error on insert: $Mysql::db_errstr\n";
48
die "Row not inserted, aborting\n" if ($sth->affected_rows != 1);
54
$sth=$dbh->Query("insert into $secondtable values ($second_id,'This is entry $i')") || die "Got error on insert: $Mysql::db_errstr\n";
55
die "Row not inserted, aborting\n" if ($sth->affected_rows != 1);
56
$second_id++ if (rand(10) <= 1); # Don't always count it up
59
print "Write: $i\n" if ($i % 1000 == 0);
61
print "Writing done ($first_count $second_count)\n";
65
$dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstr\n";
66
$dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstr\n";
68
print "Reading started\n";
69
for ($i=1 ; $i <= $test_count ; $i++)
71
$id=int(rand($test_count)/3)+1;
72
$sth=$dbh->Query("select count(*) from $firsttable,$secondtable where $firsttable.id = $secondtable.id and $firsttable.id=$id") || die "Got error on select: $Mysql::db_errstr\n";
73
$found++ if ($sth->numrows);
76
print "Read: $i Found: $found\n";
82
$sth=$dbh->Query("lock tables $firsttable write,$secondtable write");
84
$sth=$dbh->Query("alter table $firsttable CHANGE id id int(6) not null") || die "Got error on ALTER TABLE: $Mysql::db_errstr\n";
85
$sth=$dbh->Query("alter table $secondtable CHANGE info info char(32) not null") || die "Got error on ALTER TABLE: $Mysql::db_errstr\n";
88
$sth=$dbh->Query("unlock tables");
93
print "Reading done Found: $found\n";