68 bool include_noinherit,
70 bool include_partition);
139 if (!(relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE ||
140 relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
142 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
143 errmsg(
"cannot open relation \"%s\"",
151 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
152 errmsg(
"cannot access temporary or unlogged relations during recovery")));
159 rel->attr_needed = (
Relids *)
161 rel->attr_widths = (
int32 *)
173 if (!inhparent || relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
179 if (attr->attnotnull)
189 Assert(!attr->attisdropped);
214 if ((inhparent && relation->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
218 hasindex = relation->
rd_rel->relhasindex;
236 lmode =
root->simple_rte_array[varno]->rellockmode;
238 foreach(l, indexoidlist)
262 if (!
index->indisvalid)
273 if (
index->indcheckxmin &&
277 root->glob->transientPlan =
true;
291 info->indexkeys = (
int *)
palloc(
sizeof(
int) * ncolumns);
292 info->indexcollations = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
293 info->opfamily = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
294 info->opcintype = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
295 info->canreturn = (
bool *)
palloc(
sizeof(
bool) * ncolumns);
297 for (
i = 0;
i < ncolumns;
i++)
299 info->indexkeys[
i] =
index->indkey.values[
i];
303 for (
i = 0;
i < nkeycolumns;
i++)
316 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
319 amroutine = indexRelation->
rd_indam;
339 if (info->
relam == BTREE_AM_OID)
347 info->sortopfamily = info->opfamily;
348 info->reverse_sort = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
349 info->nulls_first = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
351 for (
i = 0;
i < nkeycolumns;
i++)
355 info->reverse_sort[
i] = (opt & INDOPTION_DESC) != 0;
356 info->nulls_first[
i] = (opt & INDOPTION_NULLS_FIRST) != 0;
376 info->sortopfamily = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
377 info->reverse_sort = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
378 info->nulls_first = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
380 for (
i = 0;
i < nkeycolumns;
i++)
388 info->reverse_sort[
i] = (opt & INDOPTION_DESC) != 0;
389 info->nulls_first[
i] = (opt & INDOPTION_NULLS_FIRST) != 0;
400 btopcintype == info->opcintype[
i] &&
404 info->sortopfamily[
i] = btopfamily;
409 info->sortopfamily = NULL;
410 info->reverse_sort = NULL;
411 info->nulls_first = NULL;
418 info->sortopfamily = NULL;
419 info->reverse_sort = NULL;
420 info->nulls_first = NULL;
435 info->sortopfamily = NULL;
436 info->reverse_sort = NULL;
437 info->nulls_first = NULL;
448 if (info->indexprs && varno != 1)
450 if (info->
indpred && varno != 1)
470 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
487 if (info->
relam == BTREE_AM_OID)
518 indexinfos =
lcons(info, indexinfos);
529 if (relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
537 rel->fdwroutine = NULL;
553 if (inhparent && relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
564 (*get_relation_info_hook) (
root, relationObjectId, inhparent, rel);
622 foreach(lc, cachedfkeys)
647 if (rti == rel->
relid)
655 memcpy(info->conkey, cachedfk->conkey,
sizeof(info->conkey));
656 memcpy(info->confkey, cachedfk->confkey,
sizeof(info->confkey));
657 memcpy(info->conpfeqop, cachedfk->conpfeqop,
sizeof(info->conpfeqop));
727 varno =
root->parse->resultRelation;
755 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
756 errmsg(
"whole row unique index inference specifications are not supported")));
772 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
773 errmsg(
"constraint in ON CONFLICT clause has no associated index")));
782 foreach(l, indexList)
801 idxRel =
index_open(indexoid, rte->rellockmode);
804 if (!idxForm->indisvalid)
818 if (indexOidFromConstraint == idxForm->indexrelid)
822 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
823 errmsg(
"ON CONFLICT DO UPDATE not supported with exclusion constraints")));
825 results =
lappend_oid(results, idxForm->indexrelid);
831 else if (indexOidFromConstraint !=
InvalidOid)
842 if (!idxForm->indisunique)
847 for (natt = 0; natt < idxForm->indnkeyatts; natt++)
849 int attno = idxRel->
rd_index->indkey.values[natt];
857 if (!
bms_equal(indexedAttrs, inferAttrs))
862 if (idxExprs && varno != 1)
916 if (predExprs && varno != 1)
922 results =
lappend_oid(results, idxForm->indexrelid);
932 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
933 errmsg(
"there is no unique or exclusion constraint matching the ON CONFLICT specification")));
990 for (natt = 1; natt <= idxRel->
rd_att->
natts; natt++)
995 int attno = idxRel->
rd_index->indkey.values[natt - 1];
1001 (inferopfamily != opfamily || inferopcinputtype != opcinputtype))
1017 if (((
Var *) elem->
expr)->varattno == attno)
1020 else if (attno == 0)
1022 Node *nattExpr =
list_nth(idxExprs, (natt - 1) - nplain);
1049 BlockNumber *pages,
double *tuples,
double *allvisfrac)
1057 if (RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
1062 else if (rel->
rd_rel->relkind == RELKIND_INDEX)
1084 reltuples = (
double) rel->
rd_rel->reltuples;
1100 if (reltuples >= 0 && relpages > 0)
1101 density = reltuples / (double) relpages;
1129 *tuples = rint(density * (
double) curpages);
1137 if (relallvisible == 0 || curpages <= 0)
1139 else if ((
double) relallvisible >= curpages)
1142 *allvisfrac = (double) relallvisible / curpages;
1152 *pages = rel->
rd_rel->relpages;
1153 *tuples = rel->
rd_rel->reltuples;
1175 int64 tuple_width = 0;
1183 if (att->attisdropped)
1187 if (attr_widths != NULL && attr_widths[
i] > 0)
1189 tuple_width += attr_widths[
i];
1195 if (item_width <= 0)
1200 if (attr_widths != NULL)
1201 attr_widths[
i] = item_width;
1202 tuple_width += item_width;
1257 bool include_noinherit,
1258 bool include_notnull,
1259 bool include_partition)
1277 for (
i = 0;
i < num_check;
i++)
1324 for (
i = 1;
i <= natts;
i++)
1328 if (att->attnotnull && !att->attisdropped)
1345 ntest->argisrow =
false;
1347 result =
lappend(result, ntest);
1356 if (include_partition && relation->
rd_rel->relispartition)
1376 Oid statOid,
bool inh,
1395 info->
inherit = dataForm->stxdinherit;
1397 info->
kind = STATS_EXT_NDISTINCT;
1399 info->
exprs = exprs;
1401 *stainfos =
lappend(*stainfos, info);
1409 info->
inherit = dataForm->stxdinherit;
1411 info->
kind = STATS_EXT_DEPENDENCIES;
1413 info->
exprs = exprs;
1415 *stainfos =
lappend(*stainfos, info);
1423 info->
inherit = dataForm->stxdinherit;
1425 info->
kind = STATS_EXT_MCV;
1427 info->
exprs = exprs;
1429 *stainfos =
lappend(*stainfos, info);
1437 info->
inherit = dataForm->stxdinherit;
1439 info->
kind = STATS_EXT_EXPRESSIONS;
1441 info->
exprs = exprs;
1443 *stainfos =
lappend(*stainfos, info);
1467 foreach(l, statoidlist)
1478 elog(
ERROR,
"cache lookup failed for statistics object %u", statOid);
1486 for (
i = 0;
i < staForm->stxkeys.dim1;
i++)
1504 Anum_pg_statistic_ext_stxexprs, &isnull);
1567 bool include_noinherit;
1568 bool include_notnull;
1569 bool include_partition =
false;
1570 List *safe_restrictions;
1571 List *constraint_pred;
1572 List *safe_constraints;
1600 if (clause &&
IsA(clause,
Const) &&
1601 (((
Const *) clause)->constisnull ||
1637 include_partition =
true;
1649 safe_restrictions =
NIL;
1655 safe_restrictions =
lappend(safe_restrictions, rinfo->
clause);
1677 include_noinherit = !rte->
inh;
1684 include_notnull = (!rte->
inh || rte->relkind == RELKIND_PARTITIONED_TABLE);
1701 safe_constraints =
NIL;
1702 foreach(lc, constraint_pred)
1707 safe_constraints =
lappend(safe_constraints, pred);
1772 for (attrno = 1; attrno <= numattrs; attrno++)
1777 if (att_tup->attisdropped || att_tup->atthasmissing)
1788 att_tup->attcollation,
1854 elog(
ERROR,
"unsupported RTE kind %d in build_physical_tlist",
1882 for (
i = 0;
i <
index->ncolumns;
i++)
1884 int indexkey =
index->indexkeys[
i];
1901 att_tup->attcollation,
1907 if (indexpr_item == NULL)
1908 elog(
ERROR,
"wrong number of index expressions");
1910 indexpr_item =
lnext(
index->indexprs, indexpr_item);
1919 if (indexpr_item != NULL)
1920 elog(
ERROR,
"wrong number of index expressions");
1958 if (result < 0.0 || result > 1.0)
1959 elog(
ERROR,
"invalid restriction selectivity: %f", result);
1999 if (result < 0.0 || result > 1.0)
2000 elog(
ERROR,
"invalid join selectivity: %f", result);
2038 req.
type = T_SupportRequestSelectivity;
2054 if (sresult != &req)
2085 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2093 req.
type = T_SupportRequestCost;
2106 if (sresult == &req)
2146 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2149 Assert(procform->proretset);
2156 req.
type = T_SupportRequestRows;
2167 if (sresult == &req)
2176 result = procform->prorows;
2212 if (
index->unique &&
2213 index->nkeycolumns == 1 &&
2214 index->indexkeys[0] == attno &&
2233 bool result =
false;
2264 elog(
ERROR,
"unrecognized CmdType: %d", (
int) event);
2283 bool result =
false;
2318 constr = tupdesc->
constr;
2344 return dependentCols;
2361 if (
root->glob->partition_directory == NULL)
2363 root->glob->partition_directory =
2370 Assert(partdesc != NULL && rel->part_scheme != NULL);
2397 foreach(lc,
root->part_schemes)
2399 part_scheme =
lfirst(lc);
2408 sizeof(
Oid) * partnatts) != 0 ||
2410 sizeof(
Oid) * partnatts) != 0 ||
2412 sizeof(
Oid) * partnatts) != 0)
2420 sizeof(
int16) * partnatts) == 0);
2422 sizeof(
bool) * partnatts) == 0);
2431 #ifdef USE_ASSERT_CHECKING
2453 sizeof(
Oid) * partnatts);
2457 sizeof(
Oid) * partnatts);
2461 sizeof(
Oid) * partnatts);
2465 sizeof(
int16) * partnatts);
2469 sizeof(
bool) * partnatts);
2473 for (
i = 0;
i < partnatts;
i++)
2509 for (cnt = 0; cnt < partnatts; cnt++)
2527 elog(
ERROR,
"wrong number of partition key expressions");
2539 rel->partexprs = partexprs;
2547 rel->nullable_partexprs = (
List **)
palloc0(
sizeof(
List *) * partnatts);
2576 if (rel->
relid != 1)
#define InvalidAttrNumber
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
void bms_free(Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
bool bms_overlap(const Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_copy(const Bitmapset *a)
#define RelationGetNumberOfBlocks(reln)
#define SizeOfPageHeaderData
#define TextDatumGetCString(d)
#define Assert(condition)
#define OidIsValid(objectId)
bool IsSystemRelation(Relation relation)
bool contain_mutable_functions(Node *clause)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
@ CONSTRAINT_EXCLUSION_OFF
@ CONSTRAINT_EXCLUSION_PARTITION
@ CONSTRAINT_EXCLUSION_ON
int32 clamp_width_est(int64 tuple_width)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool equal(const void *a, const void *b)
bool statext_is_kind_built(HeapTuple htup, char type)
Datum OidFunctionCall5Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4, Datum arg5)
Datum OidFunctionCall4Coll(Oid functionId, Oid collation, Datum arg1, Datum arg2, Datum arg3, Datum arg4)
void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt)
#define OidFunctionCall1(functionId, arg1)
FdwRoutine * GetFdwRoutineForRelation(Relation relation, bool makecopy)
Oid GetForeignServerIdByRelId(Oid relid)
const FormData_pg_attribute * SystemAttributeDefinition(AttrNumber attno)
#define HeapTupleIsValid(tuple)
#define SizeofHeapTupleHeader
#define HeapTupleHeaderGetXmin(tup)
void index_close(Relation relation, LOCKMODE lockmode)
bool index_can_return(Relation indexRelation, int attno)
Relation index_open(Oid relationId, LOCKMODE lockmode)
if(TABLE==NULL||TABLE_index==NULL)
struct ItemIdData ItemIdData
List * lappend(List *list, void *datum)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
List * list_concat(List *list1, const List *list2)
bool list_member(const List *list, const void *datum)
List * lcons(void *datum, List *list)
List * list_difference(const List *list1, const List *list2)
RegProcedure get_oprrest(Oid opno)
Oid get_constraint_index(Oid conoid)
Oid get_opclass_input_type(Oid opclass)
Oid get_opclass_family(Oid opclass)
RegProcedure get_func_support(Oid funcid)
int32 get_attavgwidth(Oid relid, AttrNumber attnum)
RegProcedure get_oprjoin(Oid opno)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
bool get_ordering_op_properties(Oid opno, Oid *opfamily, Oid *opcintype, int16 *strategy)
int32 get_typavgwidth(Oid typid, int32 typmod)
Var * makeVarFromTargetEntry(int varno, TargetEntry *tle)
List * make_ands_implicit(Expr *clause)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
Var * makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Oid varcollid, Index varlevelsup)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
int _bt_getrootheight(Relation rel)
void fix_opfuncids(Node *node)
#define IsA(nodeptr, _type_)
void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up, int location, bool include_dropped, List **colnames, List **colvars)
#define rt_fetch(rangetable_index, rangetable)
List * RelationGetPartitionQual(Relation rel)
PartitionKey RelationGetPartitionKey(Relation rel)
PartitionDirectory CreatePartitionDirectory(MemoryContext mcxt, bool omit_detached)
PartitionDesc PartitionDirectoryLookup(PartitionDirectory pdir, Relation rel)
#define IS_SIMPLE_REL(rel)
#define planner_rt_fetch(rti, root)
struct PartitionSchemeData * PartitionScheme
@ RELOPT_OTHER_MEMBER_REL
#define AMFLAG_HAS_TID_RANGE
FormData_pg_attribute * Form_pg_attribute
int errdetail_relkind_not_supported(char relkind)
FormData_pg_index * Form_pg_index
static int list_length(const List *l)
static ListCell * list_head(const List *l)
static void * list_nth(const List *list, int n)
static ListCell * lnext(const List *l, const ListCell *c)
FormData_pg_proc * Form_pg_proc
FormData_pg_statistic_ext * Form_pg_statistic_ext
FormData_pg_statistic_ext_data * Form_pg_statistic_ext_data
void estimate_rel_size(Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples, double *allvisfrac)
Bitmapset * get_dependent_generated_columns(PlannerInfo *root, Index rti, Bitmapset *target_cols)
int32 get_rel_data_width(Relation rel, int32 *attr_widths)
bool has_stored_generated_columns(PlannerInfo *root, Index rti)
static void get_relation_foreign_keys(PlannerInfo *root, RelOptInfo *rel, Relation relation, bool inhparent)
bool relation_excluded_by_constraints(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
double get_function_rows(PlannerInfo *root, Oid funcid, Node *node)
bool has_row_triggers(PlannerInfo *root, Index rti, CmdType event)
static List * get_relation_constraints(PlannerInfo *root, Oid relationObjectId, RelOptInfo *rel, bool include_noinherit, bool include_notnull, bool include_partition)
void add_function_cost(PlannerInfo *root, Oid funcid, Node *node, QualCost *cost)
List * build_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
get_relation_info_hook_type get_relation_info_hook
List * infer_arbiter_indexes(PlannerInfo *root)
static void get_relation_statistics_worker(List **stainfos, RelOptInfo *rel, Oid statOid, bool inh, Bitmapset *keys, List *exprs)
Selectivity restriction_selectivity(PlannerInfo *root, Oid operatorid, List *args, Oid inputcollid, int varRelid)
int32 get_relation_data_width(Oid relid, int32 *attr_widths)
static void set_baserel_partition_constraint(Relation relation, RelOptInfo *rel)
static List * build_index_tlist(PlannerInfo *root, IndexOptInfo *index, Relation heapRelation)
static bool infer_collation_opclass_match(InferenceElem *elem, Relation idxRel, List *idxExprs)
static List * get_relation_statistics(RelOptInfo *rel, Relation relation)
static void set_relation_partition_info(PlannerInfo *root, RelOptInfo *rel, Relation relation)
bool has_unique_index(RelOptInfo *rel, AttrNumber attno)
static PartitionScheme find_partition_scheme(PlannerInfo *root, Relation relation)
static void set_baserel_partition_key_exprs(Relation relation, RelOptInfo *rel)
Selectivity join_selectivity(PlannerInfo *root, Oid operatorid, List *args, Oid inputcollid, JoinType jointype, SpecialJoinInfo *sjinfo)
Selectivity function_selectivity(PlannerInfo *root, Oid funcid, List *args, Oid inputcollid, bool is_join, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo)
void get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel)
void(* get_relation_info_hook_type)(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel)
Expr * expression_planner(Expr *expr)
static bool DatumGetBool(Datum X)
static Datum PointerGetDatum(const void *X)
static Datum Int16GetDatum(int16 X)
static Datum BoolGetDatum(bool X)
static float8 DatumGetFloat8(Datum X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
static Datum Int32GetDatum(int32 X)
bool predicate_refuted_by(List *predicate_list, List *clause_list, bool weak)
bool predicate_implied_by(List *predicate_list, List *clause_list, bool weak)
Expr * canonicalize_qual(Expr *qual, bool is_check)
void * stringToNode(const char *str)
#define RelationGetForm(relation)
#define RelationGetRelid(relation)
#define RelationGetParallelWorkers(relation, defaultpw)
#define RelationGetDescr(relation)
#define RelationGetNumberOfAttributes(relation)
#define RelationGetRelationName(relation)
#define RelationIsPermanent(relation)
List * RelationGetIndexList(Relation relation)
List * RelationGetIndexPredicate(Relation relation)
List * RelationGetStatExtList(Relation relation)
List * RelationGetFKeyList(Relation relation)
bytea ** RelationGetIndexAttOptions(Relation relation, bool copy)
List * RelationGetIndexExpressions(Relation relation)
void ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
TransactionId TransactionXmin
#define BTLessStrategyNumber
struct EquivalenceClass * eclass[INDEX_MAX_KEYS]
List * rinfos[INDEX_MAX_KEYS]
struct EquivalenceMember * fk_eclass_member[INDEX_MAX_KEYS]
amrestrpos_function amrestrpos
amcostestimate_function amcostestimate
amgettuple_function amgettuple
amgetbitmap_function amgetbitmap
ammarkpos_function ammarkpos
void(* amcostestimate)() pg_node_attr(read_write_ignore)
NullTestType nulltesttype
PartitionBoundInfo boundinfo
PartitionStrategy strategy
struct FmgrInfo * partsupfunc
Bitmapset * notnullattnums
const struct TableAmRoutine * rd_tableam
struct IndexAmRoutine * rd_indam
struct HeapTupleData * rd_indextuple
struct PlannerInfo * root
struct PlannerInfo * root
struct PlannerInfo * root
struct SpecialJoinInfo * sjinfo
bool(* scan_getnextslot_tidrange)(TableScanDesc scan, ScanDirection direction, TupleTableSlot *slot)
void(* scan_set_tidrange)(TableScanDesc scan, ItemPointer mintid, ItemPointer maxtid)
bool(* scan_bitmap_next_block)(TableScanDesc scan, struct TBMIterateResult *tbmres)
bool trig_delete_before_row
bool trig_update_after_row
bool trig_insert_after_row
bool trig_update_before_row
bool trig_delete_after_row
bool trig_insert_before_row
bool has_generated_stored
#define FirstLowInvalidHeapAttributeNumber
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
static void table_relation_estimate_size(Relation rel, int32 *attr_widths, BlockNumber *pages, double *tuples, double *allvisfrac)
bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
#define TupleDescAttr(tupdesc, i)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
bool RecoveryInProgress(void)