pg: Add a few result fetching methods
I'm not sure if these are free from memory leaks, need to find a way to test for that.
This commit is contained in:
parent
711300b227
commit
9d5905e3b4
5 changed files with 223 additions and 21 deletions
101
t/pgconnect.t
101
t/pgconnect.t
|
|
@ -23,33 +23,94 @@ is ref $conn, 'FU::PG::conn';
|
|||
ok $conn->server_version > 100000;
|
||||
is $conn->lib_version, FU::PG::lib_version();
|
||||
|
||||
ok !eval { $conn->exec('COPY (SELECT 1) TO STDOUT'); };
|
||||
okerr FATAL => exec => qr/unexpected status code/;
|
||||
subtest '$conn->exec', sub {
|
||||
ok !eval { $conn->exec('COPY (SELECT 1) TO STDOUT'); };
|
||||
okerr FATAL => exec => qr/unexpected status code/;
|
||||
|
||||
ok !eval { $conn->exec('SELEXT'); };
|
||||
okerr ERROR => exec => qr/syntax error/;
|
||||
ok !eval { $conn->exec('SELEXT'); };
|
||||
okerr ERROR => exec => qr/syntax error/;
|
||||
|
||||
ok !defined $conn->exec('');
|
||||
is $conn->exec('SELECT 1'), 1;
|
||||
ok !defined $conn->exec('');
|
||||
is $conn->exec('SELECT 1'), 1;
|
||||
|
||||
ok !eval { $conn->q('SELEXT')->params; };
|
||||
okerr ERROR => prepare => qr/syntax error/;
|
||||
ok !eval { $conn->q('SELEXT')->params; };
|
||||
okerr ERROR => prepare => qr/syntax error/;
|
||||
};
|
||||
|
||||
{
|
||||
my $st = $conn->q('SELECT 1');
|
||||
is_deeply $st->params, [];
|
||||
is_deeply $st->columns, [{ name => '?column?', oid => 23 }];
|
||||
is $conn->exec('SELECT 1 FROM pg_prepared_statements'), 1;
|
||||
is $st->exec, 1;
|
||||
}
|
||||
|
||||
is $conn->exec('SELECT 1 FROM pg_prepared_statements'), 0;
|
||||
subtest '$st prepare & exec', sub {
|
||||
{
|
||||
my $st = $conn->q('SELECT 1');
|
||||
is_deeply $st->params, [];
|
||||
is_deeply $st->columns, [{ name => '?column?', oid => 23 }];
|
||||
is $conn->exec('SELECT 1 FROM pg_prepared_statements'), 1;
|
||||
is $st->exec, 1;
|
||||
}
|
||||
|
||||
ok !eval { $conn->q('SELECT 1', 1)->exec; 1 };
|
||||
okerr ERROR => exec => qr/bind message supplies 1 parameters, but prepared statement/;
|
||||
is $conn->exec('SELECT 1 FROM pg_prepared_statements'), 0;
|
||||
|
||||
ok !eval { $conn->q('SELECT $1')->exec; 1 };
|
||||
okerr ERROR => exec => qr/bind message supplies 0 parameters, but prepared statement/;
|
||||
ok !eval { $conn->q('SELECT 1', 1)->exec; 1 };
|
||||
okerr ERROR => exec => qr/bind message supplies 1 parameters, but prepared statement/;
|
||||
|
||||
ok !eval { $conn->q('SELECT $1')->exec; 1 };
|
||||
okerr ERROR => exec => qr/bind message supplies 0 parameters, but prepared statement/;
|
||||
};
|
||||
|
||||
subtest '$st->val', sub {
|
||||
ok !eval { $conn->q('SELECT')->val; 1 };
|
||||
like $@, qr/on query returning no data/;
|
||||
|
||||
ok !eval { $conn->q('SELECT 1, 2')->val; 1 };
|
||||
like $@, qr/on query returning more than one column/;
|
||||
|
||||
ok !eval { $conn->q('SELECT 1 UNION SELECT 2')->val; 1 };
|
||||
like $@, qr/on query returning more than one row/;
|
||||
|
||||
ok !defined $conn->q('SELECT 1 WHERE false')->val;
|
||||
ok !defined $conn->q('SELECT null')->val;
|
||||
is $conn->q('SELECT $1::text', "\x{1F603}")->val, "\x{1F603}";
|
||||
};
|
||||
|
||||
subtest '$st->rowl', sub {
|
||||
ok !eval { $conn->q('SELECT 1 WHERE false')->rowl; 1 };
|
||||
like $@, qr/on query returning zero rows/;
|
||||
|
||||
ok !eval { $conn->q('SELECT 1 UNION SELECT 2')->rowl; 1 };
|
||||
like $@, qr/on query returning more than one row/;
|
||||
|
||||
ok !eval { $conn->q('SELEXT')->rowl; 1; };
|
||||
is scalar $conn->q('SELECT')->rowl, 0;
|
||||
is scalar $conn->q('SELECT 1, 2')->rowl, 2;
|
||||
is_deeply [$conn->q('SELECT')->rowl], [];
|
||||
is_deeply [$conn->q('SELECT 1, 2')->rowl], [1, 2];
|
||||
};
|
||||
|
||||
subtest '$st->rowa', sub {
|
||||
ok !eval { $conn->q('SELECT 1 WHERE false')->rowa; 1 };
|
||||
like $@, qr/on query returning zero rows/;
|
||||
|
||||
ok !eval { $conn->q('SELECT 1 UNION SELECT 2')->rowa; 1 };
|
||||
like $@, qr/on query returning more than one row/;
|
||||
|
||||
ok !eval { $conn->q('SELEXT')->rowa; 1; };
|
||||
is_deeply $conn->q('SELECT')->rowa, [];
|
||||
is_deeply $conn->q('SELECT 1, 2')->rowa, [1, 2];
|
||||
};
|
||||
|
||||
subtest '$st->rowh', sub {
|
||||
ok !eval { $conn->q('SELECT 1 WHERE false')->rowh; 1 };
|
||||
like $@, qr/on query returning zero rows/;
|
||||
|
||||
ok !eval { $conn->q('SELECT 1 UNION SELECT 2')->rowh; 1 };
|
||||
like $@, qr/on query returning more than one row/;
|
||||
|
||||
ok !eval { $conn->q('SELECT 1 as a, 2 as a')->rowh; 1 };
|
||||
like $@, qr/Query returns multiple columns with the same name/;
|
||||
|
||||
ok !eval { $conn->q('SELEXT')->rowh; 1; };
|
||||
is_deeply $conn->q('SELECT')->rowh, {};
|
||||
is_deeply $conn->q('SELECT 1 as a, 2 as b')->rowh, {a => 1, b => 2};
|
||||
};
|
||||
|
||||
{
|
||||
my $st = $conn->q("SELECT \$1::int AS a, \$2::char(5) AS \"\x{1F603}\"");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue