103 if (
ur->plan_name !=
NULL)
109 rtoffset =
rtinfo->rtoffset;
116 elog(
ERROR,
"no rtoffset for plan %s",
ur->plan_name);
158 "unique semijoin found for relids %s but not observed during planning",
181 query_features =
lappend(query_features,
qf);
186 walker->query_features[t] = query_features;
243 walker->future_query_features =
254 if (n->plan_node_id ==
plan->plan_node_id)
395 walker->toplevel_unrolled_joins =
473 for (
int k = 0; k <
ujoin->ninner; ++k)
507 walker->future_query_features =
524 if (n->plan_node_id ==
plan->plan_node_id)
920 switch (target->
ttype)
1010 List *join_strategies =
walker->join_strategies[strategy];
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)
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)
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
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)
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)
void pgpa_plan_walker(pgpa_plan_walker_context *walker, PlannedStmt *pstmt, List *sj_unique_rels)
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