#! /usr/bin/perl -w

use DBI;

my $stopfile = './t/bug3720.STOP';
my $max_sid = 35;
my $max_var = 20;
my $table_name = 'bug3720';

my $dbh;
eval {
    $dbh = DBI->connect("DBI:mysql:test;mysql_read_default_group=client",
        undef, undef, { RaiseError => 1 });

    if (0) {
        $dbh->do("drop table if exists $table_name");
        $dbh->do(<<EOF);
CREATE TABLE $table_name (
    sid varchar(100) binary NOT NULL default '',
    var varchar(125) binary NOT NULL default '',
    value varchar(255) binary NOT NULL default '',
    PRIMARY KEY  (sid,var)
)
EOF
        for (my $sid = 1; $sid <= $max_sid; ++$sid) {
            insert_rows($dbh, $sid);
        }
    }

    for (;;) {
        last if -e $stopfile;
        my $choice = int(rand(1000));
        my $sid = int(rand($max_sid)) + 1;
        my $var = int(rand($max_var)) + 1;

        if ($choice < 1) {
            # REPLACE
            $dbh->do("DELETE FROM $table_name WHERE sid = '$sid'");
            insert_rows($dbh, $sid);
        }
        elsif ($choice < 4) {
            # UPDATE
            $dbh->do(<<EOF);
UPDATE $table_name SET value = '@{[a_value()]}'
WHERE sid = '$sid' AND var = '$var'
EOF
        }
        else {
            # SELECT
            $dbh->do(<<EOF);
SELECT SQL_CACHE value FROM $table_name
WHERE sid = '$sid' AND var = '$var'
EOF
        }
    }
};

my $error = $@;
if ($error) {
    print "\n****** Error: $error\n\n";
}

$dbh->disconnect() if $dbh;

exit($error ? 1 : 0);


sub a_value {
    return 'x' x (50 + rand(200));
}

sub insert_rows {
    my ($dbh, $sid) = @_;
    for (my $var = 1; $var <= $max_var; ++$var) {
        my $value = a_value();
        $dbh->do(<<EOF);
INSERT INTO $table_name (sid, var, value) VALUES ('$sid', '$var', '$value')
EOF
    }
}
