157 List *source_stepids,
253 foreach(
lc, subpaths)
360 pruneinfo->other_subplans = other_subplans;
478 List *initial_pruning_steps;
479 List *exec_pruning_steps;
572 initial_pruning_steps = context.
steps;
574 initial_pruning_steps =
NIL;
592 exec_pruning_steps = context.
steps;
602 exec_pruning_steps =
NIL;
607 exec_pruning_steps =
NIL;
611 if (initial_pruning_steps || exec_pruning_steps)
649 int *leafpart_rti_map;
657 subplan_map = (
int *)
palloc(nparts *
sizeof(
int));
658 memset(subplan_map, -1, nparts *
sizeof(
int));
659 subpart_map = (
int *)
palloc(nparts *
sizeof(
int));
660 memset(subpart_map, -1, nparts *
sizeof(
int));
662 leafpart_rti_map = (
int *)
palloc0(nparts *
sizeof(
int));
663 present_parts =
NULL;
697 if (partrel->
nparts == -1)
698 leafpart_rti_map[
i] = (
int) partrel->
relid;
717 pinfo->subplan_map = subplan_map;
718 pinfo->subpart_map = subpart_map;
720 pinfo->leafpart_rti_map = leafpart_rti_map;
816 context.
strategy = rel->part_scheme->strategy;
817 context.
partnatts = rel->part_scheme->partnatts;
821 context.
partsupfunc = rel->part_scheme->partsupfunc;
885 results[step->step_id] =
892 elog(
ERROR,
"invalid pruning step type: %d",
1021 foreach(
lc, clauses)
1032 (((
Const *) clause)->constisnull ||
1288 false,
NIL,
NIL, nullkeys);
1360 opstep->nullkeys = nullkeys;
1376 List *source_stepids,
1382 cstep->combineOp = combineOp;
1383 cstep->source_stepids = source_stepids;
1480 elog(
ERROR,
"invalid clause for hash partitioning");
1486 elog(
ERROR,
"invalid partition strategy: %c",
1574 for (keyno = 0; keyno <
pc->keyno; keyno++)
1586 if (
eqpc->keyno == keyno)
1611 if (
lepc->keyno == keyno)
1637 if (
gepc->keyno == keyno)
1767 elog(
ERROR,
"invalid partition strategy: %c",
1784#define PartCollMatchesExprColl(partcoll, exprcoll) \
1785 ((partcoll) == InvalidOid || (partcoll) == (exprcoll))
2148 elog(
ERROR,
"invalid partition strategy: %c",
2227 &lefttype, &righttype);
2330 if (arr->constisnull)
2335 &
elemlen, &elembyval, &elemalign);
2338 elemlen, elembyval, elemalign,
2339 &elem_values, &elem_nulls,
2341 for (
i = 0;
i < num_elems;
i++)
2359 elem_values[
i],
false, elembyval);
2647 Assert(context->
rel->part_scheme->strategy
2650 context->
rel->part_scheme->partnatts);
2734 for (
i = 0;
i < partnatts;
i++)
2792 bool inclusive =
false;
2808 result->scan_null =
true;
2825 maxoff = boundinfo->
ndatums - 1;
2924 if (off > boundinfo->
ndatums - 1)
2938 if (off >= 0 &&
is_equal && !inclusive)
2954 elog(
ERROR,
"invalid strategy number %d", opstrategy);
2958 Assert(minoff >= 0 && maxoff >= 0);
3006 bool inclusive =
false;
3009 Assert(nvalues <= partnatts);
3052 if (nvalues < partnatts)
3067 if (nvalues == partnatts)
3096 boundinfo->
datums[off - 1],
3097 boundinfo->
kind[off - 1],
3108 boundinfo->
kind[off],
3119 if (boundinfo->
kind[off][nvalues] ==
3136 boundinfo->
datums[off + 1],
3137 boundinfo->
kind[off + 1],
3148 boundinfo->
kind[off],
3158 Assert(minoff >= 0 && maxoff >= 0);
3201 if (
is_equal && nvalues < partnatts)
3221 nextoff = inclusive ? off - 1 : off + 1;
3238 boundinfo->
kind[off],
3241 minoff = inclusive ? off : off + 1;
3277 if (
is_equal && nvalues < partnatts)
3284 nextoff = inclusive ? off + 1 : off - 1;
3300 boundinfo->
kind[off],
3303 maxoff = inclusive ? off + 1 : off;
3331 elog(
ERROR,
"invalid strategy number %d", opstrategy);
3375 Assert(minoff >= 0 && maxoff >= 0);
3376 if (minoff <= maxoff)
3440 execparamids =
bms_join(execparamids,
3445 return execparamids;
3481 for (keyno = 0; keyno < context->
partnatts; keyno++)
3507 opstep->step.step_id, keyno);
3522 result->scan_default =
false;
3523 result->scan_null =
false;
3587 elog(
ERROR,
"unexpected partition strategy: %d",
3628 switch (
cstep->combineOp)
3631 foreach(
lc1,
cstep->source_stepids)
3642 if (step_id >=
cstep->step.step_id)
3643 elog(
ERROR,
"invalid pruning combine step argument");
3654 if (!
result->scan_default)
3661 foreach(
lc1,
cstep->source_stepids)
3666 if (step_id >=
cstep->step.step_id)
3667 elog(
ERROR,
"invalid pruning combine step argument");
3690 if (
result->scan_default)
3740 switch (
btest->booltesttype)
3812 *
value = con->constvalue;
3813 *isnull = con->constisnull;
AppendRelInfo ** find_appinfos_by_relids(PlannerInfo *root, Relids relids, int *nappinfos)
Node * adjust_appendrel_attrs(PlannerInfo *root, Node *node, int nappinfos, AppendRelInfo **appinfos)
Node * adjust_appendrel_attrs_multilevel(PlannerInfo *root, Node *node, RelOptInfo *childrel, RelOptInfo *parentrel)
#define DatumGetArrayTypeP(X)
void deconstruct_array(const ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
Bitmapset * bms_make_singleton(int x)
Bitmapset * bms_int_members(Bitmapset *a, const Bitmapset *b)
bool bms_equal(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_add_range(Bitmapset *a, int lower, int upper)
Bitmapset * bms_del_member(Bitmapset *a, int x)
int bms_num_members(const 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_join(Bitmapset *a, Bitmapset *b)
Bitmapset * bms_copy(const Bitmapset *a)
static Datum values[MAXATTR]
#define Assert(condition)
#define OidIsValid(objectId)
bool contain_volatile_functions(Node *clause)
bool enable_partition_pruning
bool equal(const void *a, const void *b)
static Datum ExecEvalExprSwitchContext(ExprState *state, ExprContext *econtext, bool *isNull)
#define palloc_object(type)
#define palloc0_array(type, count)
#define palloc0_object(type)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt)
#define HASHEXTENDED_PROC
List * lappend(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)
void get_op_opfamily_properties(Oid opno, Oid opfamily, bool ordering_op, int *strategy, Oid *lefttype, Oid *righttype)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum)
char op_volatile(Oid opno)
bool op_in_opfamily(Oid opno, Oid opfamily)
Oid get_negator(Oid opno)
Oid get_commutator(Oid opno)
Expr * makeBoolExpr(BoolExprType boolop, List *args, int location)
Node * makeBoolConst(bool value, bool isnull)
Expr * make_opclause(Oid opno, Oid opresulttype, bool opretset, Expr *leftop, Expr *rightop, Oid opcollid, Oid inputcollid)
Const * makeConst(Oid consttype, int32 consttypmod, Oid constcollid, int constlen, Datum constvalue, bool constisnull, bool constbyval)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
static bool is_andclause(const void *clause)
static bool is_orclause(const void *clause)
static Node * get_rightop(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)
@ PARTITION_STRATEGY_HASH
@ PARTITION_STRATEGY_LIST
@ PARTITION_STRATEGY_RANGE
@ PARTITION_RANGE_DATUM_MAXVALUE
@ PARTITION_RANGE_DATUM_MINVALUE
int32 partition_rbound_datum_cmp(FmgrInfo *partsupfunc, Oid *partcollation, const Datum *rb_datums, PartitionRangeDatumKind *rb_kind, const Datum *tuple_datums, int n_tuple_datums)
uint64 compute_partition_hash_value(int partnatts, FmgrInfo *partsupfunc, const Oid *partcollation, const Datum *values, const bool *isnull)
int partition_range_datum_bsearch(FmgrInfo *partsupfunc, Oid *partcollation, PartitionBoundInfo boundinfo, int nvalues, const Datum *values, bool *is_equal)
int partition_list_bsearch(FmgrInfo *partsupfunc, Oid *partcollation, PartitionBoundInfo boundinfo, Datum value, bool *is_equal)
#define partition_bound_has_default(bi)
#define partition_bound_accepts_nulls(bi)
Bitmapset * get_matching_partitions(PartitionPruneContext *context, List *pruning_steps)
static PruneStepResult * get_matching_range_bounds(PartitionPruneContext *context, StrategyNumber opstrategy, const Datum *values, int nvalues, FmgrInfo *partsupfunc, Bitmapset *nullkeys)
int make_partition_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel, List *subpaths, List *prunequal)
@ PARTCLAUSE_MATCH_CONTRADICT
@ PARTCLAUSE_MATCH_CLAUSE
@ PARTCLAUSE_MATCH_NULLNESS
static List * add_part_relids(List *allpartrelids, Bitmapset *partrelids)
static PartitionPruneStep * gen_prune_step_combine(GeneratePruningStepsContext *context, List *source_stepids, PartitionPruneCombineOp combineOp)
static List * make_partitionedrel_pruneinfo(PlannerInfo *root, RelOptInfo *parentrel, List *prunequal, Bitmapset *partrelids, int *relid_subplan_map, Bitmapset **matchedsubplans)
static Bitmapset * get_partkey_exec_paramids(List *steps)
static PartClauseMatchStatus match_clause_to_partition_key(GeneratePruningStepsContext *context, Expr *clause, const Expr *partkey, int partkeyidx, bool *clause_is_not_null, PartClauseInfo **pc, List **clause_steps)
static PruneStepResult * get_matching_list_bounds(PartitionPruneContext *context, StrategyNumber opstrategy, Datum value, int nvalues, FmgrInfo *partsupfunc, Bitmapset *nullkeys)
Bitmapset * prune_append_rel_partitions(RelOptInfo *rel)
static List * get_steps_using_prefix(GeneratePruningStepsContext *context, StrategyNumber step_opstrategy, bool step_op_is_ne, Expr *step_lastexpr, Oid step_lastcmpfn, Bitmapset *step_nullkeys, List *prefix)
static List * gen_partprune_steps_internal(GeneratePruningStepsContext *context, List *clauses)
static void gen_partprune_steps(RelOptInfo *rel, List *clauses, PartClauseTarget target, GeneratePruningStepsContext *context)
static PartClauseMatchStatus match_boolean_partition_clause(Oid partopfamily, Expr *clause, const Expr *partkey, Expr **outconst, bool *notclause)
static void partkey_datum_from_expr(PartitionPruneContext *context, Expr *expr, int stateidx, Datum *value, bool *isnull)
static List * gen_prune_steps_from_opexps(GeneratePruningStepsContext *context, List **keyclauses, Bitmapset *nullkeys)
#define PartCollMatchesExprColl(partcoll, exprcoll)
static PruneStepResult * perform_pruning_base_step(PartitionPruneContext *context, PartitionPruneStepOp *opstep)
static PruneStepResult * perform_pruning_combine_step(PartitionPruneContext *context, PartitionPruneStepCombine *cstep, PruneStepResult **step_results)
static List * get_steps_using_prefix_recurse(GeneratePruningStepsContext *context, StrategyNumber step_opstrategy, bool step_op_is_ne, Expr *step_lastexpr, Oid step_lastcmpfn, Bitmapset *step_nullkeys, List *prefix, ListCell *start, List *step_exprs, List *step_cmpfns)
static Bitmapset * pull_exec_paramids(Expr *expr)
static PartitionPruneStep * gen_prune_step_op(GeneratePruningStepsContext *context, StrategyNumber opstrategy, bool op_is_ne, List *exprs, List *cmpfns, Bitmapset *nullkeys)
static PruneStepResult * get_matching_hash_bounds(PartitionPruneContext *context, StrategyNumber opstrategy, const Datum *values, int nvalues, FmgrInfo *partsupfunc, Bitmapset *nullkeys)
static bool pull_exec_paramids_walker(Node *node, Bitmapset **context)
#define PruneCxtStateIdx(partnatts, step_id, keyno)
#define IS_PARTITIONED_REL(rel)
#define planner_rt_fetch(rti, root)
@ RELOPT_OTHER_MEMBER_REL
#define PARTITION_MAX_KEYS
static int list_length(const List *l)
#define list_make1_oid(x1)
#define for_each_cell(cell, lst, initcell)
static ListCell * list_head(const List *l)
static ListCell * lnext(const List *l, const ListCell *c)
#define list_make2(x1, x2)
Node * strip_noop_phvs(Node *node)
@ PARTPRUNE_COMBINE_INTERSECT
@ PARTPRUNE_COMBINE_UNION
static bool DatumGetBool(Datum X)
bool predicate_refuted_by(List *predicate_list, List *clause_list, bool weak)
Node * negate_clause(Node *node)
RelOptInfo * find_base_rel(PlannerInfo *root, int relid)
void check_stack_depth(void)
#define HTMaxStrategyNumber
#define BTGreaterStrategyNumber
#define BTMaxStrategyNumber
#define HTEqualStrategyNumber
#define BTLessStrategyNumber
#define BTEqualStrategyNumber
#define BTLessEqualStrategyNumber
#define BTGreaterEqualStrategyNumber
PartitionRangeDatumKind ** kind
ExprContext * exprcontext
PartitionBoundInfo boundinfo
Bitmapset * present_parts
List * initial_pruning_steps
List * exec_pruning_steps
Bitmapset * bound_offsets
bool contain_var_clause(Node *node)