76 bool include_noinherit,
78 bool include_partition);
148 if (!(relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE ||
149 relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
151 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
152 errmsg(
"cannot open relation \"%s\"",
160 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
161 errmsg(
"cannot access temporary or unlogged relations during recovery")));
168 rel->attr_needed = (
Relids *)
170 rel->attr_widths = (
int32 *)
182 if (!inhparent || relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
205 if ((inhparent && relation->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
209 hasindex = relation->
rd_rel->relhasindex;
227 lmode =
root->simple_rte_array[varno]->rellockmode;
229 foreach(l, indexoidlist)
253 if (!
index->indisvalid)
264 if (
index->indcheckxmin &&
268 root->glob->transientPlan =
true;
288 for (
i = 0;
i < ncolumns;
i++)
290 info->indexkeys[
i] =
index->indkey.values[
i];
294 for (
i = 0;
i < nkeycolumns;
i++)
307 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
310 amroutine = indexRelation->
rd_indam;
330 if (info->
relam == BTREE_AM_OID)
338 info->sortopfamily = info->opfamily;
342 for (
i = 0;
i < nkeycolumns;
i++)
346 info->reverse_sort[
i] = (opt & INDOPTION_DESC) != 0;
347 info->nulls_first[
i] = (opt & INDOPTION_NULLS_FIRST) != 0;
367 for (
i = 0;
i < nkeycolumns;
i++)
375 info->reverse_sort[
i] = (opt & INDOPTION_DESC) != 0;
376 info->nulls_first[
i] = (opt & INDOPTION_NULLS_FIRST) != 0;
387 opcintype == info->opcintype[
i] &&
391 info->sortopfamily[
i] = opfamily;
396 info->sortopfamily = NULL;
397 info->reverse_sort = NULL;
398 info->nulls_first = NULL;
405 info->sortopfamily = NULL;
406 info->reverse_sort = NULL;
407 info->nulls_first = NULL;
422 info->sortopfamily = NULL;
423 info->reverse_sort = NULL;
424 info->nulls_first = NULL;
445 info->indexprs = (
List *)
477 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
524 indexinfos =
lcons(info, indexinfos);
535 if (relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
544 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
545 errmsg(
"access to non-system foreign table is restricted")));
554 rel->fdwroutine = NULL;
570 if (inhparent && relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
581 (*get_relation_info_hook) (
root, relationObjectId, inhparent, rel);
639 foreach(lc, cachedfkeys)
668 if (rti == rel->
relid)
676 memcpy(info->conkey, cachedfk->conkey,
sizeof(info->conkey));
677 memcpy(info->confkey, cachedfk->confkey,
sizeof(info->confkey));
678 memcpy(info->conpfeqop, cachedfk->conpfeqop,
sizeof(info->conpfeqop));
714 if (
root->glob->rel_notnullatts_hash == NULL)
728 root->glob->rel_notnullatts_hash = hashtab;
779 if (
root->glob->rel_notnullatts_hash == NULL)
837 bool foundValid =
false;
854 varno =
root->parse->resultRelation;
872 if (!
IsA(elem->expr,
Var))
875 inferElems =
lappend(inferElems, elem->expr);
879 var = (
Var *) elem->expr;
884 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
885 errmsg(
"whole row unique index inference specifications are not supported")));
905 idxRel =
index_open(indexoid, rte->rellockmode);
906 indexRelList =
lappend(indexRelList, idxRel);
923 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
924 errmsg(
"constraint in ON CONFLICT clause has no associated index")));
934 if (indexOidFromConstraint == idxForm->indexrelid)
937 Assert(idxForm->indisready);
944 for (
int natt = 0; natt < idxForm->indnkeyatts; natt++)
948 attno = idxRel->rd_index->indkey.values[natt];
982 idxForm = idxRel->rd_index;
999 if (!idxForm->indisready)
1007 if (relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
1008 !idxForm->indisvalid)
1022 if (indexOidFromConstraint == idxForm->indexrelid)
1026 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1027 errmsg(
"ON CONFLICT DO UPDATE not supported with exclusion constraints")));
1030 results =
lappend_oid(results, idxForm->indexrelid);
1031 foundValid |= idxForm->indisvalid;
1034 else if (indexOidFromConstraint !=
InvalidOid)
1050 if (!idxForm->indisunique)
1058 if (idxForm->indisexclusion)
1062 indexedAttrs = NULL;
1063 for (natt = 0; natt < idxForm->indnkeyatts; natt++)
1065 int attno = idxRel->rd_index->indkey.values[natt];
1073 if (!
bms_equal(indexedAttrs, inferAttrs))
1111 if (
IsA(elem->expr,
Var))
1150 predExprs = (
List *)
1174 results =
lappend_oid(results, idxForm->indexrelid);
1175 foundValid |= idxForm->indisvalid;
1189 if (results ==
NIL || !foundValid)
1191 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
1192 errmsg(
"there is no unique or exclusion constraint matching the ON CONFLICT specification")));
1249 for (natt = 1; natt <= idxRel->
rd_att->
natts; natt++)
1254 int attno = idxRel->
rd_index->indkey.values[natt - 1];
1260 (inferopfamily != opfamily || inferopcinputtype != opcinputtype))
1276 if (((
Var *) elem->
expr)->varattno == attno)
1279 else if (attno == 0)
1281 Node *nattExpr =
list_nth(idxExprs, (natt - 1) - nplain);
1308 BlockNumber *pages,
double *tuples,
double *allvisfrac)
1316 if (RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
1321 else if (rel->
rd_rel->relkind == RELKIND_INDEX)
1343 reltuples = (
double) rel->
rd_rel->reltuples;
1359 if (reltuples >= 0 && relpages > 0)
1360 density = reltuples / (double) relpages;
1388 *tuples = rint(density * (
double) curpages);
1396 if (relallvisible == 0 || curpages <= 0)
1398 else if ((
double) relallvisible >= curpages)
1401 *allvisfrac = (double) relallvisible / curpages;
1411 *pages = rel->
rd_rel->relpages;
1412 *tuples = rel->
rd_rel->reltuples;
1434 int64 tuple_width = 0;
1442 if (att->attisdropped)
1446 if (attr_widths != NULL && attr_widths[
i] > 0)
1448 tuple_width += attr_widths[
i];
1454 if (item_width <= 0)
1459 if (attr_widths != NULL)
1460 attr_widths[
i] = item_width;
1461 tuple_width += item_width;
1517 bool include_noinherit,
1518 bool include_notnull,
1519 bool include_partition)
1537 for (
i = 0;
i < num_check;
i++)
1597 for (
i = 1;
i <= natts;
i++)
1609 wholeatt->atttypmod,
1610 wholeatt->attcollation,
1619 ntest->argisrow =
false;
1621 result =
lappend(result, ntest);
1630 if (include_partition && relation->
rd_rel->relispartition)
1658 Oid statOid,
bool inh,
1677 info->
inherit = dataForm->stxdinherit;
1679 info->
kind = STATS_EXT_NDISTINCT;
1681 info->
exprs = exprs;
1683 *stainfos =
lappend(*stainfos, info);
1691 info->
inherit = dataForm->stxdinherit;
1693 info->
kind = STATS_EXT_DEPENDENCIES;
1695 info->
exprs = exprs;
1697 *stainfos =
lappend(*stainfos, info);
1705 info->
inherit = dataForm->stxdinherit;
1707 info->
kind = STATS_EXT_MCV;
1709 info->
exprs = exprs;
1711 *stainfos =
lappend(*stainfos, info);
1719 info->
inherit = dataForm->stxdinherit;
1721 info->
kind = STATS_EXT_EXPRESSIONS;
1723 info->
exprs = exprs;
1725 *stainfos =
lappend(*stainfos, info);
1750 foreach(l, statoidlist)
1761 elog(
ERROR,
"cache lookup failed for statistics object %u", statOid);
1769 for (
i = 0;
i < staForm->stxkeys.dim1;
i++)
1787 Anum_pg_statistic_ext_stxexprs, &isnull);
1854 bool include_noinherit;
1855 bool include_notnull;
1856 bool include_partition =
false;
1857 List *safe_restrictions;
1858 List *constraint_pred;
1859 List *safe_constraints;
1887 if (clause &&
IsA(clause,
Const) &&
1888 (((
Const *) clause)->constisnull ||
1924 include_partition =
true;
1936 safe_restrictions =
NIL;
1942 safe_restrictions =
lappend(safe_restrictions, rinfo->
clause);
1964 include_noinherit = !rte->
inh;
1973 include_notnull = (!rte->
inh || rte->relkind == RELKIND_PARTITIONED_TABLE);
1990 safe_constraints =
NIL;
1991 foreach(lc, constraint_pred)
1996 safe_constraints =
lappend(safe_constraints, pred);
2061 for (attrno = 1; attrno <= numattrs; attrno++)
2066 if (att_tup->attisdropped || att_tup->atthasmissing)
2077 att_tup->attcollation,
2118 true , NULL, &colvars);
2143 elog(
ERROR,
"unsupported RTE kind %d in build_physical_tlist",
2171 for (
i = 0;
i <
index->ncolumns;
i++)
2173 int indexkey =
index->indexkeys[
i];
2190 att_tup->attcollation,
2196 if (indexpr_item == NULL)
2197 elog(
ERROR,
"wrong number of index expressions");
2199 indexpr_item =
lnext(
index->indexprs, indexpr_item);
2208 if (indexpr_item != NULL)
2209 elog(
ERROR,
"wrong number of index expressions");
2247 if (result < 0.0 || result > 1.0)
2248 elog(
ERROR,
"invalid restriction selectivity: %f", result);
2288 if (result < 0.0 || result > 1.0)
2289 elog(
ERROR,
"invalid join selectivity: %f", result);
2319 req.
type = T_SupportRequestSelectivity;
2334 if (sresult != &req)
2365 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2373 req.
type = T_SupportRequestCost;
2386 if (sresult == &req)
2426 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2429 Assert(procform->proretset);
2436 req.
type = T_SupportRequestRows;
2447 if (sresult == &req)
2456 result = procform->prorows;
2492 if (
index->unique &&
2493 index->nkeycolumns == 1 &&
2494 index->indexkeys[0] == attno &&
2513 bool result =
false;
2544 elog(
ERROR,
"unrecognized CmdType: %d", (
int) event);
2563 bool result =
false;
2568 if (rte->relkind == RELKIND_FOREIGN_TABLE)
2598 elog(
ERROR,
"unrecognized CmdType: %d", (
int) event);
2617 bool result =
false;
2652 constr = tupdesc->
constr;
2678 return dependentCols;
2695 if (
root->glob->partition_directory == NULL)
2697 root->glob->partition_directory =
2704 Assert(partdesc != NULL && rel->part_scheme != NULL);
2731 foreach(lc,
root->part_schemes)
2733 part_scheme =
lfirst(lc);
2742 sizeof(
Oid) * partnatts) != 0 ||
2744 sizeof(
Oid) * partnatts) != 0 ||
2746 sizeof(
Oid) * partnatts) != 0)
2754 sizeof(
int16) * partnatts) == 0);
2756 sizeof(
bool) * partnatts) == 0);
2765#ifdef USE_ASSERT_CHECKING
2787 sizeof(
Oid) * partnatts);
2791 sizeof(
Oid) * partnatts);
2795 sizeof(
Oid) * partnatts);
2799 sizeof(
int16) * partnatts);
2803 sizeof(
bool) * partnatts);
2806 for (
i = 0;
i < partnatts;
i++)
2842 for (cnt = 0; cnt < partnatts; cnt++)
2860 elog(
ERROR,
"wrong number of partition key expressions");
2872 rel->partexprs = partexprs;
2909 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
int32 clamp_width_est(int64 tuple_width)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
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)
#define palloc_array(type, count)
#define palloc0_array(type, count)
#define palloc0_object(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)
Assert(PointerIsAligned(start, uint64))
const FormData_pg_attribute * SystemAttributeDefinition(AttrNumber attno)
#define HeapTupleIsValid(tuple)
#define SizeofHeapTupleHeader
static TransactionId HeapTupleHeaderGetXmin(const HeapTupleHeaderData *tup)
static void * GETSTRUCT(const HeapTupleData *tuple)
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 * list_difference(const List *list1, const List *list2)
List * lappend(List *list, void *datum)
List * list_concat(List *list1, const List *list2)
List * lappend_oid(List *list, Oid datum)
List * lcons(void *datum, List *list)
void list_free(List *list)
bool list_member(const List *list, const void *datum)
RegProcedure get_oprrest(Oid opno)
Oid get_constraint_index(Oid conoid)
bool get_ordering_op_properties(Oid opno, Oid *opfamily, Oid *opcintype, CompareType *cmptype)
Oid get_opclass_input_type(Oid opclass)
Oid get_opclass_family(Oid opclass)
Oid get_opfamily_member_for_cmptype(Oid opfamily, Oid lefttype, Oid righttype, CompareType cmptype)
RegProcedure get_func_support(Oid funcid)
int32 get_attavgwidth(Oid relid, AttrNumber attnum)
RegProcedure get_oprjoin(Oid opno)
int32 get_typavgwidth(Oid typid, int32 typmod)
Expr * make_ands_explicit(List *andclauses)
Var * makeVarFromTargetEntry(int varno, TargetEntry *tle)
Var * makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Oid varcollid, Index varlevelsup)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
List * make_ands_implicit(Expr *clause)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
void fix_opfuncids(Node *node)
#define IsA(nodeptr, _type_)
void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up, VarReturningType returning_type, 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)
@ 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)
#define foreach_ptr(type, var, lst)
static void * list_nth(const List *list, int n)
static ListCell * list_head(const List *l)
#define foreach_oid(var, lst)
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)
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)
void get_relation_notnullatts(PlannerInfo *root, Relation relation)
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)
get_relation_info_hook_type get_relation_info_hook
static void get_relation_statistics_worker(List **stainfos, RelOptInfo *rel, Oid statOid, bool inh, Bitmapset *keys, List *exprs)
List * build_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
static List * get_relation_statistics(PlannerInfo *root, RelOptInfo *rel, Relation relation)
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)
struct NotnullHashEntry NotnullHashEntry
static List * build_index_tlist(PlannerInfo *root, IndexOptInfo *index, Relation heapRelation)
static bool infer_collation_opclass_match(InferenceElem *elem, Relation idxRel, List *idxExprs)
static void set_relation_partition_info(PlannerInfo *root, RelOptInfo *rel, Relation relation)
bool has_unique_index(RelOptInfo *rel, AttrNumber attno)
Bitmapset * find_relation_notnullatts(PlannerInfo *root, Oid relid)
bool has_transition_tables(PlannerInfo *root, Index rti, CmdType event)
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)
Bitmapset * get_dependent_generated_columns(PlannerInfo *root, Index rti, Bitmapset *target_cols)
void get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel)
List * infer_arbiter_indexes(PlannerInfo *root)
void(* get_relation_info_hook_type)(PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel)
Expr * expression_planner(Expr *expr)
int restrict_nonsystem_relation_kind
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)
List * RelationGetIndexExpressions(Relation relation)
bytea ** RelationGetIndexAttOptions(Relation relation, bool copy)
Node * expand_generated_columns_in_expr(Node *node, Relation rel, int rt_index)
void ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
TransactionId TransactionXmin
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
amgettreeheight_function amgettreeheight
void(* amcostestimate)(struct PlannerInfo *, struct IndexPath *, double, Cost *, Cost *, Selectivity *, double *, double *) pg_node_attr(read_write_ignore)
Bitmapset * notnullattnums
NullTestType nulltesttype
PartitionBoundInfo boundinfo
PartitionStrategy strategy
struct FmgrInfo * partsupfunc
Bitmapset * notnullattnums
const struct TableAmRoutine * rd_tableam
struct IndexAmRoutine * rd_indam
struct HeapTupleData * rd_indextuple
bool(* scan_bitmap_next_tuple)(TableScanDesc scan, TupleTableSlot *slot, bool *recheck, uint64 *lossy_pages, uint64 *exact_pages)
bool(* scan_getnextslot_tidrange)(TableScanDesc scan, ScanDirection direction, TupleTableSlot *slot)
void(* scan_set_tidrange)(TableScanDesc scan, ItemPointer mintid, ItemPointer maxtid)
bool trig_delete_before_row
bool trig_update_after_row
bool trig_update_new_table
bool trig_insert_after_row
bool trig_update_before_row
bool trig_insert_new_table
bool trig_delete_old_table
bool trig_delete_after_row
bool trig_insert_before_row
bool trig_update_old_table
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)
#define RESTRICT_RELKIND_FOREIGN_TABLE
#define FirstNormalObjectId
static bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
#define ATTNULLABLE_UNKNOWN
#define ATTNULLABLE_VALID
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
bool RecoveryInProgress(void)