| -- |
| -- Cursor regression tests |
| -- |
| SET optimizer_disable_missing_stats_collection=true; |
| BEGIN; |
| |
| DECLARE foo1 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo2 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo3 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo4 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo5 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo6 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo7 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo8 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo9 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo10 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo11 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo12 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo13 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo14 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo15 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo16 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo17 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo18 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo19 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo20 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo21 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| DECLARE foo22 CURSOR FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| DECLARE foo23 CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| FETCH 1 in foo1; |
| |
| FETCH 2 in foo2; |
| |
| FETCH 3 in foo3; |
| |
| FETCH 4 in foo4; |
| |
| FETCH 5 in foo5; |
| |
| FETCH 6 in foo6; |
| |
| FETCH 7 in foo7; |
| |
| FETCH 8 in foo8; |
| |
| FETCH 9 in foo9; |
| |
| FETCH 10 in foo10; |
| |
| FETCH 11 in foo11; |
| |
| FETCH 12 in foo12; |
| |
| FETCH 13 in foo13; |
| |
| FETCH 14 in foo14; |
| |
| FETCH 15 in foo15; |
| |
| FETCH 16 in foo16; |
| |
| FETCH 17 in foo17; |
| |
| FETCH 18 in foo18; |
| |
| FETCH 19 in foo19; |
| |
| FETCH 20 in foo20; |
| |
| FETCH 21 in foo21; |
| |
| FETCH 22 in foo22; |
| |
| FETCH 23 in foo23; |
| |
| |
| CLOSE foo1; |
| |
| CLOSE foo2; |
| |
| CLOSE foo3; |
| |
| CLOSE foo4; |
| |
| CLOSE foo5; |
| |
| CLOSE foo6; |
| |
| CLOSE foo7; |
| |
| CLOSE foo8; |
| |
| CLOSE foo9; |
| |
| CLOSE foo10; |
| |
| CLOSE foo11; |
| |
| CLOSE foo12; |
| |
| -- leave some cursors open, to test that auto-close works. |
| |
| -- record this in the system view as well (don't query the time field there |
| -- however) |
| SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; |
| |
| END; |
| |
| SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; |
| |
| -- |
| -- NO SCROLL disallows backward fetching |
| -- |
| |
| BEGIN; |
| |
| DECLARE foo24 NO SCROLL CURSOR FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| FETCH 1 FROM foo24; |
| |
| FETCH BACKWARD 1 FROM foo24; -- should fail |
| |
| END; |
| |
| -- |
| -- Cursors outside transaction blocks |
| -- |
| |
| |
| SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; |
| |
| BEGIN; |
| |
| DECLARE foo25 CURSOR WITH HOLD FOR SELECT * FROM tenk2 ORDER BY 1,2,3,4; |
| |
| FETCH FROM foo25; |
| |
| FETCH FROM foo25; |
| |
| COMMIT; |
| |
| FETCH FROM foo25; |
| |
| --FETCH BACKWARD FROM foo25; |
| |
| --FETCH ABSOLUTE -1 FROM foo25; |
| |
| SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; |
| |
| CLOSE foo25; |
| |
| -- |
| -- ROLLBACK should close holdable cursors |
| -- |
| |
| BEGIN; |
| |
| DECLARE foo26 CURSOR WITH HOLD FOR SELECT * FROM tenk1 ORDER BY 1,2,3,4; |
| |
| ROLLBACK; |
| |
| -- should fail |
| FETCH FROM foo26; |
| |
| -- |
| -- Parameterized DECLARE needs to insert param values into the cursor portal |
| -- |
| |
| BEGIN; |
| |
| CREATE FUNCTION declares_cursor(text) |
| RETURNS void |
| AS 'DECLARE c CURSOR FOR SELECT stringu1 FROM tenk1 WHERE stringu1 LIKE $1;' |
| LANGUAGE SQL; |
| |
| SELECT declares_cursor('AB%'); |
| |
| FETCH ALL FROM c; |
| |
| ROLLBACK; |
| |
| -- |
| -- Test behavior of both volatile and stable functions inside a cursor; |
| -- in particular we want to see what happens during commit of a holdable |
| -- cursor |
| -- |
| create temp table tt1(f1 int); |
| |
| create function count_tt1_v() returns int8 as |
| 'select count(*) from tt1' language sql volatile; |
| |
| create function count_tt1_s() returns int8 as |
| 'select count(*) from tt1' language sql stable; |
| |
| begin; |
| |
| insert into tt1 values(1); |
| |
| declare c1 cursor for select count_tt1_v(), count_tt1_s(); |
| |
| insert into tt1 values(2); |
| |
| -- fetch all from c1; -- DISABLED: see open JIRA MPP-835 |
| |
| rollback; |
| |
| begin; |
| |
| insert into tt1 values(1); |
| |
| declare c2 cursor with hold for select count_tt1_v(), count_tt1_s(); |
| |
| insert into tt1 values(2); |
| |
| commit; |
| |
| delete from tt1; |
| |
| -- fetch all from c2; -- DISABLED: see open JIRA MPP-835 |
| |
| drop function count_tt1_v(); |
| drop function count_tt1_s(); |
| |
| |
| -- Create a cursor with the BINARY option and check the pg_cursors view |
| BEGIN; |
| SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; |
| DECLARE bc BINARY CURSOR FOR SELECT * FROM tenk1; |
| SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; |
| ROLLBACK; |
| |
| -- We should not see the portal that is created internally to |
| -- implement EXECUTE in pg_cursors |
| PREPARE cprep AS |
| SELECT name, statement, is_holdable, is_binary, is_scrollable FROM pg_cursors ORDER BY name; |
| EXECUTE cprep; |