diff --git a/src/backend/distributed/executor/citus_custom_scan.c b/src/backend/distributed/executor/citus_custom_scan.c index 202709b3a..7ce986203 100644 --- a/src/backend/distributed/executor/citus_custom_scan.c +++ b/src/backend/distributed/executor/citus_custom_scan.c @@ -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"))); - } -} +{ } /* diff --git a/src/test/regress/expected/multi_utility_statements.out b/src/test/regress/expected/multi_utility_statements.out index 017874842..ad97dd267 100644 --- a/src/test/regress/expected/multi_utility_statements.out +++ b/src/test/regress/expected/multi_utility_statements.out @@ -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 diff --git a/src/test/regress/sql/multi_utility_statements.sql b/src/test/regress/sql/multi_utility_statements.sql index 8a72c206d..36f1bf876 100644 --- a/src/test/regress/sql/multi_utility_statements.sql +++ b/src/test/regress/sql/multi_utility_statements.sql @@ -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 $$