1
1
package GenTest::Executor::Postgres;
7
3
@ISA = qw(GenTest::Executor);
9
use GenTest::Constants;
11
use GenTest::Executor;
12
use GenTest::Translator;
13
use GenTest::Translator::MysqlDML2ANSI;
14
use GenTest::Translator::Mysqldump2ANSI;
15
use GenTest::Translator::MysqlDML2pgsql;
16
use GenTest::Translator::Mysqldump2pgsql;
14
my $dbh = DBI->connect($executor->dsn());
15
$executor->setDbh($dbh);
22
my $dbh = DBI->connect($self->dsn(), undef, undef,
29
if (not defined $dbh) {
30
say("connect() to dsn ".$self->dsn()." failed: ".$DBI::errstr);
31
return STATUS_ENVIRONMENT_FAILURE;
39
my %acceptedErrors = (
40
"42P01" => 1 # DROP TABLE on non-existing table is accepted since
41
# tests rely on non-standard MySQL DROP IF EXISTS;
19
my ($executor, $query) = @_;
20
my $dbh = $executor->dbh();
21
my $sth = $dbh->prepare($query);
23
return $sth->fetchall_arrayref();
45
my ($self, $query, $silent) = @_;
47
my $dbh = $self->dbh();
49
return GenTest::Result->new(
51
status => STATUS_UNKNOWN_ERROR )
54
$query = $self->preprocess($query);
56
## This may be generalized into a translator which is a pipe
58
my @pipe = (GenTest::Translator::Mysqldump2pgsql->new(),
59
GenTest::Translator::MysqlDML2pgsql->new());
61
foreach my $p (@pipe) {
62
$query = $p->translate($query);
63
return GenTest::Result->new(
65
status => STATUS_WONT_HANDLE )
71
my $db = $self->getName()." ".$self->version();
73
my $start_time = Time::HiRes::time();
75
my $sth = $dbh->prepare($query);
77
if (defined $dbh->err()) {
78
my $errstr = $db.":".$dbh->state().":".$dbh->errstr();
79
say($errstr . "($query)") if !$silent;
80
$self->[EXECUTOR_ERROR_COUNTS]->{$errstr}++ if rqg_debug() && !$silent;
81
return GenTest::Result->new(
83
status => $self->findStatus($dbh->state()),
85
errstr => $dbh->errstr(),
86
sqlstate => $dbh->state(),
87
start_time => $start_time,
88
end_time => Time::HiRes::time()
93
my $affected_rows = $sth->execute();
96
my $end_time = Time::HiRes::time();
98
my $err = $sth->err();
102
if (not defined $acceptedErrors{$dbh->state()}) {
104
my $errstr = $db.":".$dbh->state().":".$dbh->errstr();
105
say($errstr . "($query)") if !$silent;
106
$self->[EXECUTOR_ERROR_COUNTS]->{$errstr}++ if rqg_debug() && !$silent;
107
return GenTest::Result->new(
109
status => $self->findStatus($dbh->state()),
111
errstr => $dbh->errstr(),
112
sqlstate => $dbh->state(),
113
start_time => $start_time,
114
end_time => $end_time
117
## E.g. DROP on non-existing table
118
return GenTest::Result->new(
122
start_time => $start_time,
123
end_time => Time::HiRes::time()
127
} elsif ((not defined $sth->{NUM_OF_FIELDS}) || ($sth->{NUM_OF_FIELDS} == 0)) {
128
## DDL/UPDATE/INSERT/DROP/DELETE
129
$result = GenTest::Result->new(
132
affected_rows => $affected_rows,
133
start_time => $start_time,
134
end_time => $end_time
136
$self->[EXECUTOR_ERROR_COUNTS]->{'(no error)'}++ if rqg_debug() && !$silent;
140
# We do not use fetchall_arrayref() due to a memory leak
141
# We also copy the row explicitly into a fresh array
142
# otherwise the entire @data array ends up referencing row #1 only
144
while (my $row = $sth->fetchrow_arrayref()) {
149
$result = GenTest::Result->new(
152
affected_rows => $affected_rows,
154
start_time => $start_time,
155
end_time => $end_time
158
$self->[EXECUTOR_ERROR_COUNTS]->{'(no error)'}++ if rqg_debug() && !$silent;
168
my $dbh = $self->dbh();
169
return $dbh->get_info(18);