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));
753 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
754 errmsg(
"whole row unique index inference specifications are not supported")));
770 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
771 errmsg(
"constraint in ON CONFLICT clause has no associated index")));
780 foreach(l, indexList)
799 idxRel =
index_open(indexoid, rte->rellockmode);
802 if (!idxForm->indisvalid)
816 if (indexOidFromConstraint == idxForm->indexrelid)
820 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
821 errmsg(
"ON CONFLICT DO UPDATE not supported with exclusion constraints")));
823 results =
lappend_oid(results, idxForm->indexrelid);
829 else if (indexOidFromConstraint !=
InvalidOid)
840 if (!idxForm->indisunique)
845 for (natt = 0; natt < idxForm->indnkeyatts; natt++)
847 int attno = idxRel->
rd_index->indkey.values[natt];
855 if (!
bms_equal(indexedAttrs, inferAttrs))
915 results =
lappend_oid(results, idxForm->indexrelid);
925 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
926 errmsg(
"there is no unique or exclusion constraint matching the ON CONFLICT specification")));
983 for (natt = 1; natt <= idxRel->
rd_att->
natts; natt++)
988 int attno = idxRel->
rd_index->indkey.values[natt - 1];
994 (inferopfamily != opfamily || inferopcinputtype != opcinputtype))
1010 if (((
Var *) elem->
expr)->varattno == attno)
1013 else if (attno == 0)
1015 Node *nattExpr =
list_nth(idxExprs, (natt - 1) - nplain);
1042 BlockNumber *pages,
double *tuples,
double *allvisfrac)
1050 if (RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
1055 else if (rel->
rd_rel->relkind == RELKIND_INDEX)
1077 reltuples = (
double) rel->
rd_rel->reltuples;
1093 if (reltuples >= 0 && relpages > 0)
1094 density = reltuples / (double) relpages;
1122 *tuples = rint(density * (
double) curpages);
1130 if (relallvisible == 0 || curpages <= 0)
1132 else if ((
double) relallvisible >= curpages)
1135 *allvisfrac = (double) relallvisible / curpages;
1145 *pages = rel->
rd_rel->relpages;
1146 *tuples = rel->
rd_rel->reltuples;
1168 int64 tuple_width = 0;
1176 if (att->attisdropped)
1180 if (attr_widths != NULL && attr_widths[
i] > 0)
1182 tuple_width += attr_widths[
i];
1188 if (item_width <= 0)
1193 if (attr_widths != NULL)
1194 attr_widths[
i] = item_width;
1195 tuple_width += item_width;
1250 bool include_noinherit,
1251 bool include_notnull,
1252 bool include_partition)
1270 for (
i = 0;
i < num_check;
i++)
1317 for (
i = 1;
i <= natts;
i++)
1321 if (att->attnotnull && !att->attisdropped)
1338 ntest->argisrow =
false;
1340 result =
lappend(result, ntest);
1349 if (include_partition && relation->
rd_rel->relispartition)
1369 Oid statOid,
bool inh,
1388 info->
inherit = dataForm->stxdinherit;
1390 info->
kind = STATS_EXT_NDISTINCT;
1392 info->
exprs = exprs;
1394 *stainfos =
lappend(*stainfos, info);
1402 info->
inherit = dataForm->stxdinherit;
1404 info->
kind = STATS_EXT_DEPENDENCIES;
1406 info->
exprs = exprs;
1408 *stainfos =
lappend(*stainfos, info);
1416 info->
inherit = dataForm->stxdinherit;
1418 info->
kind = STATS_EXT_MCV;
1420 info->
exprs = exprs;
1422 *stainfos =
lappend(*stainfos, info);
1430 info->
inherit = dataForm->stxdinherit;
1432 info->
kind = STATS_EXT_EXPRESSIONS;
1434 info->
exprs = exprs;
1436 *stainfos =
lappend(*stainfos, info);
1460 foreach(l, statoidlist)
1471 elog(
ERROR,
"cache lookup failed for statistics object %u", statOid);
1479 for (
i = 0;
i < staForm->stxkeys.dim1;
i++)
1497 Anum_pg_statistic_ext_stxexprs, &isnull);
1560 bool include_noinherit;
1561 bool include_notnull;
1562 bool include_partition =
false;
1563 List *safe_restrictions;
1564 List *constraint_pred;
1565 List *safe_constraints;
1593 if (clause &&
IsA(clause,
Const) &&
1594 (((
Const *) clause)->constisnull ||
1630 include_partition =
true;
1642 safe_restrictions =
NIL;
1648 safe_restrictions =
lappend(safe_restrictions, rinfo->
clause);
1670 include_noinherit = !rte->
inh;
1679 include_notnull = (!rte->
inh || rte->relkind == RELKIND_PARTITIONED_TABLE);
1696 safe_constraints =
NIL;
1697 foreach(lc, constraint_pred)
1702 safe_constraints =
lappend(safe_constraints, pred);
1767 for (attrno = 1; attrno <= numattrs; attrno++)
1772 if (att_tup->attisdropped || att_tup->atthasmissing)
1783 att_tup->attcollation,
1849 elog(
ERROR,
"unsupported RTE kind %d in build_physical_tlist",
1877 for (
i = 0;
i <
index->ncolumns;
i++)
1879 int indexkey =
index->indexkeys[
i];
1896 att_tup->attcollation,
1902 if (indexpr_item == NULL)
1903 elog(
ERROR,
"wrong number of index expressions");
1905 indexpr_item =
lnext(
index->indexprs, indexpr_item);
1914 if (indexpr_item != NULL)
1915 elog(
ERROR,
"wrong number of index expressions");
1953 if (result < 0.0 || result > 1.0)
1954 elog(
ERROR,
"invalid restriction selectivity: %f", result);
1994 if (result < 0.0 || result > 1.0)
1995 elog(
ERROR,
"invalid join selectivity: %f", result);
2033 req.
type = T_SupportRequestSelectivity;
2049 if (sresult != &req)
2080 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2088 req.
type = T_SupportRequestCost;
2101 if (sresult == &req)
2141 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2144 Assert(procform->proretset);
2151 req.
type = T_SupportRequestRows;
2162 if (sresult == &req)
2171 result = procform->prorows;
2207 if (
index->unique &&
2208 index->nkeycolumns == 1 &&
2209 index->indexkeys[0] == attno &&
2228 bool result =
false;
2259 elog(
ERROR,
"unrecognized CmdType: %d", (
int) event);
2278 bool result =
false;
2313 constr = tupdesc->
constr;
2339 return dependentCols;
2356 if (
root->glob->partition_directory == NULL)
2358 root->glob->partition_directory =
2365 Assert(partdesc != NULL && rel->part_scheme != NULL);
2392 foreach(lc,
root->part_schemes)
2394 part_scheme =
lfirst(lc);
2403 sizeof(
Oid) * partnatts) != 0 ||
2405 sizeof(
Oid) * partnatts) != 0 ||
2407 sizeof(
Oid) * partnatts) != 0)
2415 sizeof(
int16) * partnatts) == 0);
2417 sizeof(
bool) * partnatts) == 0);
2426 #ifdef USE_ASSERT_CHECKING
2448 sizeof(
Oid) * partnatts);
2452 sizeof(
Oid) * partnatts);
2456 sizeof(
Oid) * partnatts);
2460 sizeof(
int16) * partnatts);
2464 sizeof(
bool) * partnatts);
2468 for (
i = 0;
i < partnatts;
i++)
2504 for (cnt = 0; cnt < partnatts; cnt++)
2522 elog(
ERROR,
"wrong number of partition key expressions");
2534 rel->partexprs = partexprs;
2542 rel->nullable_partexprs = (
List **)
palloc0(
sizeof(
List *) * partnatts);
2571 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
FormData_pg_attribute attrs[FLEXIBLE_ARRAY_MEMBER]
#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)