mirror of
https://github.com/postgres/postgres.git
synced 2025-07-07 00:36:50 +03:00
Expose more cursor-related functionality in SPI: specifically, allow
access to the planner's cursor-related planning options, and provide new FETCH/MOVE routines that allow access to the full power of those commands. Small refactoring of planner(), pg_plan_query(), and pg_plan_queries() APIs to make it convenient to pass the planning options down from SPI. This is the core-code portion of Pavel Stehule's patch for scrollable cursor support in plpgsql; I'll review and apply the plpgsql changes separately.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.216 2007/02/27 01:11:25 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.217 2007/04/16 01:14:56 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -80,8 +80,7 @@ static List *postprocess_setop_tlist(List *new_tlist, List *orig_tlist);
|
||||
*
|
||||
*****************************************************************************/
|
||||
PlannedStmt *
|
||||
planner(Query *parse, bool isCursor, int cursorOptions,
|
||||
ParamListInfo boundParams)
|
||||
planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
|
||||
{
|
||||
PlannedStmt *result;
|
||||
PlannerGlobal *glob;
|
||||
@ -107,7 +106,7 @@ planner(Query *parse, bool isCursor, int cursorOptions,
|
||||
glob->finalrtable = NIL;
|
||||
|
||||
/* Determine what fraction of the plan is likely to be scanned */
|
||||
if (isCursor)
|
||||
if (cursorOptions & CURSOR_OPT_FAST_PLAN)
|
||||
{
|
||||
/*
|
||||
* We have no real idea how many tuples the user will ultimately FETCH
|
||||
@ -130,7 +129,7 @@ planner(Query *parse, bool isCursor, int cursorOptions,
|
||||
* If creating a plan for a scrollable cursor, make sure it can run
|
||||
* backwards on demand. Add a Material node at the top at need.
|
||||
*/
|
||||
if (isCursor && (cursorOptions & CURSOR_OPT_SCROLL))
|
||||
if (cursorOptions & CURSOR_OPT_SCROLL)
|
||||
{
|
||||
if (!ExecSupportsBackwardScan(top_plan))
|
||||
top_plan = materialize_finished_plan(top_plan);
|
||||
|
Reference in New Issue
Block a user