Allow WITH HOLD cursors with parameters

release-11.0-circular-views
Marco Slot 2022-07-20 23:20:37 +02:00
parent 9af736c7a6
commit e45b6ece0d
3 changed files with 139 additions and 19 deletions

View File

@ -705,19 +705,7 @@ CitusEndScan(CustomScanState *node)
*/
static void
CitusReScan(CustomScanState *node)
{
CitusScanState *scanState = (CitusScanState *) node;
Job *workerJob = scanState->distributedPlan->workerJob;
EState *executorState = ScanStateGetExecutorState(scanState);
ParamListInfo paramListInfo = executorState->es_param_list_info;
if (paramListInfo != NULL && !workerJob->parametersInJobQueryResolved)
{
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("Cursors for queries on distributed tables with "
"parameters are currently unsupported")));
}
}
{ }
/*

View File

@ -266,6 +266,43 @@ SELECT declares_cursor(5);
(1 row)
FETCH NEXT FROM c;
x | y
---------------------------------------------------------------------
5 | 50
(1 row)
FETCH FORWARD 3 FROM c;
x | y
---------------------------------------------------------------------
5 | 51
5 | 52
5 | 53
(3 rows)
FETCH LAST FROM c;
x | y
---------------------------------------------------------------------
5 | 59
(1 row)
FETCH BACKWARD 3 FROM c;
x | y
---------------------------------------------------------------------
5 | 58
5 | 57
5 | 56
(3 rows)
FETCH FORWARD 3 FROM c;
x | y
---------------------------------------------------------------------
5 | 57
5 | 58
5 | 59
(3 rows)
CLOSE c;
-- Test DECLARE CURSOR .. WITH HOLD without parameter
CREATE OR REPLACE FUNCTION declares_cursor_2()
RETURNS void AS $$
@ -282,15 +319,89 @@ CREATE OR REPLACE FUNCTION declares_cursor_3(p int)
RETURNS void AS $$
DECLARE c3 CURSOR WITH HOLD FOR SELECT * FROM cursor_me WHERE y = $1;
$$ LANGUAGE SQL;
SELECT declares_cursor_3(19);
ERROR: Cursors for queries on distributed tables with parameters are currently unsupported
SELECT declares_cursor_3(5);
declares_cursor_3
---------------------------------------------------------------------
(1 row)
FETCH NEXT FROM c3;
x | y
---------------------------------------------------------------------
0 | 5
(1 row)
FETCH FORWARD 3 FROM c3;
x | y
---------------------------------------------------------------------
(0 rows)
FETCH LAST FROM c3;
x | y
---------------------------------------------------------------------
0 | 5
(1 row)
FETCH BACKWARD 3 FROM c3;
x | y
---------------------------------------------------------------------
(0 rows)
FETCH FORWARD 3 FROM c3;
x | y
---------------------------------------------------------------------
0 | 5
(1 row)
CLOSE c3;
-- Test DECLARE CURSOR .. WITH HOLD with parameter on dist key, but not fast-path planner
CREATE OR REPLACE FUNCTION declares_cursor_4(p int)
RETURNS void AS $$
DECLARE c4 CURSOR WITH HOLD FOR SELECT *, (SELECT 1) FROM cursor_me WHERE x = $1;
$$ LANGUAGE SQL;
SELECT declares_cursor_4(19);
ERROR: Cursors for queries on distributed tables with parameters are currently unsupported
SELECT declares_cursor_4(5);
declares_cursor_4
---------------------------------------------------------------------
(1 row)
FETCH NEXT FROM c4;
x | y | ?column?
---------------------------------------------------------------------
5 | 50 | 1
(1 row)
FETCH FORWARD 3 FROM c4;
x | y | ?column?
---------------------------------------------------------------------
5 | 51 | 1
5 | 52 | 1
5 | 53 | 1
(3 rows)
FETCH LAST FROM c4;
x | y | ?column?
---------------------------------------------------------------------
5 | 59 | 1
(1 row)
FETCH BACKWARD 3 FROM c4;
x | y | ?column?
---------------------------------------------------------------------
5 | 58 | 1
5 | 57 | 1
5 | 56 | 1
(3 rows)
FETCH FORWARD 3 FROM c4;
x | y | ?column?
---------------------------------------------------------------------
5 | 57 | 1
5 | 58 | 1
5 | 59 | 1
(3 rows)
CLOSE c4;
CREATE OR REPLACE FUNCTION cursor_plpgsql(p int)
RETURNS SETOF int AS $$
DECLARE

View File

@ -145,6 +145,13 @@ $$ LANGUAGE SQL;
SELECT declares_cursor(5);
FETCH NEXT FROM c;
FETCH FORWARD 3 FROM c;
FETCH LAST FROM c;
FETCH BACKWARD 3 FROM c;
FETCH FORWARD 3 FROM c;
CLOSE c;
-- Test DECLARE CURSOR .. WITH HOLD without parameter
CREATE OR REPLACE FUNCTION declares_cursor_2()
RETURNS void AS $$
@ -159,7 +166,14 @@ RETURNS void AS $$
DECLARE c3 CURSOR WITH HOLD FOR SELECT * FROM cursor_me WHERE y = $1;
$$ LANGUAGE SQL;
SELECT declares_cursor_3(19);
SELECT declares_cursor_3(5);
FETCH NEXT FROM c3;
FETCH FORWARD 3 FROM c3;
FETCH LAST FROM c3;
FETCH BACKWARD 3 FROM c3;
FETCH FORWARD 3 FROM c3;
CLOSE c3;
-- Test DECLARE CURSOR .. WITH HOLD with parameter on dist key, but not fast-path planner
CREATE OR REPLACE FUNCTION declares_cursor_4(p int)
@ -167,7 +181,14 @@ RETURNS void AS $$
DECLARE c4 CURSOR WITH HOLD FOR SELECT *, (SELECT 1) FROM cursor_me WHERE x = $1;
$$ LANGUAGE SQL;
SELECT declares_cursor_4(19);
SELECT declares_cursor_4(5);
FETCH NEXT FROM c4;
FETCH FORWARD 3 FROM c4;
FETCH LAST FROM c4;
FETCH BACKWARD 3 FROM c4;
FETCH FORWARD 3 FROM c4;
CLOSE c4;
CREATE OR REPLACE FUNCTION cursor_plpgsql(p int)
RETURNS SETOF int AS $$