40#define IndexCollMatchesExprColl(idxcollation, exprcollation) \
41 ((idxcollation) == InvalidOid || (idxcollation) == (exprcollation))
194 int indexcol,
Expr *clause,
Oid pk_opfamily);
469 for (indexcol = 0; indexcol <
index->nkeycolumns; indexcol++)
625 for (indexcol = 0; indexcol <
index->nkeycolumns; indexcol++)
694 if (rinfo->parent_ec == parent_ec &&
750 if (
index->amhasgettuple)
753 if (
index->amhasgetbitmap &&
755 ipath->indexselectivity < 1.0))
838 if (!
index->amhasgettuple)
842 if (!
index->amhasgetbitmap)
864 for (indexcol = 0; indexcol <
index->nkeycolumns; indexcol++)
890 rinfo->clause_relids);
985 if (
index->amcanparallel &&
1004 if (
ipath->path.parallel_workers > 0)
1035 if (
index->amcanparallel &&
1054 if (
ipath->path.parallel_workers > 0)
1107 if (!
index->amhasgetbitmap)
1277 bool matched =
false;
1325 opno = clause->
opno;
1392 if (!
index->amhasgetbitmap || !
index->amsearcharray)
1395 for (colnum = 0; colnum <
index->nkeycolumns; colnum++)
1402 matches[
i].inputcollid = clause->inputcollid;
1442 for (
i = 1;
i < n;
i++)
1467 for (
i = 1;
i <= n;
i++)
1518 rinfo->pseudoconstant,
1642 foreach(
lc, clauses)
1752 pathlist =
lappend(pathlist, bitmapqual);
1762 if (pathlist !=
NIL)
1765 result =
lappend(result, bitmapqual);
2030 bpath.path.parent = rel;
2040 bpath.path.parallel_workers = 0;
2044 bpath.path.param_info,
2049 return bpath.path.total_cost;
2093 result->
path = path;
2161 foreach(l,
apath->bitmapquals)
2171 foreach(l,
opath->bitmapquals)
2181 foreach(l,
ipath->indexclauses)
2262 foreach(
lc,
index->indrestrictinfo)
2273 for (
i = 0;
i <
index->ncolumns;
i++)
2275 int attno =
index->indexkeys[
i];
2332 if (outer_relids ==
NULL)
2364 if (result == 0.0 || result > rowcount)
2368 return (result > 0.0) ? result : 1.0;
2386 foreach(
lc,
root->join_info_list)
2425 double rowcount = 1.0;
2434 if (relid >=
root->simple_rel_array_size)
2436 rel =
root->simple_rel_array[relid];
2449 rowcount *= rel->
rows;
2521 if (!
index->rel->has_eclass_joins)
2524 for (indexcol = 0; indexcol <
index->nkeycolumns; indexcol++)
2531 arg.indexcol = indexcol;
2536 index->rel->lateral_referencers);
2560 foreach(
lc, clauses)
2599 if (rinfo->pseudoconstant)
2610 for (indexcol = 0; indexcol <
index->nkeycolumns; indexcol++)
2729 opfamily =
index->opfamily[indexcol];
2766 if (!
nt->argisrow &&
2932 opfamily =
index->opfamily[indexcol];
3042 foreach(
lc, clause->
args)
3084 req.funcid = funcid;
3086 req.indexarg = indexarg;
3088 req.indexcol = indexcol;
3089 req.opfamily =
index->opfamily[indexcol];
3090 req.indexcollation =
index->indexcollations[indexcol];
3112 indexquals =
lappend(indexquals,
3117 iclause->indexquals = indexquals;
3159 opfamily =
index->opfamily[indexcol];
3222 opfamily =
index->opfamily[indexcol];
3316 if (!
index->amsearcharray)
3417 inputcollid !=
subClause->inputcollid ||
3573 for (
i = 0;
i <
index->nkeycolumns;
i++)
3577 index->opfamily[
i]) == op_strategy &&
3583 if (
i >=
index->nkeycolumns)
3641 elog(
ERROR,
"unexpected strategy number %d", op_strategy);
3654 elog(
ERROR,
"missing operator %d(%u,%u) in opfamily %u",
3655 op_strategy, lefttype, righttype, opfam);
3726 if (!
index->amcanorderbyop)
3729 foreach(
lc1, pathkeys)
3742 if (
pathkey->pk_eclass->ec_has_volatile)
3754 index->rel->relids);
3771 for (indexcol = 0; indexcol <
index->nkeycolumns; indexcol++)
3843 opfamily =
index->opfamily[indexcol];
3892 if (sortfamily != pk_opfamily)
4060 if (!
index->amoptionalkey)
4072 index->indpred,
false))
4146 List *restrictlist,
List **extra_clauses)
4192 if (restrictlist ==
NIL)
4210 if (!
ind->unique || !
ind->immediate ||
ind->indpred !=
NIL)
4217 for (
c = 0;
c <
ind->nkeycolumns;
c++)
4221 foreach(
lc, restrictlist)
4242 if (rinfo->outer_is_left)
4262 exprs =
lappend(exprs, rinfo);
4275 if (
c ==
ind->nkeycolumns)
4278 *extra_clauses = exprs;
4314 foreach(
lc,
index->rel->baserestrictinfo)
4323 if (rinfo->pseudoconstant)
4386 if (operand &&
IsA(operand,
Var) &&
4387 index->rel->relid == ((
Var *) operand)->varno &&
4388 indkey == ((
Var *) operand)->varattno &&
4389 ((
Var *) operand)->varnullingrels ==
NULL)
4404 for (
i = 0;
i < indexcol;
i++)
4406 if (
index->indexkeys[
i] == 0)
4409 elog(
ERROR,
"wrong number of index expressions");
4414 elog(
ERROR,
"wrong number of index expressions");
void create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel, Path *bitmapqual)
Bitmapset * bms_difference(const Bitmapset *a, const Bitmapset *b)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
BMS_Comparison bms_subset_compare(const Bitmapset *a, const Bitmapset *b)
int bms_next_member(const Bitmapset *a, int prevbit)
Bitmapset * bms_del_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_del_member(Bitmapset *a, int x)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
void bms_free(Bitmapset *a)
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_union(const Bitmapset *a, const Bitmapset *b)
BMS_Membership bms_membership(const Bitmapset *a)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_copy(const Bitmapset *a)
#define Assert(condition)
#define MemSet(start, val, len)
#define OidIsValid(objectId)
bool contain_mutable_functions(Node *clause)
ScalarArrayOpExpr * make_SAOP_expr(Oid oper, Node *leftexpr, Oid coltype, Oid arraycollid, Oid inputcollid, List *exprs, bool haveNonConst)
bool contain_volatile_functions(Node *clause)
void cost_bitmap_tree_node(Path *path, Cost *cost, Selectivity *selec)
void cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *param_info, Path *bitmapqual, double loop_count)
bool enable_indexonlyscan
bool equal(const void *a, const void *b)
void setup_eclass_member_iterator(EquivalenceMemberIterator *it, EquivalenceClass *ec, Relids child_relids)
List * generate_implied_equalities_for_column(PlannerInfo *root, RelOptInfo *rel, ec_matches_callback_type callback, void *callback_arg, Relids prohibited_rels)
EquivalenceMember * eclass_member_iterator_next(EquivalenceMemberIterator *it)
List * generate_join_implied_equalities(PlannerInfo *root, Relids join_relids, Relids outer_relids, RelOptInfo *inner_rel, SpecialJoinInfo *sjinfo)
#define palloc_object(type)
#define palloc_array(type, count)
#define OidFunctionCall1(functionId, arg1)
static bool IsBooleanOpfamily(Oid opfamily)
static Path * choose_bitmap_and(PlannerInfo *root, RelOptInfo *rel, List *paths)
static Cost bitmap_and_cost_est(PlannerInfo *root, RelOptInfo *rel, List *paths)
static void find_indexpath_quals(Path *bitmapqual, List **quals, List **preds)
static void get_join_index_paths(PlannerInfo *root, RelOptInfo *rel, IndexOptInfo *index, IndexClauseSet *rclauseset, IndexClauseSet *jclauseset, IndexClauseSet *eclauseset, List **bitindexpaths, Relids relids, List **considered_relids)
static int or_arg_index_match_cmp(const void *a, const void *b)
static void match_clause_to_index(PlannerInfo *root, RestrictInfo *rinfo, IndexOptInfo *index, IndexClauseSet *clauseset)
bool is_pseudo_constant_for_index(PlannerInfo *root, Node *expr, IndexOptInfo *index)
static bool eclass_already_used(EquivalenceClass *parent_ec, Relids oldrelids, List *indexjoinclauses)
static void match_join_clauses_to_index(PlannerInfo *root, RelOptInfo *rel, IndexOptInfo *index, IndexClauseSet *clauseset, List **joinorclauses)
static IndexClause * match_saopclause_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index)
static bool check_index_only(RelOptInfo *rel, IndexOptInfo *index)
static void match_eclass_clauses_to_index(PlannerInfo *root, IndexOptInfo *index, IndexClauseSet *clauseset)
static PathClauseUsage * classify_index_clause_usage(Path *path, List **clauselist)
static void get_index_paths(PlannerInfo *root, RelOptInfo *rel, IndexOptInfo *index, IndexClauseSet *clauses, List **bitindexpaths)
Node * strip_phvs_in_index_operand(Node *operand)
void check_index_predicates(PlannerInfo *root, RelOptInfo *rel)
static List * build_index_paths(PlannerInfo *root, RelOptInfo *rel, IndexOptInfo *index, IndexClauseSet *clauses, bool useful_predicate, ScanTypeControl scantype, bool *skip_nonnative_saop)
static void match_pathkeys_to_index(IndexOptInfo *index, List *pathkeys, List **orderby_clauses_p, List **clause_columns_p)
static int find_list_position(Node *node, List **nodelist)
static void match_clauses_to_index(PlannerInfo *root, List *clauses, IndexOptInfo *index, IndexClauseSet *clauseset)
static double get_loop_count(PlannerInfo *root, Index cur_relid, Relids outer_relids)
static void consider_index_join_outer_rels(PlannerInfo *root, RelOptInfo *rel, IndexOptInfo *index, IndexClauseSet *rclauseset, IndexClauseSet *jclauseset, IndexClauseSet *eclauseset, List **bitindexpaths, List *indexjoinclauses, int considered_clauses, List **considered_relids)
void create_index_paths(PlannerInfo *root, RelOptInfo *rel)
static double adjust_rowcount_for_semijoins(PlannerInfo *root, Index cur_relid, Index outer_relid, double rowcount)
static IndexClause * match_clause_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index)
static bool ec_member_matches_indexcol(PlannerInfo *root, RelOptInfo *rel, EquivalenceClass *ec, EquivalenceMember *em, void *arg)
static IndexClause * get_index_clause_from_support(PlannerInfo *root, RestrictInfo *rinfo, Oid funcid, int indexarg, int indexcol, IndexOptInfo *index)
#define IndexCollMatchesExprColl(idxcollation, exprcollation)
static IndexClause * match_orclause_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index)
static IndexClause * match_opclause_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index)
static Cost bitmap_scan_cost_est(PlannerInfo *root, RelOptInfo *rel, Path *ipath)
bool match_index_to_operand(Node *operand, int indexcol, IndexOptInfo *index)
static IndexClause * match_boolean_index_clause(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index)
static void consider_index_join_clauses(PlannerInfo *root, RelOptInfo *rel, IndexOptInfo *index, IndexClauseSet *rclauseset, IndexClauseSet *jclauseset, IndexClauseSet *eclauseset, List **bitindexpaths)
static int or_arg_index_match_cmp_group(const void *a, const void *b)
static Node * strip_phvs_in_index_operand_mutator(Node *node, void *context)
static IndexClause * expand_indexqual_rowcompare(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index, Oid expr_op, bool var_on_left)
static void match_restriction_clauses_to_index(PlannerInfo *root, IndexOptInfo *index, IndexClauseSet *clauseset)
static IndexClause * match_rowcompare_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index)
static List * build_paths_for_OR(PlannerInfo *root, RelOptInfo *rel, List *clauses, List *other_clauses)
bool indexcol_is_bool_constant_for_query(PlannerInfo *root, IndexOptInfo *index, int indexcol)
static IndexClause * match_funcclause_to_indexcol(PlannerInfo *root, RestrictInfo *rinfo, int indexcol, IndexOptInfo *index)
static int path_usage_comparator(const void *a, const void *b)
static bool contain_strippable_phv_walker(Node *node, void *context)
static List * group_similar_or_args(PlannerInfo *root, RelOptInfo *rel, RestrictInfo *rinfo)
static double approximate_joinrel_size(PlannerInfo *root, Relids relids)
static Expr * match_clause_to_ordering_op(IndexOptInfo *index, int indexcol, Expr *clause, Oid pk_opfamily)
bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel, List *restrictlist, List **extra_clauses)
static List * generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel, List *clauses, List *other_clauses)
static List * make_bitmap_paths_for_or_group(PlannerInfo *root, RelOptInfo *rel, RestrictInfo *ri, List *other_clauses)
List * lappend(List *list, void *datum)
List * list_delete(List *list, void *datum)
List * list_append_unique(List *list, void *datum)
List * list_concat(List *list1, const List *list2)
List * list_concat_copy(const List *list1, const List *list2)
List * list_copy(const List *oldlist)
List * lappend_int(List *list, int datum)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
bool list_member_oid(const List *list, Oid datum)
List * list_truncate(List *list, int new_size)
bool list_member(const List *list, const void *datum)
List * list_copy_head(const List *oldlist, int len)
List * list_append_unique_ptr(List *list, void *datum)
void get_op_opfamily_properties(Oid opno, Oid opfamily, bool ordering_op, int *strategy, Oid *lefttype, Oid *righttype)
Oid get_op_opfamily_sortfamily(Oid opno, Oid opfamily)
RegProcedure get_func_support(Oid funcid)
int get_op_opfamily_strategy(Oid opno, Oid opfamily)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
Oid get_array_type(Oid typid)
bool op_in_opfamily(Oid opno, Oid opfamily)
Oid get_commutator(Oid opno)
Expr * make_orclause(List *orclauses)
Node * makeBoolConst(bool value, bool isnull)
Expr * make_opclause(Oid opno, Oid opresulttype, bool opretset, Expr *leftop, Expr *rightop, Oid opcollid, Oid inputcollid)
void pfree(void *pointer)
Oid exprType(const Node *expr)
void set_opfuncid(OpExpr *opexpr)
#define expression_tree_mutator(n, m, c)
static bool is_andclause(const void *clause)
static Node * get_rightop(const void *clause)
static bool is_opclause(const void *clause)
#define expression_tree_walker(n, w, c)
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_)
#define castNode(_type_, nodeptr)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
List * truncate_useless_pathkeys(PlannerInfo *root, RelOptInfo *rel, List *pathkeys)
bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel)
List * build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index, ScanDirection scandir)
BitmapAndPath * create_bitmap_and_path(PlannerInfo *root, RelOptInfo *rel, List *bitmapquals)
IndexPath * create_index_path(PlannerInfo *root, IndexOptInfo *index, List *indexclauses, List *indexorderbys, List *indexorderbycols, List *pathkeys, ScanDirection indexscandir, bool indexonly, Relids required_outer, double loop_count, bool partial_path)
void add_partial_path(RelOptInfo *parent_rel, Path *new_path)
BitmapOrPath * create_bitmap_or_path(PlannerInfo *root, RelOptInfo *rel, List *bitmapquals)
BitmapHeapPath * create_bitmap_heap_path(PlannerInfo *root, RelOptInfo *rel, Path *bitmapqual, Relids required_outer, double loop_count, int parallel_degree)
void add_path(RelOptInfo *parent_rel, Path *new_path)
#define IS_SIMPLE_REL(rel)
#define PATH_REQ_OUTER(path)
@ RELOPT_OTHER_MEMBER_REL
#define lfirst_node(type, lc)
static int list_length(const List *l)
static Oid list_nth_oid(const List *list, int n)
#define list_make1_oid(x1)
#define forthree(cell1, list1, cell2, list2, cell3, list3)
static void * list_nth(const List *list, int n)
static ListCell * list_head(const List *l)
static ListCell * lnext(const List *l, const ListCell *c)
#define list_make1_int(x1)
#define list_make2(x1, x2)
#define qsort(a, b, c, d)
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
bool predicate_implied_by(List *predicate_list, List *clause_list, bool weak)
PlanRowMark * get_plan_rowmark(List *rowmarks, Index rtindex)
Relids find_childrel_parents(PlannerInfo *root, RelOptInfo *rel)
bool restriction_is_or_clause(RestrictInfo *restrictinfo)
bool restriction_is_securely_promotable(RestrictInfo *restrictinfo, RelOptInfo *rel)
RestrictInfo * make_plain_restrictinfo(PlannerInfo *root, Expr *clause, Expr *orclause, bool is_pushed_down, bool has_clone, bool is_clone, bool pseudoconstant, Index security_level, Relids required_relids, Relids incompatible_relids, Relids outer_relids)
bool join_clause_is_movable_to(RestrictInfo *rinfo, RelOptInfo *baserel)
RestrictInfo * commute_restrictinfo(RestrictInfo *rinfo, Oid comm_op)
#define make_simple_restrictinfo(root, clause)
double estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows, List **pgset, EstimationInfo *estinfo)
#define BTGreaterStrategyNumber
#define BTLessStrategyNumber
#define BTLessEqualStrategyNumber
#define BTGreaterEqualStrategyNumber
List * indexclauses[INDEX_MAX_KEYS]
struct PathTarget * reltarget
Relids incompatible_relids
#define FirstLowInvalidHeapAttributeNumber
#define FirstNormalObjectId
bool contain_var_clause(Node *node)
Relids pull_varnos(PlannerInfo *root, Node *node)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)