optimizer.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*-------------------------------------------------------------------------
  2. *
  3. * optimizer.h
  4. * External API for the Postgres planner.
  5. *
  6. * This header is meant to define everything that the core planner
  7. * exposes for use by non-planner modules.
  8. *
  9. * Note that there are files outside src/backend/optimizer/ that are
  10. * considered planner modules, because they're too much in bed with
  11. * planner operations to be treated otherwise. FDW planning code is an
  12. * example. For the most part, however, code outside the core planner
  13. * should not need to include any optimizer/ header except this one.
  14. *
  15. * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
  16. * Portions Copyright (c) 1994, Regents of the University of California
  17. *
  18. * src/include/optimizer/optimizer.h
  19. *
  20. *-------------------------------------------------------------------------
  21. */
  22. #ifndef OPTIMIZER_H
  23. #define OPTIMIZER_H
  24. #include "nodes/parsenodes.h"
  25. /*
  26. * We don't want to include nodes/pathnodes.h here, because non-planner
  27. * code should generally treat PlannerInfo as an opaque typedef.
  28. * But we'd like such code to use that typedef name, so define the
  29. * typedef either here or in pathnodes.h, whichever is read first.
  30. */
  31. #ifndef HAVE_PLANNERINFO_TYPEDEF
  32. typedef struct PlannerInfo PlannerInfo;
  33. #define HAVE_PLANNERINFO_TYPEDEF 1
  34. #endif
  35. /* Likewise for IndexOptInfo and SpecialJoinInfo. */
  36. #ifndef HAVE_INDEXOPTINFO_TYPEDEF
  37. typedef struct IndexOptInfo IndexOptInfo;
  38. #define HAVE_INDEXOPTINFO_TYPEDEF 1
  39. #endif
  40. #ifndef HAVE_SPECIALJOININFO_TYPEDEF
  41. typedef struct SpecialJoinInfo SpecialJoinInfo;
  42. #define HAVE_SPECIALJOININFO_TYPEDEF 1
  43. #endif
  44. /* It also seems best not to include plannodes.h, params.h, or htup.h here */
  45. struct PlannedStmt;
  46. struct ParamListInfoData;
  47. struct HeapTupleData;
  48. /* in path/clausesel.c: */
  49. extern Selectivity clause_selectivity(PlannerInfo *root,
  50. Node *clause,
  51. int varRelid,
  52. JoinType jointype,
  53. SpecialJoinInfo *sjinfo);
  54. extern Selectivity clause_selectivity_ext(PlannerInfo *root,
  55. Node *clause,
  56. int varRelid,
  57. JoinType jointype,
  58. SpecialJoinInfo *sjinfo,
  59. bool use_extended_stats);
  60. extern Selectivity clauselist_selectivity(PlannerInfo *root,
  61. List *clauses,
  62. int varRelid,
  63. JoinType jointype,
  64. SpecialJoinInfo *sjinfo);
  65. extern Selectivity clauselist_selectivity_ext(PlannerInfo *root,
  66. List *clauses,
  67. int varRelid,
  68. JoinType jointype,
  69. SpecialJoinInfo *sjinfo,
  70. bool use_extended_stats);
  71. /* in path/costsize.c: */
  72. /* widely used cost parameters */
  73. extern PGDLLIMPORT double seq_page_cost;
  74. extern PGDLLIMPORT double random_page_cost;
  75. extern PGDLLIMPORT double cpu_tuple_cost;
  76. extern PGDLLIMPORT double cpu_index_tuple_cost;
  77. extern PGDLLIMPORT double cpu_operator_cost;
  78. extern PGDLLIMPORT double parallel_tuple_cost;
  79. extern PGDLLIMPORT double parallel_setup_cost;
  80. extern PGDLLIMPORT double recursive_worktable_factor;
  81. extern PGDLLIMPORT int effective_cache_size;
  82. extern double clamp_row_est(double nrows);
  83. extern long clamp_cardinality_to_long(Cardinality x);
  84. /* in path/indxpath.c: */
  85. extern bool is_pseudo_constant_for_index(PlannerInfo *root, Node *expr,
  86. IndexOptInfo *index);
  87. /* in plan/planner.c: */
  88. /* possible values for force_parallel_mode */
  89. typedef enum
  90. {
  91. FORCE_PARALLEL_OFF,
  92. FORCE_PARALLEL_ON,
  93. FORCE_PARALLEL_REGRESS
  94. } ForceParallelMode;
  95. /* GUC parameters */
  96. extern PGDLLIMPORT int force_parallel_mode;
  97. extern PGDLLIMPORT bool parallel_leader_participation;
  98. extern struct PlannedStmt *planner(Query *parse, const char *query_string,
  99. int cursorOptions,
  100. struct ParamListInfoData *boundParams);
  101. extern Expr *expression_planner(Expr *expr);
  102. extern Expr *expression_planner_with_deps(Expr *expr,
  103. List **relationOids,
  104. List **invalItems);
  105. extern bool plan_cluster_use_sort(Oid tableOid, Oid indexOid);
  106. extern int plan_create_index_workers(Oid tableOid, Oid indexOid);
  107. /* in plan/setrefs.c: */
  108. extern void extract_query_dependencies(Node *query,
  109. List **relationOids,
  110. List **invalItems,
  111. bool *hasRowSecurity);
  112. /* in prep/prepqual.c: */
  113. extern Node *negate_clause(Node *node);
  114. extern Expr *canonicalize_qual(Expr *qual, bool is_check);
  115. /* in util/clauses.c: */
  116. extern bool contain_mutable_functions(Node *clause);
  117. extern bool contain_volatile_functions(Node *clause);
  118. extern bool contain_volatile_functions_not_nextval(Node *clause);
  119. extern Node *eval_const_expressions(PlannerInfo *root, Node *node);
  120. extern void convert_saop_to_hashed_saop(Node *node);
  121. extern Node *estimate_expression_value(PlannerInfo *root, Node *node);
  122. extern Expr *evaluate_expr(Expr *expr, Oid result_type, int32 result_typmod,
  123. Oid result_collation);
  124. extern List *expand_function_arguments(List *args, bool include_out_arguments,
  125. Oid result_type,
  126. struct HeapTupleData *func_tuple);
  127. /* in util/predtest.c: */
  128. extern bool predicate_implied_by(List *predicate_list, List *clause_list,
  129. bool weak);
  130. extern bool predicate_refuted_by(List *predicate_list, List *clause_list,
  131. bool weak);
  132. /* in util/tlist.c: */
  133. extern int count_nonjunk_tlist_entries(List *tlist);
  134. extern TargetEntry *get_sortgroupref_tle(Index sortref,
  135. List *targetList);
  136. extern TargetEntry *get_sortgroupclause_tle(SortGroupClause *sgClause,
  137. List *targetList);
  138. extern Node *get_sortgroupclause_expr(SortGroupClause *sgClause,
  139. List *targetList);
  140. extern List *get_sortgrouplist_exprs(List *sgClauses,
  141. List *targetList);
  142. extern SortGroupClause *get_sortgroupref_clause(Index sortref,
  143. List *clauses);
  144. extern SortGroupClause *get_sortgroupref_clause_noerr(Index sortref,
  145. List *clauses);
  146. /* in util/var.c: */
  147. /* Bits that can be OR'd into the flags argument of pull_var_clause() */
  148. #define PVC_INCLUDE_AGGREGATES 0x0001 /* include Aggrefs in output list */
  149. #define PVC_RECURSE_AGGREGATES 0x0002 /* recurse into Aggref arguments */
  150. #define PVC_INCLUDE_WINDOWFUNCS 0x0004 /* include WindowFuncs in output list */
  151. #define PVC_RECURSE_WINDOWFUNCS 0x0008 /* recurse into WindowFunc arguments */
  152. #define PVC_INCLUDE_PLACEHOLDERS 0x0010 /* include PlaceHolderVars in
  153. * output list */
  154. #define PVC_RECURSE_PLACEHOLDERS 0x0020 /* recurse into PlaceHolderVar
  155. * arguments */
  156. extern Bitmapset *pull_varnos(PlannerInfo *root, Node *node);
  157. extern Bitmapset *pull_varnos_of_level(PlannerInfo *root, Node *node, int levelsup);
  158. extern void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos);
  159. extern List *pull_vars_of_level(Node *node, int levelsup);
  160. extern bool contain_var_clause(Node *node);
  161. extern bool contain_vars_of_level(Node *node, int levelsup);
  162. extern int locate_var_of_level(Node *node, int levelsup);
  163. extern List *pull_var_clause(Node *node, int flags);
  164. extern Node *flatten_join_alias_vars(Query *query, Node *node);
  165. #endif /* OPTIMIZER_H */