1996-07-09 08:22:35 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
1999-02-14 00:22:53 +01:00
|
|
|
* planmain.h
|
1997-09-07 07:04:48 +02:00
|
|
|
* prototypes for various files in optimizer/plan
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
*
|
2010-01-02 17:58:17 +01:00
|
|
|
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
|
2000-01-26 06:58:53 +01:00
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
2010-01-15 23:36:35 +01:00
|
|
|
* $PostgreSQL: pgsql/src/include/optimizer/planmain.h,v 1.124 2010/01/15 22:36:35 tgl Exp $
|
1996-07-09 08:22:35 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
#ifndef PLANMAIN_H
|
|
|
|
#define PLANMAIN_H
|
|
|
|
|
1997-11-26 02:14:33 +01:00
|
|
|
#include "nodes/plannodes.h"
|
|
|
|
#include "nodes/relation.h"
|
1996-07-09 08:22:35 +02:00
|
|
|
|
2008-05-02 23:26:10 +02:00
|
|
|
/* GUC parameters */
|
|
|
|
#define DEFAULT_CURSOR_TUPLE_FRACTION 0.1
|
|
|
|
extern double cursor_tuple_fraction;
|
|
|
|
|
1996-07-09 08:22:35 +02:00
|
|
|
/*
|
|
|
|
* prototypes for plan/planmain.c
|
|
|
|
*/
|
2005-06-06 00:32:58 +02:00
|
|
|
extern void query_planner(PlannerInfo *root, List *tlist,
|
2007-05-04 03:13:45 +02:00
|
|
|
double tuple_fraction, double limit_tuples,
|
2005-10-15 04:49:52 +02:00
|
|
|
Path **cheapest_path, Path **sorted_path,
|
|
|
|
double *num_groups);
|
1996-07-09 08:22:35 +02:00
|
|
|
|
2005-04-12 01:06:57 +02:00
|
|
|
/*
|
|
|
|
* prototypes for plan/planagg.c
|
|
|
|
*/
|
2005-06-06 00:32:58 +02:00
|
|
|
extern Plan *optimize_minmax_aggregates(PlannerInfo *root, List *tlist,
|
2005-10-15 04:49:52 +02:00
|
|
|
Path *best_path);
|
2005-04-12 01:06:57 +02:00
|
|
|
|
1996-07-09 08:22:35 +02:00
|
|
|
/*
|
|
|
|
* prototypes for plan/createplan.c
|
|
|
|
*/
|
2005-06-06 00:32:58 +02:00
|
|
|
extern Plan *create_plan(PlannerInfo *root, Path *best_path);
|
2010-01-01 22:53:49 +01:00
|
|
|
extern Node *fix_indexqual_operand(Node *node, IndexOptInfo *index);
|
2000-10-05 21:11:39 +02:00
|
|
|
extern SubqueryScan *make_subqueryscan(List *qptlist, List *qpqual,
|
2009-10-12 20:10:51 +02:00
|
|
|
Index scanrelid, Plan *subplan,
|
|
|
|
List *subrtable, List *subrowmark);
|
2009-10-10 03:43:50 +02:00
|
|
|
extern Append *make_append(List *appendplans, List *tlist);
|
2008-10-04 23:56:55 +02:00
|
|
|
extern RecursiveUnion *make_recursive_union(List *tlist,
|
2009-06-11 16:49:15 +02:00
|
|
|
Plan *lefttree, Plan *righttree, int wtParam,
|
|
|
|
List *distinctList, long numGroups);
|
2007-01-20 21:45:41 +01:00
|
|
|
extern Sort *make_sort_from_pathkeys(PlannerInfo *root, Plan *lefttree,
|
2007-05-04 03:13:45 +02:00
|
|
|
List *pathkeys, double limit_tuples);
|
2005-06-06 00:32:58 +02:00
|
|
|
extern Sort *make_sort_from_sortclauses(PlannerInfo *root, List *sortcls,
|
2004-01-18 01:50:03 +01:00
|
|
|
Plan *lefttree);
|
2005-06-06 00:32:58 +02:00
|
|
|
extern Sort *make_sort_from_groupcols(PlannerInfo *root, List *groupcls,
|
2003-08-04 02:43:34 +02:00
|
|
|
AttrNumber *grpColIdx, Plan *lefttree);
|
2005-06-06 00:32:58 +02:00
|
|
|
extern Agg *make_agg(PlannerInfo *root, List *tlist, List *qual,
|
2003-08-04 02:43:34 +02:00
|
|
|
AggStrategy aggstrategy,
|
2007-01-10 19:06:05 +01:00
|
|
|
int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators,
|
2003-08-04 02:43:34 +02:00
|
|
|
long numGroups, int numAggs,
|
|
|
|
Plan *lefttree);
|
2008-12-28 19:54:01 +01:00
|
|
|
extern WindowAgg *make_windowagg(PlannerInfo *root, List *tlist,
|
2008-12-31 01:08:39 +01:00
|
|
|
int numWindowFuncs, Index winref,
|
2008-12-28 19:54:01 +01:00
|
|
|
int partNumCols, AttrNumber *partColIdx, Oid *partOperators,
|
|
|
|
int ordNumCols, AttrNumber *ordColIdx, Oid *ordOperators,
|
2008-12-31 01:08:39 +01:00
|
|
|
int frameOptions, Plan *lefttree);
|
2005-06-06 00:32:58 +02:00
|
|
|
extern Group *make_group(PlannerInfo *root, List *tlist, List *qual,
|
2007-01-10 19:06:05 +01:00
|
|
|
int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators,
|
2003-08-04 02:43:34 +02:00
|
|
|
double numGroups,
|
|
|
|
Plan *lefttree);
|
2003-03-10 04:53:52 +01:00
|
|
|
extern Plan *materialize_finished_plan(Plan *subplan);
|
2004-01-18 01:50:03 +01:00
|
|
|
extern Unique *make_unique(Plan *lefttree, List *distinctList);
|
Re-implement EvalPlanQual processing to improve its performance and eliminate
a lot of strange behaviors that occurred in join cases. We now identify the
"current" row for every joined relation in UPDATE, DELETE, and SELECT FOR
UPDATE/SHARE queries. If an EvalPlanQual recheck is necessary, we jam the
appropriate row into each scan node in the rechecking plan, forcing it to emit
only that one row. The former behavior could rescan the whole of each joined
relation for each recheck, which was terrible for performance, and what's much
worse could result in duplicated output tuples.
Also, the original implementation of EvalPlanQual could not re-use the recheck
execution tree --- it had to go through a full executor init and shutdown for
every row to be tested. To avoid this overhead, I've associated a special
runtime Param with each LockRows or ModifyTable plan node, and arranged to
make every scan node below such a node depend on that Param. Thus, by
signaling a change in that Param, the EPQ machinery can just rescan the
already-built test plan.
This patch also adds a prohibition on set-returning functions in the
targetlist of SELECT FOR UPDATE/SHARE. This is needed to avoid the
duplicate-output-tuple problem. It seems fairly reasonable since the
other restrictions on SELECT FOR UPDATE are meant to ensure that there
is a unique correspondence between source tuples and result tuples,
which an output SRF destroys as much as anything else does.
2009-10-26 03:26:45 +01:00
|
|
|
extern LockRows *make_lockrows(Plan *lefttree, List *rowMarks, int epqParam);
|
2005-08-18 19:51:12 +02:00
|
|
|
extern Limit *make_limit(Plan *lefttree, Node *limitOffset, Node *limitCount,
|
2006-07-26 02:34:48 +02:00
|
|
|
int64 offset_est, int64 count_est);
|
2008-08-07 05:04:04 +02:00
|
|
|
extern SetOp *make_setop(SetOpCmd cmd, SetOpStrategy strategy, Plan *lefttree,
|
2008-08-07 21:35:02 +02:00
|
|
|
List *distinctList, AttrNumber flagColIdx, int firstFlag,
|
|
|
|
long numGroups, double outputRows);
|
2007-02-22 23:00:26 +01:00
|
|
|
extern Result *make_result(PlannerInfo *root, List *tlist,
|
2007-11-15 22:14:46 +01:00
|
|
|
Node *resconstantqual, Plan *subplan);
|
2009-10-10 03:43:50 +02:00
|
|
|
extern ModifyTable *make_modifytable(CmdType operation, List *resultRelations,
|
Re-implement EvalPlanQual processing to improve its performance and eliminate
a lot of strange behaviors that occurred in join cases. We now identify the
"current" row for every joined relation in UPDATE, DELETE, and SELECT FOR
UPDATE/SHARE queries. If an EvalPlanQual recheck is necessary, we jam the
appropriate row into each scan node in the rechecking plan, forcing it to emit
only that one row. The former behavior could rescan the whole of each joined
relation for each recheck, which was terrible for performance, and what's much
worse could result in duplicated output tuples.
Also, the original implementation of EvalPlanQual could not re-use the recheck
execution tree --- it had to go through a full executor init and shutdown for
every row to be tested. To avoid this overhead, I've associated a special
runtime Param with each LockRows or ModifyTable plan node, and arranged to
make every scan node below such a node depend on that Param. Thus, by
signaling a change in that Param, the EPQ machinery can just rescan the
already-built test plan.
This patch also adds a prohibition on set-returning functions in the
targetlist of SELECT FOR UPDATE/SHARE. This is needed to avoid the
duplicate-output-tuple problem. It seems fairly reasonable since the
other restrictions on SELECT FOR UPDATE are meant to ensure that there
is a unique correspondence between source tuples and result tuples,
which an output SRF destroys as much as anything else does.
2009-10-26 03:26:45 +01:00
|
|
|
List *subplans, List *returningLists,
|
|
|
|
List *rowMarks, int epqParam);
|
2004-01-18 01:50:03 +01:00
|
|
|
extern bool is_projection_capable_plan(Plan *plan);
|
1996-07-09 08:22:35 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* prototypes for plan/initsplan.c
|
|
|
|
*/
|
2005-12-20 03:30:36 +01:00
|
|
|
extern int from_collapse_limit;
|
|
|
|
extern int join_collapse_limit;
|
|
|
|
|
2005-06-06 00:32:58 +02:00
|
|
|
extern void add_base_rels_to_query(PlannerInfo *root, Node *jtnode);
|
|
|
|
extern void build_base_rel_tlists(PlannerInfo *root, List *final_tlist);
|
2007-01-20 21:45:41 +01:00
|
|
|
extern void add_vars_to_targetlist(PlannerInfo *root, List *vars,
|
2007-11-15 22:14:46 +01:00
|
|
|
Relids where_needed);
|
2005-12-20 03:30:36 +01:00
|
|
|
extern List *deconstruct_jointree(PlannerInfo *root);
|
2007-01-20 21:45:41 +01:00
|
|
|
extern void distribute_restrictinfo_to_rels(PlannerInfo *root,
|
2007-11-15 22:14:46 +01:00
|
|
|
RestrictInfo *restrictinfo);
|
2005-06-06 00:32:58 +02:00
|
|
|
extern void process_implied_equality(PlannerInfo *root,
|
2007-11-15 22:14:46 +01:00
|
|
|
Oid opno,
|
|
|
|
Expr *item1,
|
|
|
|
Expr *item2,
|
|
|
|
Relids qualscope,
|
|
|
|
bool below_outer_join,
|
|
|
|
bool both_const);
|
2007-01-20 21:45:41 +01:00
|
|
|
extern RestrictInfo *build_implied_join_equality(Oid opno,
|
|
|
|
Expr *item1,
|
|
|
|
Expr *item2,
|
|
|
|
Relids qualscope);
|
1996-07-09 08:22:35 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* prototypes for plan/setrefs.c
|
|
|
|
*/
|
2007-11-15 23:25:18 +01:00
|
|
|
extern Plan *set_plan_references(PlannerGlobal *glob,
|
2007-11-15 22:14:46 +01:00
|
|
|
Plan *plan,
|
2009-10-12 20:10:51 +02:00
|
|
|
List *rtable,
|
|
|
|
List *rowmarks);
|
2007-11-15 23:25:18 +01:00
|
|
|
extern List *set_returning_clause_references(PlannerGlobal *glob,
|
2007-10-11 20:05:27 +02:00
|
|
|
List *rlist,
|
2006-08-12 04:52:06 +02:00
|
|
|
Plan *topplan,
|
|
|
|
Index resultRelation);
|
2002-12-12 16:49:42 +01:00
|
|
|
extern void fix_opfuncids(Node *node);
|
2003-08-08 23:42:59 +02:00
|
|
|
extern void set_opfuncid(OpExpr *opexpr);
|
2007-01-22 02:35:23 +01:00
|
|
|
extern void set_sa_opfuncid(ScalarArrayOpExpr *opexpr);
|
2008-09-09 20:58:09 +02:00
|
|
|
extern void record_plan_function_dependency(PlannerGlobal *glob, Oid funcid);
|
2010-01-15 23:36:35 +01:00
|
|
|
extern void extract_query_dependencies(Node *query,
|
2009-06-11 16:49:15 +02:00
|
|
|
List **relationOids,
|
|
|
|
List **invalItems);
|
1999-08-21 05:49:17 +02:00
|
|
|
|
2001-11-05 18:46:40 +01:00
|
|
|
#endif /* PLANMAIN_H */
|