28 List *other_rels_list,
37 bool only_pushed_down);
44 List *parent_restrictlist);
89 foreach(r, joinrels[level - 1])
109 List *other_rels_list;
114 other_rels_list = joinrels[level - 1];
115 other_rels =
lnext(other_rels_list, r);
119 other_rels_list = joinrels[1];
158 int other_level = level - k;
167 foreach(r, joinrels[k])
170 List *other_rels_list;
183 if (k == other_level)
186 other_rels_list = joinrels[k];
187 other_rels =
lnext(other_rels_list, r);
191 other_rels_list = joinrels[other_level];
235 if (joinrels[level] ==
NIL)
241 foreach(r, joinrels[level - 1])
268 if (joinrels[level] ==
NIL &&
271 elog(
ERROR,
"failed to build any %d-way joins", level);
299 List *other_rels_list,
337 foreach(l, other_rels)
371 bool must_be_leftjoin;
388 unique_ified =
false;
389 must_be_leftjoin =
false;
448 match_sjinfo = sjinfo;
456 match_sjinfo = sjinfo;
488 match_sjinfo = sjinfo;
500 match_sjinfo = sjinfo;
543 must_be_leftjoin =
true;
556 if (must_be_leftjoin &&
557 (match_sjinfo == NULL ||
588 if (lateral_fwd && lateral_rev)
605 else if (lateral_rev)
636 if (join_lateral_rels)
667 *sjinfo_p = match_sjinfo;
668 *reversed_p = reversed;
726 sjinfo = &sjinfo_data;
854 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
855 errmsg(
"FULL JOIN is only supported with merge-joinable or hash-joinable join conditions")));
1142 &sjinfo, &reversed))
1306 bool only_pushed_down)
1316 foreach(lc, restrictlist)
1360 List *parent_restrictlist)
1416 for (cnt_parts = 0; cnt_parts < joinrel->
nparts; cnt_parts++)
1423 List *child_restrictlist;
1433 lcr1 =
lnext(parts1, lcr1);
1434 lcr2 =
lnext(parts2, lcr2);
1438 child_rel1 = rel1->
part_rels[cnt_parts];
1439 child_rel2 = rel2->
part_rels[cnt_parts];
1442 rel1_empty = (child_rel1 == NULL ||
IS_DUMMY_REL(child_rel1));
1443 rel2_empty = (child_rel2 == NULL ||
IS_DUMMY_REL(child_rel2));
1456 if (rel1_empty || rel2_empty)
1465 if (rel1_empty && rel2_empty)
1470 elog(
ERROR,
"unrecognized join type: %d",
1480 if (child_rel1 == NULL || child_rel2 == NULL)
1528 child_restrictlist =
1530 (
Node *) parent_restrictlist,
1531 nappinfos, appinfos);
1534 child_joinrel = joinrel->
part_rels[cnt_parts];
1538 joinrel, child_restrictlist,
1541 joinrel->
part_rels[cnt_parts] = child_joinrel;
1549 child_joinrel, child_sjinfo,
1550 child_restrictlist);
1567 int right_nappinfos;
1576 left_nappinfos, left_appinfos);
1581 left_nappinfos, left_appinfos);
1590 pfree(left_appinfos);
1591 pfree(right_appinfos);
1610 if (joinrel->
nparts == -1)
1649 if (boundinfo == NULL)
1660 joinrel->
nparts = nparts;
1703 for (cnt_parts = 0; cnt_parts < joinrel->
nparts; cnt_parts++)
1721 *parts1 =
lappend(*parts1, NULL);
1722 *parts2 =
lappend(*parts2, NULL);
1779 *parts1 =
lappend(*parts1, child_rel1);
1780 *parts2 =
lappend(*parts2, child_rel2);
#define IsA(nodeptr, _type_)
void add_path(RelOptInfo *parent_rel, Path *new_path)
Bitmapset * bms_copy(const Bitmapset *a)
static void populate_joinrel_with_paths(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, RelOptInfo *joinrel, SpecialJoinInfo *sjinfo, List *restrictlist)
static ListCell * lnext(const List *l, const ListCell *c)
RelOptInfo * find_join_rel(PlannerInfo *root, Relids relids)
#define for_each_cell(cell, lst, initcell)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
bool have_join_order_restriction(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
int errcode(int sqlerrcode)
UniquePath * create_unique_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, SpecialJoinInfo *sjinfo)
#define IS_SIMPLE_REL(rel)
static SpecialJoinInfo * build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, Relids left_relids, Relids right_relids)
void pfree(void *pointer)
static bool has_legal_joinclause(PlannerInfo *root, RelOptInfo *rel)
static bool has_join_restriction(PlannerInfo *root, RelOptInfo *rel)
Relids min_join_parameterization(PlannerInfo *root, Relids joinrelids, RelOptInfo *outer_rel, RelOptInfo *inner_rel)
RelOptInfo * build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel, RelOptInfo *inner_rel, RelOptInfo *parent_joinrel, List *restrictlist, SpecialJoinInfo *sjinfo, JoinType jointype)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
#define lfirst_node(type, lc)
static bool join_is_legal(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, Relids joinrelids, SpecialJoinInfo **sjinfo_p, bool *reversed_p)
int bms_num_members(const Bitmapset *a)
struct Path * cheapest_total_path
static void get_matching_part_pairs(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *rel1, RelOptInfo *rel2, List **parts1, List **parts2)
AppendPath * create_append_path(PlannerInfo *root, RelOptInfo *rel, List *subpaths, List *partial_subpaths, List *pathkeys, Relids required_outer, int parallel_workers, bool parallel_aware, double rows)
void check_stack_depth(void)
static ListCell * list_head(const List *l)
static void make_rels_by_clauseless_joins(PlannerInfo *root, RelOptInfo *old_rel, List *other_rels)
void join_search_one_level(PlannerInfo *root, int level)
List * lappend(List *list, void *datum)
AppendRelInfo ** find_appinfos_by_relids(PlannerInfo *root, Relids relids, int *nappinfos)
Relids lateral_referencers
static void make_rels_by_clause_joins(PlannerInfo *root, RelOptInfo *old_rel, List *other_rels_list, ListCell *other_rels)
void set_cheapest(RelOptInfo *parent_rel)
RelOptInfo * make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
Relids direct_lateral_relids
bool consider_partitionwise_join
void * palloc0(Size size)
void mark_dummy_rel(RelOptInfo *rel)
int bms_singleton_member(const Bitmapset *a)
Bitmapset * bms_intersect(const Bitmapset *a, const Bitmapset *b)
struct PartitionBoundInfoData * boundinfo
RelOptInfo * build_join_rel(PlannerInfo *root, Relids joinrelids, RelOptInfo *outer_rel, RelOptInfo *inner_rel, SpecialJoinInfo *sjinfo, List **restrictlist_ptr)
#define RINFO_IS_PUSHED_DOWN(rinfo, joinrelids)
static bool restriction_is_constant_false(List *restrictlist, RelOptInfo *joinrel, bool only_pushed_down)
#define ereport(elevel,...)
void bms_free(Bitmapset *a)
#define IS_DUMMY_APPEND(p)
#define Assert(condition)
static void try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, RelOptInfo *joinrel, SpecialJoinInfo *parent_sjinfo, List *parent_restrictlist)
bool is_dummy_rel(RelOptInfo *rel)
struct FmgrInfo * partsupfunc
struct RelOptInfo ** part_rels
Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b)
static int list_length(const List *l)
static void compute_partition_bounds(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, RelOptInfo *joinrel, SpecialJoinInfo *parent_sjinfo, List **parts1, List **parts2)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
int errmsg(const char *fmt,...)
bool partition_bounds_equal(int partnatts, int16 *parttyplen, bool *parttypbyval, PartitionBoundInfo b1, PartitionBoundInfo b2)
#define IS_PARTITIONED_REL(rel)
Relids adjust_child_relids(Relids relids, int nappinfos, AppendRelInfo **appinfos)
#define REL_HAS_ALL_PART_PROPS(rel)
bool have_relevant_joinclause(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, SpecialJoinInfo *sjinfo, List *restrictlist)
PartitionScheme part_scheme
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
PartitionBoundInfo partition_bounds_merge(int partnatts, FmgrInfo *partsupfunc, Oid *partcollation, RelOptInfo *outer_rel, RelOptInfo *inner_rel, JoinType jointype, List **outer_parts, List **inner_parts)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Datum subpath(PG_FUNCTION_ARGS)
bool have_dangerous_phv(PlannerInfo *root, Relids outer_relids, Relids inner_params)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
Node * adjust_appendrel_attrs(PlannerInfo *root, Node *node, int nappinfos, AppendRelInfo **appinfos)
static MemoryContext GetMemoryChunkContext(void *pointer)