66#define PGS_SEQSCAN 0x00000001
67#define PGS_INDEXSCAN 0x00000002
68#define PGS_INDEXONLYSCAN 0x00000004
69#define PGS_BITMAPSCAN 0x00000008
70#define PGS_TIDSCAN 0x00000010
71#define PGS_FOREIGNJOIN 0x00000020
72#define PGS_MERGEJOIN_PLAIN 0x00000040
73#define PGS_MERGEJOIN_MATERIALIZE 0x00000080
74#define PGS_NESTLOOP_PLAIN 0x00000100
75#define PGS_NESTLOOP_MATERIALIZE 0x00000200
76#define PGS_NESTLOOP_MEMOIZE 0x00000400
77#define PGS_HASHJOIN 0x00000800
78#define PGS_APPEND 0x00001000
79#define PGS_MERGE_APPEND 0x00002000
80#define PGS_GATHER 0x00004000
81#define PGS_GATHER_MERGE 0x00008000
82#define PGS_CONSIDER_INDEXONLY 0x00010000
83#define PGS_CONSIDER_PARTITIONWISE 0x00020000
84#define PGS_CONSIDER_NONPARTIAL 0x00040000
90 (PGS_SEQSCAN | PGS_INDEXSCAN | PGS_INDEXONLYSCAN | PGS_BITMAPSCAN | \
92#define PGS_MERGEJOIN_ANY \
93 (PGS_MERGEJOIN_PLAIN | PGS_MERGEJOIN_MATERIALIZE)
94#define PGS_NESTLOOP_ANY \
95 (PGS_NESTLOOP_PLAIN | PGS_NESTLOOP_MATERIALIZE | PGS_NESTLOOP_MEMOIZE)
97 (PGS_FOREIGNJOIN | PGS_MERGEJOIN_ANY | PGS_NESTLOOP_ANY | PGS_HASHJOIN)
271#define planner_subplan_get_plan(root, subplan) \
272 ((Plan *) list_nth((root)->glob->subplans, (subplan)->plan_id - 1))
686#define planner_rt_fetch(rti, root) \
687 ((root)->simple_rte_array ? (root)->simple_rte_array[rti] : \
688 rt_fetch(rti, (root)->parse->rtable))
955#define AMFLAG_HAS_TID_RANGE (1 << 0)
971#define IS_SIMPLE_REL(rel) \
972 ((rel)->reloptkind == RELOPT_BASEREL || \
973 (rel)->reloptkind == RELOPT_OTHER_MEMBER_REL)
976#define IS_JOIN_REL(rel) \
977 ((rel)->reloptkind == RELOPT_JOINREL || \
978 (rel)->reloptkind == RELOPT_OTHER_JOINREL)
981#define IS_UPPER_REL(rel) \
982 ((rel)->reloptkind == RELOPT_UPPER_REL || \
983 (rel)->reloptkind == RELOPT_OTHER_UPPER_REL)
986#define IS_OTHER_REL(rel) \
987 ((rel)->reloptkind == RELOPT_OTHER_MEMBER_REL || \
988 (rel)->reloptkind == RELOPT_OTHER_JOINREL || \
989 (rel)->reloptkind == RELOPT_OTHER_UPPER_REL)
1213#define IS_PARTITIONED_REL(rel) \
1214 ((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0 && \
1215 (rel)->part_rels && !IS_DUMMY_REL(rel))
1221#define REL_HAS_ALL_PART_PROPS(rel) \
1222 ((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0 && \
1223 (rel)->part_rels && (rel)->partexprs && (rel)->nullable_partexprs)
1232#define RELATION_WAS_MADE_UNIQUE(rel, sjinfo, nominal_jointype) \
1233 ((nominal_jointype) == JOIN_INNER && (sjinfo)->jointype == JOIN_SEMI && \
1234 bms_equal((sjinfo)->syn_righthand, (rel)->relids))
1239#define IS_GROUPED_REL(rel) \
1240 ((rel)->agg_info != NULL)
1664#define EC_MUST_BE_REDUNDANT(eclass) \
1665 ((eclass)->ec_has_const)
1874#define get_pathtarget_sortgroupref(target, colno) \
1875 ((target)->sortgrouprefs ? (target)->sortgrouprefs[colno] : (Index) 0)
1995#define PATH_REQ_OUTER(path) \
1996 ((path)->param_info ? (path)->param_info->ppi_req_outer : (Relids) NULL)
2264#define IS_DUMMY_APPEND(p) \
2265 (IsA((p), AppendPath) && ((AppendPath *) (p))->subpaths == NIL)
2272#define IS_DUMMY_REL(r) is_dummy_rel(r)
3027#define RINFO_IS_PUSHED_DOWN(rinfo, joinrelids) \
3028 ((rinfo)->is_pushed_down || \
3029 !bms_is_subset((rinfo)->required_relids, joinrelids))
3599#define GROUPING_CAN_USE_SORT 0x0001
3600#define GROUPING_CAN_USE_HASH 0x0002
3601#define GROUPING_CAN_PARTIAL_AGG 0x0004
#define pg_node_attr(...)
bool is_dummy_rel(RelOptInfo *rel)
PartitionwiseAggregateType
@ PARTITIONWISE_AGGREGATE_PARTIAL
@ PARTITIONWISE_AGGREGATE_FULL
@ PARTITIONWISE_AGGREGATE_NONE
struct PartitionSchemeData * PartitionScheme
@ UPPERREL_PARTIAL_GROUP_AGG
@ UPPERREL_PARTIAL_DISTINCT
@ RELOPT_OTHER_MEMBER_REL
pg_node_attr(no_read, no_query_jumble) NodeTag type
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
Datum initValue pg_node_attr(read_write_ignore)
pg_node_attr(no_query_jumble) NodeTag type
AttrNumber *parent_colnos pg_node_attr(array_size(num_child_cols))
Selectivity bitmapselectivity
Selectivity bitmapselectivity
const struct CustomPathMethods * methods
List * custom_restrictinfo
pg_node_attr(custom_read_write, no_copy_equal, no_read, no_query_jumble) NodeTag type
struct EquivalenceClass * ec_merged
struct derives_hash * ec_derives_hash
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
struct EquivalenceMember *em_parent pg_node_attr(read_write_ignore)
AttrNumber conkey[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys))
AttrNumber confkey[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys))
struct EquivalenceClass * eclass[INDEX_MAX_KEYS]
pg_node_attr(custom_read_write, no_copy_equal, no_read, no_query_jumble) NodeTag type
Oid conpfeqop[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys))
List * rinfos[INDEX_MAX_KEYS]
struct EquivalenceMember * fk_eclass_member[INDEX_MAX_KEYS]
EquivalenceClass *ec pg_node_attr(copy_as_scalar, equal_as_scalar)
pg_node_attr(no_read, no_query_jumble) NodeTag type
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
Cardinality inner_rows_total
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
struct RestrictInfo * rinfo
int *indexkeys pg_node_attr(array_size(ncolumns))
bytea **opclassoptions pg_node_attr(read_write_ignore)
Oid *sortopfamily pg_node_attr(array_size(nkeycolumns))
void(* amcostestimate)(struct PlannerInfo *, struct IndexPath *, double, Cost *, Cost *, Selectivity *, double *, double *) pg_node_attr(read_write_ignore)
List *indexprs pg_node_attr(read_write_ignore)
bool *nulls_first pg_node_attr(array_size(nkeycolumns))
Oid *opcintype pg_node_attr(array_size(nkeycolumns))
RelOptInfo *rel pg_node_attr(read_write_ignore)
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
Oid *indexcollations pg_node_attr(array_size(nkeycolumns))
bool *reverse_sort pg_node_attr(array_size(nkeycolumns))
Oid *opfamily pg_node_attr(array_size(nkeycolumns))
bool *canreturn pg_node_attr(array_size(ncolumns))
ScanDirection indexscandir
Selectivity indexselectivity
Cost inner_rescan_run_cost
Cardinality inner_skip_rows
Cardinality inner_rows_total
Cardinality outer_skip_rows
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
pg_node_attr(abstract) Path path
Cardinality est_unique_keys
Selectivity rightstartsel
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
PlannerInfo *subroot pg_node_attr(read_write_ignore)
List * withCheckOptionLists
List * mergeJoinConditions
OnConflictExpr * onconflict
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
struct FmgrInfo * partsupfunc
EquivalenceClass *pk_eclass pg_node_attr(copy_as_scalar, equal_as_scalar)
pg_node_attr(no_read, no_query_jumble) NodeTag type
VolatileFunctionStatus has_volatile_expr
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
Index *sortgrouprefs pg_node_attr(array_size(exprs))
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
PathTarget *pathtarget pg_node_attr(write_only_nondefault_pathtarget)
ParamPathInfo *param_info pg_node_attr(write_only_req_outer)
RelOptInfo *parent pg_node_attr(write_only_relids)
pg_node_attr(no_read, no_query_jumble) NodeTag type
Relids phrels pg_node_attr(equal_ignore)
pg_node_attr(no_query_jumble) Expr xpr
Expr *phexpr pg_node_attr(equal_ignore)
Bitmapset * prunableRelids
PartitionDirectory partition_directory pg_node_attr(read_write_ignore)
List *subroots pg_node_attr(read_write_ignore)
void **extension_state pg_node_attr(read_write_ignore)
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
int extension_state_allocated
Bitmapset * rewindPlanIDs
List *subplanNames pg_node_attr(read_write_ignore)
struct HTAB *rel_notnullatts_hash pg_node_attr(read_write_ignore)
ParamListInfo boundParams pg_node_attr(read_write_ignore)
struct HTAB *join_rel_hash pg_node_attr(read_write_ignore)
struct RelOptInfo **simple_rel_array pg_node_attr(array_size(simple_rel_array_size))
AttrNumber *grouping_map pg_node_attr(read_write_ignore)
struct PathTarget *upper_targets[UPPERREL_FINAL+1] pg_node_attr(read_write_ignore)
void **extension_state pg_node_attr(read_write_ignore)
int simple_rel_array_size
struct AppendRelInfo **append_rel_array pg_node_attr(read_write_ignore)
Index qual_security_level
struct PlaceHolderInfo **placeholder_array pg_node_attr(read_write_ignore, array_size(placeholder_array_size))
struct Path * non_recursive_path
List **join_rel_level pg_node_attr(read_write_ignore)
MemoryContext planner_cxt pg_node_attr(read_write_ignore)
RangeTblEntry **simple_rte_array pg_node_attr(read_write_ignore)
List * processed_groupClause
List *upper_rels[UPPERREL_FINAL+1] pg_node_attr(read_write_ignore)
bool hasAlternativeSubPlans
List * right_join_clauses
List *part_schemes pg_node_attr(read_write_ignore)
List * processed_distinctClause
Cardinality total_table_pages
bool *isUsedSubplan pg_node_attr(read_write_ignore)
int extension_state_allocated
Selectivity tuple_fraction
bool *isAltSubplan pg_node_attr(read_write_ignore)
int placeholder_array_size pg_node_attr(read_write_ignore)
bool hasPseudoConstantQuals
List *initial_rels pg_node_attr(read_write_ignore)
PlannerInfo *parent_root pg_node_attr(read_write_ignore)
Relids leaf_result_relids
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
struct PathTarget * agg_input
struct PathTarget * target
struct FdwRoutine *fdwroutine pg_node_attr(read_write_ignore)
bool consider_param_startup
Bitmapset * notnullattnums
struct PathTarget * reltarget
struct PartitionBoundInfoData *boundinfo pg_node_attr(read_write_ignore)
struct RelOptInfo **part_rels pg_node_attr(read_write_ignore)
int32 *attr_widths pg_node_attr(read_write_ignore)
List **partexprs pg_node_attr(read_write_ignore)
struct RelAggInfo * agg_info
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
PartitionScheme part_scheme pg_node_attr(read_write_ignore)
int extension_state_allocated
List * cheapest_parameterized_paths
struct RelOptInfo *parent pg_node_attr(read_write_ignore)
Relids lateral_referencers
struct Path * cheapest_startup_path
QualCost baserestrictcost
Relids *attr_needed pg_node_attr(read_write_ignore)
struct Path * cheapest_total_path
struct RelOptInfo *top_parent pg_node_attr(read_write_ignore)
List * unique_groupclause
struct RelOptInfo * grouped_rel
List * non_unique_for_rels
Bitmapset * eclass_indexes
Relids direct_lateral_relids
void **extension_state pg_node_attr(read_write_ignore)
bool consider_partitionwise_join
Index baserestrict_min_security
struct RelOptInfo * unique_rel
List **nullable_partexprs pg_node_attr(read_write_ignore)
void *fdw_private pg_node_attr(read_write_ignore)
Selectivity norm_selec pg_node_attr(equal_ignore)
EquivalenceClass *parent_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore)
bool leakproof pg_node_attr(equal_ignore)
Oid hashjoinoperator pg_node_attr(equal_ignore)
Selectivity outer_selec pg_node_attr(equal_ignore)
EquivalenceClass *right_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore)
EquivalenceMember *left_em pg_node_attr(copy_as_scalar, equal_ignore)
Selectivity left_mcvfreq pg_node_attr(equal_ignore)
Relids left_relids pg_node_attr(equal_ignore)
VolatileFunctionStatus has_volatile pg_node_attr(equal_ignore)
bool can_join pg_node_attr(equal_ignore)
Selectivity right_bucketsize pg_node_attr(equal_ignore)
bool pseudoconstant pg_node_attr(equal_ignore)
Expr *orclause pg_node_attr(equal_ignore)
Relids incompatible_relids
int num_base_rels pg_node_attr(equal_ignore)
List *scansel_cache pg_node_attr(copy_as(NIL), equal_ignore, read_write_ignore)
Selectivity right_mcvfreq pg_node_attr(equal_ignore)
EquivalenceClass *left_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore)
EquivalenceMember *right_em pg_node_attr(copy_as_scalar, equal_ignore)
pg_node_attr(no_read, no_query_jumble) NodeTag type
bool outer_is_left pg_node_attr(equal_ignore)
QualCost eval_cost pg_node_attr(equal_ignore)
List *mergeopfamilies pg_node_attr(equal_ignore)
Selectivity left_bucketsize pg_node_attr(equal_ignore)
Oid right_hasheqoperator pg_node_attr(equal_ignore)
Oid left_hasheqoperator pg_node_attr(equal_ignore)
Relids clause_relids pg_node_attr(equal_ignore)
Relids right_relids pg_node_attr(equal_ignore)
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
Selectivity outer_match_frac
pg_node_attr(no_read, no_query_jumble) NodeTag type
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type
RelOptInfo *rel pg_node_attr(read_write_ignore)
pg_node_attr(no_copy_equal, no_read, no_query_jumble) NodeTag type