mirror of https://github.com/citusdata/citus.git
Allow WITH HOLD cursors with parameters
parent
9af736c7a6
commit
e45b6ece0d
|
@ -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")));
|
||||
}
|
||||
}
|
||||
{ }
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 $$
|
||||
|
|
Loading…
Reference in New Issue