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;
282 info->indexkeys = (
int *)
palloc(
sizeof(
int) * ncolumns);
283 info->indexcollations = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
284 info->opfamily = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
285 info->opcintype = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
286 info->canreturn = (
bool *)
palloc(
sizeof(
bool) * ncolumns);
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;
339 info->reverse_sort = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
340 info->nulls_first = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
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;
363 info->sortopfamily = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
364 info->reverse_sort = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
365 info->nulls_first = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
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;
435 if (info->indexprs && varno != 1)
437 if (info->
indpred && varno != 1)
458 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
505 indexinfos =
lcons(info, indexinfos);
516 if (relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
525 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
526 errmsg(
"access to non-system foreign table is restricted")));
535 rel->fdwroutine = NULL;
551 if (inhparent && relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
562 (*get_relation_info_hook) (
root, relationObjectId, inhparent, rel);
620 foreach(lc, cachedfkeys)
649 if (rti == rel->
relid)
657 memcpy(info->conkey, cachedfk->conkey,
sizeof(info->conkey));
658 memcpy(info->confkey, cachedfk->confkey,
sizeof(info->confkey));
659 memcpy(info->conpfeqop, cachedfk->conpfeqop,
sizeof(info->conpfeqop));
695 if (
root->glob->rel_notnullatts_hash == NULL)
709 root->glob->rel_notnullatts_hash = hashtab;
760 if (
root->glob->rel_notnullatts_hash == NULL)
818 bool foundValid =
false;
835 varno =
root->parse->resultRelation;
853 if (!
IsA(elem->expr,
Var))
856 inferElems =
lappend(inferElems, elem->expr);
860 var = (
Var *) elem->expr;
865 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
866 errmsg(
"whole row unique index inference specifications are not supported")));
886 idxRel =
index_open(indexoid, rte->rellockmode);
887 indexRelList =
lappend(indexRelList, idxRel);
904 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
905 errmsg(
"constraint in ON CONFLICT clause has no associated index")));
915 if (indexOidFromConstraint == idxForm->indexrelid)
918 Assert(idxForm->indisready);
925 for (
int natt = 0; natt < idxForm->indnkeyatts; natt++)
929 attno = idxRel->rd_index->indkey.values[natt];
963 idxForm = idxRel->rd_index;
980 if (!idxForm->indisready)
994 if (indexOidFromConstraint == idxForm->indexrelid)
998 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
999 errmsg(
"ON CONFLICT DO UPDATE not supported with exclusion constraints")));
1002 results =
lappend_oid(results, idxForm->indexrelid);
1003 foundValid |= idxForm->indisvalid;
1006 else if (indexOidFromConstraint !=
InvalidOid)
1022 if (!idxForm->indisunique)
1030 if (idxForm->indisexclusion)
1034 indexedAttrs = NULL;
1035 for (natt = 0; natt < idxForm->indnkeyatts; natt++)
1037 int attno = idxRel->rd_index->indkey.values[natt];
1045 if (!
bms_equal(indexedAttrs, inferAttrs))
1050 if (idxExprs && varno != 1)
1078 if (
IsA(elem->expr,
Var))
1112 if (predExprs && varno != 1)
1133 results =
lappend_oid(results, idxForm->indexrelid);
1134 foundValid |= idxForm->indisvalid;
1148 if (results ==
NIL || !foundValid)
1150 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
1151 errmsg(
"there is no unique or exclusion constraint matching the ON CONFLICT specification")));
1208 for (natt = 1; natt <= idxRel->
rd_att->
natts; natt++)
1213 int attno = idxRel->
rd_index->indkey.values[natt - 1];
1219 (inferopfamily != opfamily || inferopcinputtype != opcinputtype))
1235 if (((
Var *) elem->
expr)->varattno == attno)
1238 else if (attno == 0)
1240 Node *nattExpr =
list_nth(idxExprs, (natt - 1) - nplain);
1267 BlockNumber *pages,
double *tuples,
double *allvisfrac)
1275 if (RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
1280 else if (rel->
rd_rel->relkind == RELKIND_INDEX)
1302 reltuples = (
double) rel->
rd_rel->reltuples;
1318 if (reltuples >= 0 && relpages > 0)
1319 density = reltuples / (double) relpages;
1347 *tuples = rint(density * (
double) curpages);
1355 if (relallvisible == 0 || curpages <= 0)
1357 else if ((
double) relallvisible >= curpages)
1360 *allvisfrac = (double) relallvisible / curpages;
1370 *pages = rel->
rd_rel->relpages;
1371 *tuples = rel->
rd_rel->reltuples;
1393 int64 tuple_width = 0;
1401 if (att->attisdropped)
1405 if (attr_widths != NULL && attr_widths[
i] > 0)
1407 tuple_width += attr_widths[
i];
1413 if (item_width <= 0)
1418 if (attr_widths != NULL)
1419 attr_widths[
i] = item_width;
1420 tuple_width += item_width;
1476 bool include_noinherit,
1477 bool include_notnull,
1478 bool include_partition)
1496 for (
i = 0;
i < num_check;
i++)
1556 for (
i = 1;
i <= natts;
i++)
1568 wholeatt->atttypmod,
1569 wholeatt->attcollation,
1578 ntest->argisrow =
false;
1580 result =
lappend(result, ntest);
1589 if (include_partition && relation->
rd_rel->relispartition)
1617 Oid statOid,
bool inh,
1636 info->
inherit = dataForm->stxdinherit;
1638 info->
kind = STATS_EXT_NDISTINCT;
1640 info->
exprs = exprs;
1642 *stainfos =
lappend(*stainfos, info);
1650 info->
inherit = dataForm->stxdinherit;
1652 info->
kind = STATS_EXT_DEPENDENCIES;
1654 info->
exprs = exprs;
1656 *stainfos =
lappend(*stainfos, info);
1664 info->
inherit = dataForm->stxdinherit;
1666 info->
kind = STATS_EXT_MCV;
1668 info->
exprs = exprs;
1670 *stainfos =
lappend(*stainfos, info);
1678 info->
inherit = dataForm->stxdinherit;
1680 info->
kind = STATS_EXT_EXPRESSIONS;
1682 info->
exprs = exprs;
1684 *stainfos =
lappend(*stainfos, info);
1709 foreach(l, statoidlist)
1720 elog(
ERROR,
"cache lookup failed for statistics object %u", statOid);
1728 for (
i = 0;
i < staForm->stxkeys.dim1;
i++)
1746 Anum_pg_statistic_ext_stxexprs, &isnull);
1813 bool include_noinherit;
1814 bool include_notnull;
1815 bool include_partition =
false;
1816 List *safe_restrictions;
1817 List *constraint_pred;
1818 List *safe_constraints;
1846 if (clause &&
IsA(clause,
Const) &&
1847 (((
Const *) clause)->constisnull ||
1883 include_partition =
true;
1895 safe_restrictions =
NIL;
1901 safe_restrictions =
lappend(safe_restrictions, rinfo->
clause);
1923 include_noinherit = !rte->
inh;
1932 include_notnull = (!rte->
inh || rte->relkind == RELKIND_PARTITIONED_TABLE);
1949 safe_constraints =
NIL;
1950 foreach(lc, constraint_pred)
1955 safe_constraints =
lappend(safe_constraints, pred);
2020 for (attrno = 1; attrno <= numattrs; attrno++)
2025 if (att_tup->attisdropped || att_tup->atthasmissing)
2036 att_tup->attcollation,
2077 true , NULL, &colvars);
2102 elog(
ERROR,
"unsupported RTE kind %d in build_physical_tlist",
2130 for (
i = 0;
i <
index->ncolumns;
i++)
2132 int indexkey =
index->indexkeys[
i];
2149 att_tup->attcollation,
2155 if (indexpr_item == NULL)
2156 elog(
ERROR,
"wrong number of index expressions");
2158 indexpr_item =
lnext(
index->indexprs, indexpr_item);
2167 if (indexpr_item != NULL)
2168 elog(
ERROR,
"wrong number of index expressions");
2206 if (result < 0.0 || result > 1.0)
2207 elog(
ERROR,
"invalid restriction selectivity: %f", result);
2247 if (result < 0.0 || result > 1.0)
2248 elog(
ERROR,
"invalid join selectivity: %f", result);
2278 req.
type = T_SupportRequestSelectivity;
2293 if (sresult != &req)
2324 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2332 req.
type = T_SupportRequestCost;
2345 if (sresult == &req)
2385 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2388 Assert(procform->proretset);
2395 req.
type = T_SupportRequestRows;
2406 if (sresult == &req)
2415 result = procform->prorows;
2451 if (
index->unique &&
2452 index->nkeycolumns == 1 &&
2453 index->indexkeys[0] == attno &&
2472 bool result =
false;
2503 elog(
ERROR,
"unrecognized CmdType: %d", (
int) event);
2522 bool result =
false;
2527 if (rte->relkind == RELKIND_FOREIGN_TABLE)
2557 elog(
ERROR,
"unrecognized CmdType: %d", (
int) event);
2576 bool result =
false;
2611 constr = tupdesc->
constr;
2637 return dependentCols;
2654 if (
root->glob->partition_directory == NULL)
2656 root->glob->partition_directory =
2663 Assert(partdesc != NULL && rel->part_scheme != NULL);
2690 foreach(lc,
root->part_schemes)
2692 part_scheme =
lfirst(lc);
2701 sizeof(
Oid) * partnatts) != 0 ||
2703 sizeof(
Oid) * partnatts) != 0 ||
2705 sizeof(
Oid) * partnatts) != 0)
2713 sizeof(
int16) * partnatts) == 0);
2715 sizeof(
bool) * partnatts) == 0);
2724#ifdef USE_ASSERT_CHECKING
2746 sizeof(
Oid) * partnatts);
2750 sizeof(
Oid) * partnatts);
2754 sizeof(
Oid) * partnatts);
2758 sizeof(
int16) * partnatts);
2762 sizeof(
bool) * partnatts);
2766 for (
i = 0;
i < partnatts;
i++)
2802 for (cnt = 0; cnt < partnatts; cnt++)
2820 elog(
ERROR,
"wrong number of partition key expressions");
2832 rel->partexprs = partexprs;
2840 rel->nullable_partexprs = (
List **)
palloc0(
sizeof(
List *) * partnatts);
2869 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)
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)
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)
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)
#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)