109 if (!
proot->has_rtoffset)
120 rtindex +
proot->rtoffset);
153 "unique semijoin found for relids %s but not observed during planning",
176 query_features =
lappend(query_features,
qf);
181 walker->query_features[t] = query_features;
214 walker->do_not_scan_identifiers =
274 walker->future_query_features =
285 if (n->plan_node_id ==
plan->plan_node_id)
426 walker->toplevel_unrolled_joins =
504 for (
int k = 0; k <
ujoin->ninner; ++k)
538 walker->future_query_features =
555 if (n->plan_node_id ==
plan->plan_node_id)
979 switch (target->
ttype)
1069 List *join_strategies =
walker->join_strategies[strategy];
1113 bool chosen =
false;
1119 if (!
proot->is_alternative_plan)
1126 if (
proot->has_rtoffset)
1128 for (
int rti = 1; rti <=
proot->rid_array_size; rti++)
1130 if (
proot->rid_array[rti - 1].alias_name !=
NULL &&
Bitmapset * bms_make_singleton(int x)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
int bms_next_member(const Bitmapset *a, int prevbit)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_copy(const Bitmapset *a)
#define Assert(condition)
#define palloc0_object(type)
List * list_delete_ptr(List *list, void *datum)
List * lappend(List *list, void *datum)
List * list_copy(const List *oldlist)
List * list_truncate(List *list, int new_size)
bool list_member(const List *list, const void *datum)
char * get_rel_name(Oid relid)
Oid get_rel_namespace(Oid relid)
char * get_namespace_name_or_temp(Oid nspid)
#define IsA(nodeptr, _type_)
void outBitmapset(StringInfo str, const Bitmapset *bms)
#define rt_fetch(rangetable_index, rangetable)
static int list_length(const List *l)
#define foreach_ptr(type, var, lst)
static void * list_nth(const List *list, int n)
#define foreach_node(type, var, lst)
static char buf[DEFAULT_XLOG_SEG_SIZE]
@ PGPA_TAG_NESTED_LOOP_MATERIALIZE
@ PGPA_TAG_MERGE_JOIN_PLAIN
@ PGPA_TAG_NESTED_LOOP_MEMOIZE
@ PGPA_TAG_SEMIJOIN_NON_UNIQUE
@ PGPA_TAG_BITMAP_HEAP_SCAN
@ PGPA_TAG_INDEX_ONLY_SCAN
@ PGPA_TAG_SEMIJOIN_UNIQUE
@ PGPA_TAG_NESTED_LOOP_PLAIN
@ PGPA_TAG_MERGE_JOIN_MATERIALIZE
@ PGPA_TARGET_UNORDERED_LIST
@ PGPA_TARGET_ORDERED_LIST
Index pgpa_compute_rti_from_identifier(int rtable_length, pgpa_identifier *rt_identifiers, pgpa_identifier *rid)
static bool strings_equal_or_both_null(const char *a, const char *b)
pgpa_unrolled_join * pgpa_build_unrolled_join(pgpa_plan_walker_context *walker, pgpa_join_unroller *join_unroller)
void pgpa_unroll_join(pgpa_plan_walker_context *walker, Plan *plan, bool beneath_any_gather, pgpa_join_unroller *join_unroller, pgpa_join_unroller **outer_join_unroller, pgpa_join_unroller **inner_join_unroller)
void pgpa_destroy_join_unroller(pgpa_join_unroller *join_unroller)
pgpa_join_unroller * pgpa_create_join_unroller(void)
@ JSTRAT_MERGE_JOIN_PLAIN
@ JSTRAT_NESTED_LOOP_MATERIALIZE
@ JSTRAT_NESTED_LOOP_MEMOIZE
@ JSTRAT_NESTED_LOOP_PLAIN
@ JSTRAT_MERGE_JOIN_MATERIALIZE
static bool pgpa_is_join(Plan *plan)
pgpa_scan * pgpa_build_scan(pgpa_plan_walker_context *walker, Plan *plan, ElidedNode *elided_node, bool beneath_any_gather, bool within_join_problem)
@ PGPA_SCAN_PARTITIONWISE
#define NUM_PGPA_SCAN_STRATEGY
static void pgpa_classify_alternative_subplans(pgpa_plan_walker_context *walker, List *proots, List **chosen_proots, List **discarded_proots)
static bool pgpa_walker_contains_feature(pgpa_plan_walker_context *walker, pgpa_qf_type type, Bitmapset *relids)
Bitmapset * pgpa_filter_out_join_relids(Bitmapset *relids, List *rtable)
static bool pgpa_walker_join_order_matches_member(pgpa_join_member *member, Index rtable_length, pgpa_identifier *rt_identifiers, pgpa_advice_target *target)
void pgpa_plan_walker(pgpa_plan_walker_context *walker, PlannedStmt *pstmt, List *proots)
Bitmapset * pgpa_relids(Plan *plan)
ElidedNode * pgpa_last_elided_node(PlannedStmt *pstmt, Plan *plan)
static pgpa_scan * pgpa_walker_find_scan(pgpa_plan_walker_context *walker, pgpa_scan_strategy strategy, Bitmapset *relids)
bool pgpa_walker_would_advise(pgpa_plan_walker_context *walker, pgpa_identifier *rt_identifiers, pgpa_advice_tag_type tag, pgpa_advice_target *target)
static bool pgpa_walker_contains_no_gather(pgpa_plan_walker_context *walker, Bitmapset *relids)
static bool pgpa_walker_contains_join(pgpa_plan_walker_context *walker, pgpa_join_strategy strategy, Bitmapset *relids)
static pgpa_query_feature * pgpa_add_feature(pgpa_plan_walker_context *walker, pgpa_qf_type type, Plan *plan)
static Bitmapset * pgpa_process_unrolled_join(pgpa_plan_walker_context *walker, pgpa_unrolled_join *ujoin)
static bool pgpa_walker_index_target_matches_plan(pgpa_index_target *itarget, Plan *plan)
static void pgpa_walk_recursively(pgpa_plan_walker_context *walker, Plan *plan, bool within_join_problem, pgpa_join_unroller *join_unroller, List *active_query_features, bool beneath_any_gather)
void pgpa_add_future_feature(pgpa_plan_walker_context *walker, pgpa_qf_type type, Plan *plan)
static bool pgpa_walker_join_order_matches(pgpa_unrolled_join *ujoin, Index rtable_length, pgpa_identifier *rt_identifiers, pgpa_advice_target *target, bool toplevel)
static void pgpa_qf_add_rtis(List *active_query_features, Bitmapset *relids)
static void pgpa_qf_add_plan_rtis(List *active_query_features, Plan *plan, List *rtable)
Index pgpa_scanrelid(Plan *plan)
static void pgpa_qf_add_rti(List *active_query_features, Index rti)
@ PGPAQF_SEMIJOIN_NON_UNIQUE
#define NUM_PGPA_QF_TYPES
void initStringInfo(StringInfo str)
pgpa_index_target * itarget
pgpa_unrolled_join * unrolled_join