Skip to content

Commit

Permalink
rewind tuple store to fix scrollable with hold cursor fetches
Browse files Browse the repository at this point in the history
  • Loading branch information
aykut-bozkurt committed Jun 19, 2023
1 parent d71ad4b commit 9b0f451
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/backend/distributed/commands/utility_hook.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,9 @@ multi_ProcessUtility(PlannedStmt *pstmt,
IsA(parsetree, ExecuteStmt) ||
IsA(parsetree, PrepareStmt) ||
IsA(parsetree, DiscardStmt) ||
IsA(parsetree, DeallocateStmt))
IsA(parsetree, DeallocateStmt) ||
IsA(parsetree, DeclareCursorStmt) ||
IsA(parsetree, FetchStmt))
{
/*
* Skip additional checks for common commands that do not have any
Expand Down
14 changes: 13 additions & 1 deletion src/backend/distributed/executor/citus_custom_scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -780,7 +780,19 @@ CitusEndScan(CustomScanState *node)
*/
static void
CitusReScan(CustomScanState *node)
{ }
{
if (node->ss.ps.ps_ResultTupleSlot)
{
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);
}
ExecScanReScan(&node->ss);

CitusScanState *scanState = (CitusScanState *) node;
if (scanState->tuplestorestate)
{
tuplestore_rescan(scanState->tuplestorestate);
}
}


/*
Expand Down
70 changes: 70 additions & 0 deletions src/test/regress/expected/multi_utility_statements.out
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,76 @@ FETCH FORWARD 3 FROM holdCursor;
1 | 19
(3 rows)

CLOSE holdCursor;
-- Test DECLARE CURSOR .. WITH HOLD inside transaction block
BEGIN;
DECLARE holdCursor CURSOR WITH HOLD FOR
SELECT * FROM cursor_me WHERE x = 1 ORDER BY y;
FETCH 3 FROM holdCursor;
x | y
---------------------------------------------------------------------
1 | 10
1 | 11
1 | 12
(3 rows)

FETCH BACKWARD 3 FROM holdCursor;
x | y
---------------------------------------------------------------------
1 | 11
1 | 10
(2 rows)

FETCH FORWARD 3 FROM holdCursor;
x | y
---------------------------------------------------------------------
1 | 10
1 | 11
1 | 12
(3 rows)

COMMIT;
FETCH 3 FROM holdCursor;
x | y
---------------------------------------------------------------------
1 | 13
1 | 14
1 | 15
(3 rows)

CLOSE holdCursor;
-- Test DECLARE NO SCROLL CURSOR .. WITH HOLD inside transaction block
BEGIN;
DECLARE holdCursor NO SCROLL CURSOR WITH HOLD FOR
SELECT * FROM cursor_me WHERE x = 1 ORDER BY y;
FETCH 3 FROM holdCursor;
x | y
---------------------------------------------------------------------
1 | 10
1 | 11
1 | 12
(3 rows)

FETCH FORWARD 3 FROM holdCursor;
x | y
---------------------------------------------------------------------
1 | 13
1 | 14
1 | 15
(3 rows)

COMMIT;
FETCH 3 FROM holdCursor;
x | y
---------------------------------------------------------------------
1 | 16
1 | 17
1 | 18
(3 rows)

FETCH BACKWARD 3 FROM holdCursor;
ERROR: cursor can only scan forward
HINT: Declare it with SCROLL option to enable backward scan.
CLOSE holdCursor;
-- Test DECLARE CURSOR .. WITH HOLD with parameter
CREATE OR REPLACE FUNCTION declares_cursor(p int)
Expand Down
24 changes: 24 additions & 0 deletions src/test/regress/sql/multi_utility_statements.sql
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,30 @@ FETCH FORWARD 3 FROM holdCursor;

CLOSE holdCursor;

-- Test DECLARE CURSOR .. WITH HOLD inside transaction block
BEGIN;
DECLARE holdCursor CURSOR WITH HOLD FOR
SELECT * FROM cursor_me WHERE x = 1 ORDER BY y;
FETCH 3 FROM holdCursor;
FETCH BACKWARD 3 FROM holdCursor;
FETCH FORWARD 3 FROM holdCursor;
COMMIT;

FETCH 3 FROM holdCursor;
CLOSE holdCursor;

-- Test DECLARE NO SCROLL CURSOR .. WITH HOLD inside transaction block
BEGIN;
DECLARE holdCursor NO SCROLL CURSOR WITH HOLD FOR
SELECT * FROM cursor_me WHERE x = 1 ORDER BY y;
FETCH 3 FROM holdCursor;
FETCH FORWARD 3 FROM holdCursor;
COMMIT;

FETCH 3 FROM holdCursor;
FETCH BACKWARD 3 FROM holdCursor;
CLOSE holdCursor;

-- Test DECLARE CURSOR .. WITH HOLD with parameter
CREATE OR REPLACE FUNCTION declares_cursor(p int)
RETURNS void AS $$
Expand Down

0 comments on commit 9b0f451

Please sign in to comment.