69 bool include_noinherit,
71 bool include_partition);
140 if (!(relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE ||
141 relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE))
143 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
144 errmsg(
"cannot open relation \"%s\"",
152 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
153 errmsg(
"cannot access temporary or unlogged relations during recovery")));
160 rel->attr_needed = (
Relids *)
162 rel->attr_widths = (
int32 *)
174 if (!inhparent || relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
217 if ((inhparent && relation->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
221 hasindex = relation->
rd_rel->relhasindex;
239 lmode =
root->simple_rte_array[varno]->rellockmode;
241 foreach(l, indexoidlist)
265 if (!
index->indisvalid)
276 if (
index->indcheckxmin &&
280 root->glob->transientPlan =
true;
294 info->indexkeys = (
int *)
palloc(
sizeof(
int) * ncolumns);
295 info->indexcollations = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
296 info->opfamily = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
297 info->opcintype = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
298 info->canreturn = (
bool *)
palloc(
sizeof(
bool) * ncolumns);
300 for (
i = 0;
i < ncolumns;
i++)
302 info->indexkeys[
i] =
index->indkey.values[
i];
306 for (
i = 0;
i < nkeycolumns;
i++)
319 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
322 amroutine = indexRelation->
rd_indam;
342 if (info->
relam == BTREE_AM_OID)
350 info->sortopfamily = info->opfamily;
351 info->reverse_sort = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
352 info->nulls_first = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
354 for (
i = 0;
i < nkeycolumns;
i++)
358 info->reverse_sort[
i] = (opt & INDOPTION_DESC) != 0;
359 info->nulls_first[
i] = (opt & INDOPTION_NULLS_FIRST) != 0;
375 info->sortopfamily = (
Oid *)
palloc(
sizeof(
Oid) * nkeycolumns);
376 info->reverse_sort = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
377 info->nulls_first = (
bool *)
palloc(
sizeof(
bool) * nkeycolumns);
379 for (
i = 0;
i < nkeycolumns;
i++)
387 info->reverse_sort[
i] = (opt & INDOPTION_DESC) != 0;
388 info->nulls_first[
i] = (opt & INDOPTION_NULLS_FIRST) != 0;
399 opcintype == info->opcintype[
i] &&
403 info->sortopfamily[
i] = opfamily;
408 info->sortopfamily = NULL;
409 info->reverse_sort = NULL;
410 info->nulls_first = NULL;
417 info->sortopfamily = NULL;
418 info->reverse_sort = NULL;
419 info->nulls_first = NULL;
434 info->sortopfamily = NULL;
435 info->reverse_sort = NULL;
436 info->nulls_first = NULL;
447 if (info->indexprs && varno != 1)
449 if (info->
indpred && varno != 1)
470 if (indexRelation->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
517 indexinfos =
lcons(info, indexinfos);
528 if (relation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
537 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
538 errmsg(
"access to non-system foreign table is restricted")));
547 rel->fdwroutine = NULL;
563 if (inhparent && relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
574 (*get_relation_info_hook) (
root, relationObjectId, inhparent, rel);
632 foreach(lc, cachedfkeys)
661 if (rti == rel->
relid)
669 memcpy(info->conkey, cachedfk->conkey,
sizeof(info->conkey));
670 memcpy(info->confkey, cachedfk->confkey,
sizeof(info->confkey));
671 memcpy(info->conpfeqop, cachedfk->conpfeqop,
sizeof(info->conpfeqop));
741 varno =
root->parse->resultRelation;
769 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
770 errmsg(
"whole row unique index inference specifications are not supported")));
786 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
787 errmsg(
"constraint in ON CONFLICT clause has no associated index")));
796 foreach(l, indexList)
815 idxRel =
index_open(indexoid, rte->rellockmode);
818 if (!idxForm->indisvalid)
832 if (indexOidFromConstraint == idxForm->indexrelid)
836 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
837 errmsg(
"ON CONFLICT DO UPDATE not supported with exclusion constraints")));
839 results =
lappend_oid(results, idxForm->indexrelid);
845 else if (indexOidFromConstraint !=
InvalidOid)
856 if (!idxForm->indisunique)
863 if (idxForm->indisexclusion)
868 for (natt = 0; natt < idxForm->indnkeyatts; natt++)
870 int attno = idxRel->
rd_index->indkey.values[natt];
878 if (!
bms_equal(indexedAttrs, inferAttrs))
883 if (idxExprs && varno != 1)
937 if (predExprs && varno != 1)
943 results =
lappend_oid(results, idxForm->indexrelid);
953 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
954 errmsg(
"there is no unique or exclusion constraint matching the ON CONFLICT specification")));
1011 for (natt = 1; natt <= idxRel->
rd_att->
natts; natt++)
1016 int attno = idxRel->
rd_index->indkey.values[natt - 1];
1022 (inferopfamily != opfamily || inferopcinputtype != opcinputtype))
1038 if (((
Var *) elem->
expr)->varattno == attno)
1041 else if (attno == 0)
1043 Node *nattExpr =
list_nth(idxExprs, (natt - 1) - nplain);
1070 BlockNumber *pages,
double *tuples,
double *allvisfrac)
1078 if (RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
1083 else if (rel->
rd_rel->relkind == RELKIND_INDEX)
1105 reltuples = (
double) rel->
rd_rel->reltuples;
1121 if (reltuples >= 0 && relpages > 0)
1122 density = reltuples / (double) relpages;
1150 *tuples = rint(density * (
double) curpages);
1158 if (relallvisible == 0 || curpages <= 0)
1160 else if ((
double) relallvisible >= curpages)
1163 *allvisfrac = (double) relallvisible / curpages;
1173 *pages = rel->
rd_rel->relpages;
1174 *tuples = rel->
rd_rel->reltuples;
1196 int64 tuple_width = 0;
1204 if (att->attisdropped)
1208 if (attr_widths != NULL && attr_widths[
i] > 0)
1210 tuple_width += attr_widths[
i];
1216 if (item_width <= 0)
1221 if (attr_widths != NULL)
1222 attr_widths[
i] = item_width;
1223 tuple_width += item_width;
1279 bool include_noinherit,
1280 bool include_notnull,
1281 bool include_partition)
1299 for (
i = 0;
i < num_check;
i++)
1355 for (
i = 1;
i <= natts;
i++)
1367 wholeatt->atttypmod,
1368 wholeatt->attcollation,
1377 ntest->argisrow =
false;
1379 result =
lappend(result, ntest);
1388 if (include_partition && relation->
rd_rel->relispartition)
1408 Oid statOid,
bool inh,
1427 info->
inherit = dataForm->stxdinherit;
1429 info->
kind = STATS_EXT_NDISTINCT;
1431 info->
exprs = exprs;
1433 *stainfos =
lappend(*stainfos, info);
1441 info->
inherit = dataForm->stxdinherit;
1443 info->
kind = STATS_EXT_DEPENDENCIES;
1445 info->
exprs = exprs;
1447 *stainfos =
lappend(*stainfos, info);
1455 info->
inherit = dataForm->stxdinherit;
1457 info->
kind = STATS_EXT_MCV;
1459 info->
exprs = exprs;
1461 *stainfos =
lappend(*stainfos, info);
1469 info->
inherit = dataForm->stxdinherit;
1471 info->
kind = STATS_EXT_EXPRESSIONS;
1473 info->
exprs = exprs;
1475 *stainfos =
lappend(*stainfos, info);
1499 foreach(l, statoidlist)
1510 elog(
ERROR,
"cache lookup failed for statistics object %u", statOid);
1518 for (
i = 0;
i < staForm->stxkeys.dim1;
i++)
1536 Anum_pg_statistic_ext_stxexprs, &isnull);
1599 bool include_noinherit;
1600 bool include_notnull;
1601 bool include_partition =
false;
1602 List *safe_restrictions;
1603 List *constraint_pred;
1604 List *safe_constraints;
1632 if (clause &&
IsA(clause,
Const) &&
1633 (((
Const *) clause)->constisnull ||
1669 include_partition =
true;
1681 safe_restrictions =
NIL;
1687 safe_restrictions =
lappend(safe_restrictions, rinfo->
clause);
1709 include_noinherit = !rte->
inh;
1718 include_notnull = (!rte->
inh || rte->relkind == RELKIND_PARTITIONED_TABLE);
1735 safe_constraints =
NIL;
1736 foreach(lc, constraint_pred)
1741 safe_constraints =
lappend(safe_constraints, pred);
1806 for (attrno = 1; attrno <= numattrs; attrno++)
1811 if (att_tup->attisdropped || att_tup->atthasmissing)
1822 att_tup->attcollation,
1863 true , NULL, &colvars);
1888 elog(
ERROR,
"unsupported RTE kind %d in build_physical_tlist",
1916 for (
i = 0;
i <
index->ncolumns;
i++)
1918 int indexkey =
index->indexkeys[
i];
1935 att_tup->attcollation,
1941 if (indexpr_item == NULL)
1942 elog(
ERROR,
"wrong number of index expressions");
1944 indexpr_item =
lnext(
index->indexprs, indexpr_item);
1953 if (indexpr_item != NULL)
1954 elog(
ERROR,
"wrong number of index expressions");
1992 if (result < 0.0 || result > 1.0)
1993 elog(
ERROR,
"invalid restriction selectivity: %f", result);
2033 if (result < 0.0 || result > 1.0)
2034 elog(
ERROR,
"invalid join selectivity: %f", result);
2072 req.
type = T_SupportRequestSelectivity;
2088 if (sresult != &req)
2119 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2127 req.
type = T_SupportRequestCost;
2140 if (sresult == &req)
2180 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2183 Assert(procform->proretset);
2190 req.
type = T_SupportRequestRows;
2201 if (sresult == &req)
2210 result = procform->prorows;
2246 if (
index->unique &&
2247 index->nkeycolumns == 1 &&
2248 index->indexkeys[0] == attno &&
2267 bool result =
false;
2298 elog(
ERROR,
"unrecognized CmdType: %d", (
int) event);
2317 bool result =
false;
2352 constr = tupdesc->
constr;
2378 return dependentCols;
2395 if (
root->glob->partition_directory == NULL)
2397 root->glob->partition_directory =
2404 Assert(partdesc != NULL && rel->part_scheme != NULL);
2431 foreach(lc,
root->part_schemes)
2433 part_scheme =
lfirst(lc);
2442 sizeof(
Oid) * partnatts) != 0 ||
2444 sizeof(
Oid) * partnatts) != 0 ||
2446 sizeof(
Oid) * partnatts) != 0)
2454 sizeof(
int16) * partnatts) == 0);
2456 sizeof(
bool) * partnatts) == 0);
2465#ifdef USE_ASSERT_CHECKING
2487 sizeof(
Oid) * partnatts);
2491 sizeof(
Oid) * partnatts);
2495 sizeof(
Oid) * partnatts);
2499 sizeof(
int16) * partnatts);
2503 sizeof(
bool) * partnatts);
2507 for (
i = 0;
i < partnatts;
i++)
2543 for (cnt = 0; cnt < partnatts; cnt++)
2561 elog(
ERROR,
"wrong number of partition key expressions");
2573 rel->partexprs = partexprs;
2581 rel->nullable_partexprs = (
List **)
palloc0(
sizeof(
List *) * partnatts);
2610 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)
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)
static void * list_nth(const List *list, int n)
static ListCell * list_head(const List *l)
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)
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)
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)
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)
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)
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_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_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)
#define RESTRICT_RELKIND_FOREIGN_TABLE
bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
#define FirstNormalObjectId
#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)