70 bool include_noinherit,
72 bool include_partition);
141 if (!(relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE ||
142 relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
144 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
145 errmsg(
"cannot open relation \"%s\"",
153 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
154 errmsg(
"cannot access temporary or unlogged relations during recovery")));
161 rel->attr_needed = (
Relids *)
163 rel->attr_widths = (
int32 *)
186 if ((inhparent && relation->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
190 hasindex = relation->
rd_rel->relhasindex;
208 lmode = root->simple_rte_array[varno]->rellockmode;
210 foreach(l, indexoidlist)
234 if (!
index->indisvalid)
245 if (
index->indcheckxmin &&
263 info->indexkeys = (
int *)
palloc(
sizeof(
int) * ncolumns);
264 info->indexcollations = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
265 info->opfamily = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
266 info->opcintype = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
267 info->canreturn = (
bool *)
palloc(
sizeof(
bool) * ncolumns);
269 for (
i = 0;
i < ncolumns;
i++)
271 info->indexkeys[
i] =
index->indkey.values[
i];
275 for (
i = 0;
i < nkeycolumns;
i++)
288 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
291 amroutine = indexRelation->
rd_indam;
311 if (info->
relam == BTREE_AM_OID)
319 info->sortopfamily = info->opfamily;
320 info->reverse_sort = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
321 info->nulls_first = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
323 for (
i = 0;
i < nkeycolumns;
i++)
327 info->reverse_sort[
i] = (opt & INDOPTION_DESC) != 0;
328 info->nulls_first[
i] = (opt & INDOPTION_NULLS_FIRST) != 0;
348 info->sortopfamily = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
349 info->reverse_sort = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
350 info->nulls_first = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
352 for (
i = 0;
i < nkeycolumns;
i++)
360 info->reverse_sort[
i] = (opt & INDOPTION_DESC) != 0;
361 info->nulls_first[
i] = (opt & INDOPTION_NULLS_FIRST) != 0;
372 btopcintype == info->opcintype[
i] &&
376 info->sortopfamily[
i] = btopfamily;
381 info->sortopfamily = NULL;
382 info->reverse_sort = NULL;
383 info->nulls_first = NULL;
390 info->sortopfamily = NULL;
391 info->reverse_sort = NULL;
392 info->nulls_first = NULL;
407 info->sortopfamily = NULL;
408 info->reverse_sort = NULL;
409 info->nulls_first = NULL;
420 if (info->indexprs && varno != 1)
422 if (info->
indpred && varno != 1)
442 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
459 if (info->
relam == BTREE_AM_OID)
490 indexinfos =
lcons(info, indexinfos);
501 if (relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
509 rel->fdwroutine = NULL;
525 if (inhparent && relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
536 (*get_relation_info_hook) (root, relationObjectId, inhparent, rel);
594 foreach(lc, cachedfkeys)
619 if (rti == rel->
relid)
627 memcpy(info->conkey, cachedfk->conkey,
sizeof(info->conkey));
628 memcpy(info->confkey, cachedfk->confkey,
sizeof(info->confkey));
629 memcpy(info->conpfeqop, cachedfk->conpfeqop,
sizeof(info->conpfeqop));
725 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
726 errmsg(
"whole row unique index inference specifications are not supported")));
742 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
743 errmsg(
"constraint in ON CONFLICT clause has no associated index")));
752 foreach(l, indexList)
774 if (!idxForm->indisvalid)
788 if (indexOidFromConstraint == idxForm->indexrelid)
792 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
793 errmsg(
"ON CONFLICT DO UPDATE not supported with exclusion constraints")));
795 results =
lappend_oid(results, idxForm->indexrelid);
801 else if (indexOidFromConstraint !=
InvalidOid)
812 if (!idxForm->indisunique)
817 for (natt = 0; natt < idxForm->indnkeyatts; natt++)
819 int attno = idxRel->
rd_index->indkey.values[natt];
827 if (!
bms_equal(indexedAttrs, inferAttrs))
887 results =
lappend_oid(results, idxForm->indexrelid);
897 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
898 errmsg(
"there is no unique or exclusion constraint matching the ON CONFLICT specification")));
955 for (natt = 1; natt <= idxRel->
rd_att->
natts; natt++)
960 int attno = idxRel->
rd_index->indkey.values[natt - 1];
966 (inferopfamily != opfamily || inferopcinputtype != opcinputtype))
982 if (((
Var *) elem->
expr)->varattno == attno)
987 Node *nattExpr =
list_nth(idxExprs, (natt - 1) - nplain);
1014 BlockNumber *pages,
double *tuples,
double *allvisfrac)
1022 if (RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
1027 else if (rel->
rd_rel->relkind == RELKIND_INDEX)
1049 reltuples = (
double) rel->
rd_rel->reltuples;
1065 if (reltuples >= 0 && relpages > 0)
1066 density = reltuples / (double) relpages;
1094 *tuples = rint(density * (
double) curpages);
1102 if (relallvisible == 0 || curpages <= 0)
1104 else if ((
double) relallvisible >= curpages)
1107 *allvisfrac = (double) relallvisible / curpages;
1117 *pages = rel->
rd_rel->relpages;
1118 *tuples = rel->
rd_rel->reltuples;
1140 int32 tuple_width = 0;
1148 if (att->attisdropped)
1152 if (attr_widths != NULL && attr_widths[
i] > 0)
1154 tuple_width += attr_widths[
i];
1160 if (item_width <= 0)
1165 if (attr_widths != NULL)
1166 attr_widths[
i] = item_width;
1167 tuple_width += item_width;
1222 bool include_noinherit,
1223 bool include_notnull,
1224 bool include_partition)
1242 for (
i = 0;
i < num_check;
i++)
1289 for (
i = 1;
i <= natts;
i++)
1293 if (att->attnotnull && !att->attisdropped)
1310 ntest->argisrow =
false;
1312 result =
lappend(result, ntest);
1321 if (include_partition && relation->
rd_rel->relispartition)
1341 Oid statOid,
bool inh,
1360 info->
inherit = dataForm->stxdinherit;
1362 info->
kind = STATS_EXT_NDISTINCT;
1364 info->
exprs = exprs;
1366 *stainfos =
lappend(*stainfos, info);
1374 info->
inherit = dataForm->stxdinherit;
1376 info->
kind = STATS_EXT_DEPENDENCIES;
1378 info->
exprs = exprs;
1380 *stainfos =
lappend(*stainfos, info);
1388 info->
inherit = dataForm->stxdinherit;
1390 info->
kind = STATS_EXT_MCV;
1392 info->
exprs = exprs;
1394 *stainfos =
lappend(*stainfos, info);
1402 info->
inherit = dataForm->stxdinherit;
1404 info->
kind = STATS_EXT_EXPRESSIONS;
1406 info->
exprs = exprs;
1408 *stainfos =
lappend(*stainfos, info);
1432 foreach(l, statoidlist)
1443 elog(
ERROR,
"cache lookup failed for statistics object %u", statOid);
1451 for (
i = 0;
i < staForm->stxkeys.dim1;
i++)
1469 Anum_pg_statistic_ext_stxexprs, &isnull);
1532 bool include_noinherit;
1533 bool include_notnull;
1534 bool include_partition =
false;
1535 List *safe_restrictions;
1536 List *constraint_pred;
1537 List *safe_constraints;
1564 if (clause &&
IsA(clause,
Const) &&
1565 (((
Const *) clause)->constisnull ||
1601 include_partition =
true;
1613 safe_restrictions =
NIL;
1619 safe_restrictions =
lappend(safe_restrictions, rinfo->
clause);
1641 include_noinherit = !rte->
inh;
1650 include_notnull = (!rte->
inh || rte->
relkind == RELKIND_PARTITIONED_TABLE);
1667 safe_constraints =
NIL;
1668 foreach(lc, constraint_pred)
1673 safe_constraints =
lappend(safe_constraints, pred);
1738 for (attrno = 1; attrno <= numattrs; attrno++)
1743 if (att_tup->attisdropped || att_tup->atthasmissing)
1754 att_tup->attcollation,
1820 elog(
ERROR,
"unsupported RTE kind %d in build_physical_tlist",
1848 for (
i = 0;
i <
index->ncolumns;
i++)
1850 int indexkey =
index->indexkeys[
i];
1867 att_tup->attcollation,
1873 if (indexpr_item == NULL)
1874 elog(
ERROR,
"wrong number of index expressions");
1876 indexpr_item =
lnext(
index->indexprs, indexpr_item);
1885 if (indexpr_item != NULL)
1886 elog(
ERROR,
"wrong number of index expressions");
1924 if (result < 0.0 || result > 1.0)
1925 elog(
ERROR,
"invalid restriction selectivity: %f", result);
1965 if (result < 0.0 || result > 1.0)
1966 elog(
ERROR,
"invalid join selectivity: %f", result);
2004 req.
type = T_SupportRequestSelectivity;
2020 if (sresult != &req)
2051 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2059 req.
type = T_SupportRequestCost;
2072 if (sresult == &req)
2112 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2115 Assert(procform->proretset);
2122 req.
type = T_SupportRequestRows;
2133 if (sresult == &req)
2142 result = procform->prorows;
2178 if (
index->unique &&
2179 index->nkeycolumns == 1 &&
2180 index->indexkeys[0] == attno &&
2199 bool result =
false;
2230 elog(
ERROR,
"unrecognized CmdType: %d", (
int) event);
2249 bool result =
false;
2284 constr = tupdesc->
constr;
2310 return dependentCols;
2327 if (root->
glob->partition_directory == NULL)
2329 root->
glob->partition_directory =
2336 Assert(partdesc != NULL && rel->part_scheme != NULL);
2363 foreach(lc, root->part_schemes)
2365 part_scheme =
lfirst(lc);
2374 sizeof(
Oid) * partnatts) != 0 ||
2376 sizeof(
Oid) * partnatts) != 0 ||
2378 sizeof(
Oid) * partnatts) != 0)
2386 sizeof(
int16) * partnatts) == 0);
2388 sizeof(
bool) * partnatts) == 0);
2397 #ifdef USE_ASSERT_CHECKING
2419 sizeof(
Oid) * partnatts);
2423 sizeof(
Oid) * partnatts);
2427 sizeof(
Oid) * partnatts);
2431 sizeof(
int16) * partnatts);
2435 sizeof(
bool) * partnatts);
2439 for (
i = 0;
i < partnatts;
i++)
2444 root->part_schemes =
lappend(root->part_schemes, part_scheme);
2475 for (cnt = 0; cnt < partnatts; cnt++)
2493 elog(
ERROR,
"wrong number of partition key expressions");
2505 rel->partexprs = partexprs;
2513 rel->nullable_partexprs = (
List **)
palloc0(
sizeof(
List *) * partnatts);
2542 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 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
elog(ERROR, "%s: %s", p2, msg)
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
Assert(fmt[strlen(fmt) - 1] !='\n')
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
OnConflictExpr * onConflict
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)