65 if (!
root->ec_merging_done)
66 elog(
ERROR,
"too soon to build canonical pathkeys");
72 foreach(
lc,
root->canon_pathkeys)
76 opfamily ==
pk->pk_opfamily &&
77 cmptype ==
pk->pk_cmptype &&
78 nulls_first ==
pk->pk_nulls_first)
90 pk->pk_opfamily = opfamily;
91 pk->pk_cmptype = cmptype;
92 pk->pk_nulls_first = nulls_first;
169 foreach(
lc, pathkeys)
227 elog(
ERROR,
"missing operator %d(%u,%u) in opfamily %u",
231 elog(
ERROR,
"could not find opfamilies for equality operator %u",
245 cmptype, nulls_first);
271 &opfamily, &opcintype, &cmptype))
272 elog(
ERROR,
"operator %u is not a valid ordering operator",
371 List **group_clauses,
372 int num_groupby_pathkeys)
380 if (pathkeys ==
NIL || *group_pathkeys ==
NIL)
403 foreach(
lc, pathkeys)
415 pathkey->pk_eclass->ec_sortref == 0)
473 List *pathkeys =
root->group_pathkeys;
474 List *clauses =
root->processed_groupClause;
493 if (
parse->groupingSets)
507 root->num_groupby_pathkeys);
521#ifdef USE_ASSERT_CHECKING
544 Assert(
pk->pk_eclass->ec_sortref ==
sgc->tleSortGroupRef);
764 if (
i >=
index->nkeycolumns)
772 reverse_sort = !
index->reverse_sort[
i];
773 nulls_first = !
index->nulls_first[
i];
777 reverse_sort =
index->reverse_sort[
i];
778 nulls_first =
index->nulls_first[
i];
788 index->indexcollations[
i],
864 if (rinfo->pseudoconstant)
1014 &opfamily, &opcintype, &cmptype))
1015 elog(
ERROR,
"operator %u is not a valid ordering operator",
1080 elog(
ERROR,
"volatile EquivalenceClass has no sortref");
1484 ((
OpExpr *) clause)->inputcollid,
1493 ((
OpExpr *) clause)->inputcollid,
1559 foreach(
i, pathkeys)
1609 rinfo->left_ec : rinfo->right_ec;
1629 return mergeclauses;
1683 foreach(
lc, mergeclauses)
1693 if (rinfo->outer_is_left)
1717 if (!
em->em_is_const &&
1735 if (
root->query_pathkeys)
1739 foreach(
lc,
root->query_pathkeys)
1760 foreach(
lc,
root->query_pathkeys)
1872 foreach(
lc, mergeclauses)
1881 if (rinfo->outer_is_left)
1897 elog(
ERROR,
"too few pathkeys for mergeclauses");
1902 elog(
ERROR,
"outer pathkeys do not match mergeclause");
1973 if (pathkeys ==
NIL)
1983 foreach(
i, mergeclauses)
1992 rinfo->right_ec : rinfo->left_ec;
2061 foreach(
i, pathkeys)
2064 bool matched =
false;
2127 foreach(l,
root->query_pathkeys)
2295 if (
root->query_pathkeys !=
NIL)
Bitmapset * bms_make_singleton(int x)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
#define Assert(condition)
#define OidIsValid(objectId)
bool enable_incremental_sort
bool equal(const void *a, const void *b)
EquivalenceClass * get_eclass_for_sort_expr(PlannerInfo *root, Expr *expr, List *opfamilies, Oid opcintype, Oid collation, Index sortref, Relids rel, bool create_it)
Expr * canonicalize_ec_expression(Expr *expr, Oid req_type, Oid req_collation)
bool eclass_useful_for_merging(PlannerInfo *root, EquivalenceClass *eclass, RelOptInfo *rel)
bool indexcol_is_bool_constant_for_query(PlannerInfo *root, IndexOptInfo *index, int indexcol)
List * list_difference(const List *list1, const List *list2)
List * lappend(List *list, void *datum)
List * list_difference_ptr(const List *list1, const List *list2)
List * list_concat_unique_ptr(List *list1, const List *list2)
List * list_concat(List *list1, const List *list2)
List * list_copy(const List *oldlist)
bool list_member_ptr(const List *list, const void *datum)
void list_free(List *list)
List * list_copy_head(const List *oldlist, int len)
bool get_ordering_op_properties(Oid opno, Oid *opfamily, Oid *opcintype, CompareType *cmptype)
Oid get_opfamily_member_for_cmptype(Oid opfamily, Oid lefttype, Oid righttype, CompareType cmptype)
List * get_mergejoin_opfamilies(Oid opno)
void op_input_types(Oid opno, Oid *lefttype, Oid *righttype)
void pfree(void *pointer)
Oid exprCollation(const Node *expr)
static Node * get_rightop(const void *clause)
static bool is_notclause(const void *clause)
static Expr * get_notclausearg(const void *notclause)
static Node * get_leftop(const void *clause)
#define IsA(nodeptr, _type_)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
bool partitions_are_ordered(PartitionBoundInfo boundinfo, Bitmapset *live_parts)
static bool matches_boolean_partition_clause(RestrictInfo *rinfo, RelOptInfo *partrel, int partkeycol)
PathKey * make_canonical_pathkey(PlannerInfo *root, EquivalenceClass *eclass, Oid opfamily, CompareType cmptype, bool nulls_first)
List * truncate_useless_pathkeys(PlannerInfo *root, RelOptInfo *rel, List *pathkeys)
Path * get_cheapest_fractional_path_for_pathkeys(List *paths, List *pathkeys, Relids required_outer, double fraction)
static bool right_merge_direction(PlannerInfo *root, PathKey *pathkey)
List * append_pathkeys(List *target, List *source)
Path * get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, Relids required_outer, CostSelector cost_criterion, bool require_parallel_safe)
bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common)
List * make_inner_pathkeys_for_merge(PlannerInfo *root, List *mergeclauses, List *outer_pathkeys)
static PathKey * make_pathkey_from_sortop(PlannerInfo *root, Expr *expr, Oid ordering_op, bool reverse_sort, bool nulls_first, Index sortref, bool create_it)
static int group_keys_reorder_by_pathkeys(List *pathkeys, List **group_pathkeys, List **group_clauses, int num_groupby_pathkeys)
bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel)
List * build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index, ScanDirection scandir)
List * find_mergeclauses_for_outer_pathkeys(PlannerInfo *root, List *pathkeys, List *restrictinfos)
static int count_common_leading_pathkeys_ordered(List *keys1, List *keys2)
void update_mergeclause_eclasses(PlannerInfo *root, RestrictInfo *restrictinfo)
List * make_pathkeys_for_sortclauses(PlannerInfo *root, List *sortclauses, List *tlist)
static Var * find_var_for_subquery_tle(RelOptInfo *rel, TargetEntry *tle)
List * trim_mergeclauses_for_inner_pathkeys(PlannerInfo *root, List *mergeclauses, List *pathkeys)
static bool partkey_is_bool_constant_for_query(RelOptInfo *partrel, int partkeycol)
bool enable_group_by_reordering
List * build_expression_pathkey(PlannerInfo *root, Expr *expr, Oid opno, Relids rel, bool create_it)
static bool pathkey_is_redundant(PathKey *new_pathkey, List *pathkeys)
List * build_partition_pathkeys(PlannerInfo *root, RelOptInfo *partrel, ScanDirection scandir, bool *partialkeys)
List * select_outer_pathkeys_for_merge(PlannerInfo *root, List *mergeclauses, RelOptInfo *joinrel)
static int count_common_leading_pathkeys_unordered(List *keys1, List *keys2)
List * convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel, List *subquery_pathkeys, List *subquery_tlist)
static int pathkeys_useful_for_merging(PlannerInfo *root, RelOptInfo *rel, List *pathkeys)
List * make_pathkeys_for_sortclauses_extended(PlannerInfo *root, List **sortclauses, List *tlist, bool remove_redundant, bool remove_group_rtindex, bool *sortable, bool set_ec_sortref)
void initialize_mergeclause_eclasses(PlannerInfo *root, RestrictInfo *restrictinfo)
bool pathkeys_contained_in(List *keys1, List *keys2)
List * build_join_pathkeys(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, List *outer_pathkeys)
PathKeysComparison compare_pathkeys(List *keys1, List *keys2)
Path * get_cheapest_parallel_safe_total_inner(List *paths)
static PathKey * make_pathkey_from_sortinfo(PlannerInfo *root, Expr *expr, Oid opfamily, Oid opcintype, Oid collation, bool reverse_sort, bool nulls_first, Index sortref, Relids rel, bool create_it)
List * get_useful_group_keys_orderings(PlannerInfo *root, Path *path)
int compare_fractional_path_costs(Path *path1, Path *path2, double fraction)
int compare_path_costs(Path *path1, Path *path2, CostSelector criterion)
#define EC_MUST_BE_REDUNDANT(eclass)
#define IS_SIMPLE_REL(rel)
#define PATH_REQ_OUTER(path)
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define linitial_node(type, l)
#define forboth(cell1, list1, cell2, list2)
#define foreach_current_index(var_or_cell)
#define foreach_delete_current(lst, var_or_cell)
#define for_each_from(cell, lst, N)
static void * list_nth(const List *list, int n)
#define foreach_node(type, var, lst)
static ListCell * list_head(const List *l)
static ListCell * lnext(const List *l, const ListCell *c)
static rewind_source * source
static struct cvec * eclass(struct vars *v, chr c, int cases)
Node * remove_nulling_relids(Node *node, const Bitmapset *removable_relids, const Bitmapset *except_relids)
#define ScanDirectionIsBackward(direction)
struct PathTarget * reltarget
SortGroupClause * get_sortgroupref_clause_noerr(Index sortref, List *clauses)
TargetEntry * get_sortgroupref_tle(Index sortref, List *targetList)
Node * get_sortgroupclause_expr(SortGroupClause *sgClause, List *targetList)