1 /*------------------------------------------------------------------------- 2 * 3 * planmain.h 4 * prototypes for various files in optimizer/plan 5 * 6 * 7 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group 8 * Portions Copyright (c) 1994, Regents of the University of California 9 * 10 * src/include/optimizer/planmain.h 11 * 12 *------------------------------------------------------------------------- 13 */ 14 #ifndef PLANMAIN_H 15 #define PLANMAIN_H 16 17 #include "nodes/plannodes.h" 18 #include "nodes/relation.h" 19 20 /* possible values for force_parallel_mode */ 21 typedef enum 22 { 23 FORCE_PARALLEL_OFF, 24 FORCE_PARALLEL_ON, 25 FORCE_PARALLEL_REGRESS 26 } ForceParallelMode; 27 28 /* GUC parameters */ 29 #define DEFAULT_CURSOR_TUPLE_FRACTION 0.1 30 extern double cursor_tuple_fraction; 31 extern int force_parallel_mode; 32 33 /* query_planner callback to compute query_pathkeys */ 34 typedef void (*query_pathkeys_callback) (PlannerInfo *root, void *extra); 35 36 /* 37 * prototypes for plan/planmain.c 38 */ 39 extern RelOptInfo *query_planner(PlannerInfo *root, List *tlist, 40 query_pathkeys_callback qp_callback, void *qp_extra); 41 42 /* 43 * prototypes for plan/planagg.c 44 */ 45 extern void preprocess_minmax_aggregates(PlannerInfo *root, List *tlist); 46 47 /* 48 * prototypes for plan/createplan.c 49 */ 50 extern Plan *create_plan(PlannerInfo *root, Path *best_path); 51 extern ForeignScan *make_foreignscan(List *qptlist, List *qpqual, 52 Index scanrelid, List *fdw_exprs, List *fdw_private, 53 List *fdw_scan_tlist, List *fdw_recheck_quals, 54 Plan *outer_plan); 55 extern Plan *change_plan_targetlist(Plan *subplan, List *tlist, 56 bool tlist_parallel_safe); 57 extern Plan *materialize_finished_plan(Plan *subplan); 58 extern bool is_projection_capable_path(Path *path); 59 extern bool is_projection_capable_plan(Plan *plan); 60 61 /* External use of these functions is deprecated: */ 62 extern Sort *make_sort_from_sortclauses(List *sortcls, Plan *lefttree); 63 extern Agg *make_agg(List *tlist, List *qual, 64 AggStrategy aggstrategy, AggSplit aggsplit, 65 int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators, 66 List *groupingSets, List *chain, 67 double dNumGroups, Plan *lefttree); 68 extern Limit *make_limit(Plan *lefttree, Node *limitOffset, Node *limitCount); 69 70 /* 71 * prototypes for plan/initsplan.c 72 */ 73 extern int from_collapse_limit; 74 extern int join_collapse_limit; 75 76 extern void add_base_rels_to_query(PlannerInfo *root, Node *jtnode); 77 extern void build_base_rel_tlists(PlannerInfo *root, List *final_tlist); 78 extern void add_vars_to_targetlist(PlannerInfo *root, List *vars, 79 Relids where_needed, bool create_new_ph); 80 extern void find_lateral_references(PlannerInfo *root); 81 extern void create_lateral_join_info(PlannerInfo *root); 82 extern List *deconstruct_jointree(PlannerInfo *root); 83 extern void distribute_restrictinfo_to_rels(PlannerInfo *root, 84 RestrictInfo *restrictinfo); 85 extern void process_implied_equality(PlannerInfo *root, 86 Oid opno, 87 Oid collation, 88 Expr *item1, 89 Expr *item2, 90 Relids qualscope, 91 Relids nullable_relids, 92 Index security_level, 93 bool below_outer_join, 94 bool both_const); 95 extern RestrictInfo *build_implied_join_equality(Oid opno, 96 Oid collation, 97 Expr *item1, 98 Expr *item2, 99 Relids qualscope, 100 Relids nullable_relids, 101 Index security_level); 102 extern void match_foreign_keys_to_quals(PlannerInfo *root); 103 104 /* 105 * prototypes for plan/analyzejoins.c 106 */ 107 extern List *remove_useless_joins(PlannerInfo *root, List *joinlist); 108 extern void reduce_unique_semijoins(PlannerInfo *root); 109 extern bool query_supports_distinctness(Query *query); 110 extern bool query_is_distinct_for(Query *query, List *colnos, List *opids); 111 extern bool innerrel_is_unique(PlannerInfo *root, 112 Relids outerrelids, RelOptInfo *innerrel, 113 JoinType jointype, List *restrictlist, bool force_cache); 114 115 /* 116 * prototypes for plan/setrefs.c 117 */ 118 extern Plan *set_plan_references(PlannerInfo *root, Plan *plan); 119 extern void record_plan_function_dependency(PlannerInfo *root, Oid funcid); 120 extern void extract_query_dependencies(Node *query, 121 List **relationOids, 122 List **invalItems, 123 bool *hasRowSecurity); 124 125 #endif /* PLANMAIN_H */ 126