Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit d600c1d

Browse files
author
Neil Conway
committed
Add some basic regression tests for refcursors in PL/PgSQL.
1 parent 3fc86c0 commit d600c1d

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

src/test/regress/expected/plpgsql.out

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,3 +2103,73 @@ select sp_add_user('user3');
21032103

21042104
drop function sp_add_user(text);
21052105
drop function sp_id_user(text);
2106+
--
2107+
-- tests for refcursors
2108+
--
2109+
create table rc_test (a int, b int);
2110+
copy rc_test from stdin;
2111+
create function return_refcursor(rc refcursor) returns refcursor as $$
2112+
begin
2113+
open rc for select a from rc_test;
2114+
return rc;
2115+
end
2116+
$$ language 'plpgsql';
2117+
create function refcursor_test1(refcursor) returns refcursor as $$
2118+
begin
2119+
perform return_refcursor($1);
2120+
return $1;
2121+
end
2122+
$$ language 'plpgsql';
2123+
begin;
2124+
select refcursor_test1('test1');
2125+
refcursor_test1
2126+
-----------------
2127+
test1
2128+
(1 row)
2129+
2130+
fetch next from test1;
2131+
a
2132+
---
2133+
5
2134+
(1 row)
2135+
2136+
select refcursor_test1('test2');
2137+
refcursor_test1
2138+
-----------------
2139+
test2
2140+
(1 row)
2141+
2142+
fetch all from test2;
2143+
a
2144+
-----
2145+
5
2146+
50
2147+
500
2148+
(3 rows)
2149+
2150+
commit;
2151+
-- should fail
2152+
fetch next from test1;
2153+
ERROR: cursor "test1" does not exist
2154+
create function refcursor_test2(int) returns boolean as $$
2155+
declare
2156+
c1 cursor (param integer) for select * from rc_test where a > param;
2157+
nonsense record;
2158+
begin
2159+
open c1($1);
2160+
fetch c1 into nonsense;
2161+
close c1;
2162+
if found then
2163+
return true;
2164+
else
2165+
return false;
2166+
end if;
2167+
end
2168+
$$ language 'plpgsql';
2169+
select refcursor_test2(20000) as "Should be false",
2170+
refcursor_test2(20) as "Should be true";
2171+
Should be false | Should be true
2172+
-----------------+----------------
2173+
f | t
2174+
(1 row)
2175+

src/test/regress/sql/plpgsql.sql

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,3 +1807,59 @@ select sp_add_user('user3');
18071807

18081808
drop function sp_add_user(text);
18091809
drop function sp_id_user(text);
1810+
1811+
--
1812+
-- tests for refcursors
1813+
--
1814+
create table rc_test (a int, b int);
1815+
copy rc_test from stdin;
1816+
5 10
1817+
50 100
1818+
500 1000
1819+
\.
1820+
1821+
create function return_refcursor(rc refcursor) returns refcursor as $$
1822+
begin
1823+
open rc for select a from rc_test;
1824+
return rc;
1825+
end
1826+
$$ language 'plpgsql';
1827+
1828+
create function refcursor_test1(refcursor) returns refcursor as $$
1829+
begin
1830+
perform return_refcursor($1);
1831+
return $1;
1832+
end
1833+
$$ language 'plpgsql';
1834+
1835+
begin;
1836+
1837+
select refcursor_test1('test1');
1838+
fetch next from test1;
1839+
1840+
select refcursor_test1('test2');
1841+
fetch all from test2;
1842+
1843+
commit;
1844+
1845+
-- should fail
1846+
fetch next from test1;
1847+
1848+
create function refcursor_test2(int) returns boolean as $$
1849+
declare
1850+
c1 cursor (param integer) for select * from rc_test where a > param;
1851+
nonsense record;
1852+
begin
1853+
open c1($1);
1854+
fetch c1 into nonsense;
1855+
close c1;
1856+
if found then
1857+
return true;
1858+
else
1859+
return false;
1860+
end if;
1861+
end
1862+
$$ language 'plpgsql';
1863+
1864+
select refcursor_test2(20000) as "Should be false",
1865+
refcursor_test2(20) as "Should be true";

0 commit comments

Comments
 (0)