mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
5cc2096f93
Perl DBD::MariaDB driver is available CPAN and is already used in production environment.
73 lines
2.2 KiB
Perl
73 lines
2.2 KiB
Perl
#! /usr/bin/perl
|
|
|
|
# Read the output of async_queries.c. Run the queries again serially, using
|
|
# the normal (not asynchronous) API. Compare the two results for correctness.
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use DBI;
|
|
|
|
my $D= [];
|
|
|
|
die "Usage: $0 <host> <user> <password> <database>\n"
|
|
unless @ARGV == 4;
|
|
|
|
my $dbh= DBI->connect("DBI:MariaDB:database=$ARGV[3];host=$ARGV[0]",
|
|
$ARGV[1], $ARGV[2],
|
|
{ RaiseError => 1, PrintError => 0 });
|
|
|
|
while (<STDIN>) {
|
|
chomp;
|
|
if (/^([0-9]+) ! (.*);$/) {
|
|
my ($index, $query)= ($1, $2);
|
|
$D->[$index]= { QUERY => $query, OUTPUT => [] };
|
|
} elsif (/^([0-9]+) - (.*)$/) {
|
|
my ($index, $data)= ($1, $2);
|
|
push @{$D->[$index]{OUTPUT}}, $data;
|
|
} elsif (/^([0-9]+) \| Error: (.*)$/) {
|
|
my ($index, $errmsg)= ($1, $2);
|
|
my $rows;
|
|
my $res= eval {
|
|
my $stm= $dbh->prepare($D->[$index]{QUERY});
|
|
$stm->execute();
|
|
$rows= $stm->fetchall_arrayref();
|
|
1;
|
|
};
|
|
if ($res) {
|
|
die "Query $index succeeded, but should have failed with error.\nquery=$D->[$index]{QUERY}\nerror=$errmsg\n";
|
|
}
|
|
my $errmsg2= $@;
|
|
if ($errmsg2 =~ /^DBD::.*failed: (.*) at .*$/s) {
|
|
$errmsg2= $1;
|
|
} else {
|
|
die "Unexpected DBD error message format: '$errmsg2'\n";
|
|
}
|
|
if ($errmsg2 ne $errmsg) {
|
|
die "Query $index failed with different error message\nquery=$D->[$index]{QUERY}\nerror1=$errmsg\nerror2=$errmsg2\n";
|
|
}
|
|
print "OK $index\n";
|
|
delete $D->[$index];
|
|
} elsif (/^([0-9]+) \| EOF$/) {
|
|
my $index= $1;
|
|
my $rows;
|
|
my $res= eval {
|
|
my $stm= $dbh->prepare($D->[$index]{QUERY});
|
|
$stm->execute();
|
|
$rows= $stm->fetchall_arrayref();
|
|
1;
|
|
};
|
|
if (!$res) {
|
|
die "Query $index failed, but should have succeeded.\nquery=$D->[$index]{QUERY}\nerror=$@\n";
|
|
}
|
|
my $result_string= join("\n", sort @{$D->[$index]{OUTPUT}});
|
|
my $result_string2= join("\n", sort(map(join("\t", map((defined($_) ? $_ : "(null)"), @$_)), @$rows)));
|
|
if ($result_string ne $result_string2) {
|
|
die "Query $index result difference.\nquery=$D->[$index]{QUERY}\noutput1=\n$$result_string\noutput2=\n$result_string2\n";
|
|
}
|
|
delete $D->[$index];
|
|
} else {
|
|
die "Unexpected line: '$_'\n";
|
|
}
|
|
}
|
|
$dbh->disconnect();
|