58 #include "utils/fmgroids.h"
156 bool skip_locked =
false;
160 bool disable_page_skipping =
false;
161 bool process_main =
true;
162 bool process_toast =
true;
164 bool skip_database_stats =
false;
165 bool only_database_stats =
false;
188 if (strcmp(opt->
defname,
"verbose") == 0)
190 else if (strcmp(opt->
defname,
"skip_locked") == 0)
192 else if (strcmp(opt->
defname,
"buffer_usage_limit") == 0)
196 char *vac_buffer_size;
209 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
210 errmsg(
"BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB",
212 hintmsg ?
errhint(
"%s",
_(hintmsg)) : 0));
219 (
errcode(ERRCODE_SYNTAX_ERROR),
224 else if (strcmp(opt->
defname,
"analyze") == 0)
226 else if (strcmp(opt->
defname,
"freeze") == 0)
228 else if (strcmp(opt->
defname,
"full") == 0)
230 else if (strcmp(opt->
defname,
"disable_page_skipping") == 0)
232 else if (strcmp(opt->
defname,
"index_cleanup") == 0)
248 else if (strcmp(opt->
defname,
"process_main") == 0)
250 else if (strcmp(opt->
defname,
"process_toast") == 0)
252 else if (strcmp(opt->
defname,
"truncate") == 0)
254 else if (strcmp(opt->
defname,
"parallel") == 0)
256 if (opt->
arg == NULL)
259 (
errcode(ERRCODE_SYNTAX_ERROR),
260 errmsg(
"parallel option requires a value between 0 and %d",
271 (
errcode(ERRCODE_SYNTAX_ERROR),
272 errmsg(
"parallel workers for vacuum must be between 0 and %d",
286 else if (strcmp(opt->
defname,
"skip_database_stats") == 0)
288 else if (strcmp(opt->
defname,
"only_database_stats") == 0)
292 (
errcode(ERRCODE_SYNTAX_ERROR),
318 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
319 errmsg(
"VACUUM FULL cannot be performed in parallel")));
329 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
330 errmsg(
"BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL")));
337 foreach(lc, vacstmt->
rels)
343 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
344 errmsg(
"ANALYZE option must be specified when a column list is provided")));
355 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
356 errmsg(
"VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL")));
362 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
363 errmsg(
"PROCESS_TOAST required with VACUUM FULL")));
371 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
372 errmsg(
"ONLY_DATABASE_STATS cannot be specified with a list of tables")));
380 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
381 errmsg(
"ONLY_DATABASE_STATS cannot be specified with other VACUUM options")));
450 vacuum(vacstmt->
rels, ¶ms, bstrategy, vac_context, isTopLevel);
482 static bool in_vacuum =
false;
484 const char *stmttype;
485 volatile bool in_outer_xact,
503 in_outer_xact =
false;
515 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
516 errmsg(
"%s cannot be executed from VACUUM or ANALYZE",
528 else if (relations !=
NIL)
533 foreach(lc, relations)
564 use_own_xacts =
true;
569 use_own_xacts =
true;
570 else if (in_outer_xact)
571 use_own_xacts =
false;
573 use_own_xacts =
true;
575 use_own_xacts =
false;
617 foreach(
cur, relations)
642 vrel->
va_cols, in_outer_xact, bstrategy);
736 (
errmsg(
"permission denied to vacuum \"%s\", skipping it",
749 (
errmsg(
"permission denied to analyze \"%s\", skipping it",
768 bool rel_lock =
true;
805 if (relation == NULL)
826 (
errcode(ERRCODE_LOCK_NOT_AVAILABLE),
827 errmsg(
"skipping vacuum of \"%s\" --- lock not available",
832 errmsg(
"skipping vacuum of \"%s\" --- relation no longer exists",
847 (
errcode(ERRCODE_LOCK_NOT_AVAILABLE),
848 errmsg(
"skipping analyze of \"%s\" --- lock not available",
853 errmsg(
"skipping analyze of \"%s\" --- relation no longer exists",
886 vacrels =
lappend(vacrels, vrel);
923 (
errcode(ERRCODE_LOCK_NOT_AVAILABLE),
924 errmsg(
"skipping vacuum of \"%s\" --- lock not available",
928 (
errcode(ERRCODE_LOCK_NOT_AVAILABLE),
929 errmsg(
"skipping analyze of \"%s\" --- lock not available",
940 elog(
ERROR,
"cache lookup failed for relation %u", relid);
957 include_parts = (classForm->relkind == RELKIND_PARTITIONED_TABLE);
974 foreach(part_lc, part_oids)
978 if (part_oid == relid)
1031 Oid relid = classForm->oid;
1038 if (classForm->relkind != RELKIND_RELATION &&
1039 classForm->relkind != RELKIND_MATVIEW &&
1040 classForm->relkind != RELKIND_PARTITIONED_TABLE)
1082 multixact_freeze_min_age,
1084 multixact_freeze_table_age,
1085 effective_multixact_freeze_max_age;
1088 aggressiveXIDCutoff;
1091 aggressiveMXIDCutoff;
1122 &limit_xmin, &limit_ts))
1159 safeOldestMxact = nextMXID - effective_multixact_freeze_max_age;
1164 (
errmsg(
"cutoff for removing and freezing tuples is far in the past"),
1165 errhint(
"Close open transactions soon to avoid wraparound problems.\n"
1166 "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
1169 (
errmsg(
"cutoff for freezing multixacts is far in the past"),
1170 errhint(
"Close open transactions soon to avoid wraparound problems.\n"
1171 "You might also need to commit or roll back old prepared transactions, or drop stale replication slots.")));
1179 if (freeze_min_age < 0)
1182 Assert(freeze_min_age >= 0);
1198 if (multixact_freeze_min_age < 0)
1200 multixact_freeze_min_age =
Min(multixact_freeze_min_age,
1201 effective_multixact_freeze_max_age / 2);
1202 Assert(multixact_freeze_min_age >= 0);
1221 if (freeze_table_age < 0)
1224 Assert(freeze_table_age >= 0);
1225 aggressiveXIDCutoff = nextXID - freeze_table_age;
1229 aggressiveXIDCutoff))
1240 if (multixact_freeze_table_age < 0)
1242 multixact_freeze_table_age =
1243 Min(multixact_freeze_table_age,
1244 effective_multixact_freeze_max_age * 0.95);
1245 Assert(multixact_freeze_table_age >= 0);
1246 aggressiveMXIDCutoff = nextMXID - multixact_freeze_table_age;
1250 aggressiveMXIDCutoff))
1271 int skip_index_vacuum;
1330 double scanned_tuples)
1333 double old_rel_tuples = relation->
rd_rel->reltuples;
1335 double unscanned_pages;
1336 double total_tuples;
1339 if (scanned_pages >= total_pages)
1340 return scanned_tuples;
1356 if (old_rel_pages == total_pages &&
1357 scanned_pages < (
double) total_pages * 0.02)
1358 return old_rel_tuples;
1359 if (scanned_pages <= 1)
1360 return old_rel_tuples;
1366 if (old_rel_tuples < 0 || old_rel_pages == 0)
1367 return floor((scanned_tuples / scanned_pages) * total_pages + 0.5);
1375 old_density = old_rel_tuples / old_rel_pages;
1376 unscanned_pages = (double) total_pages - (
double) scanned_pages;
1377 total_tuples = old_density * unscanned_pages + scanned_tuples;
1378 return floor(total_tuples + 0.5);
1428 bool *frozenxid_updated,
bool *minmulti_updated,
1446 elog(
ERROR,
"pg_class entry for relid %u vanished during vacuuming",
1453 if (pgcform->relpages != (
int32) num_pages)
1455 pgcform->relpages = (
int32) num_pages;
1458 if (pgcform->reltuples != (
float4) num_tuples)
1460 pgcform->reltuples = (
float4) num_tuples;
1463 if (pgcform->relallvisible != (
int32) num_all_visible_pages)
1465 pgcform->relallvisible = (
int32) num_all_visible_pages;
1476 if (pgcform->relhasindex && !hasindex)
1478 pgcform->relhasindex =
false;
1483 if (pgcform->relhasrules && relation->
rd_rules == NULL)
1485 pgcform->relhasrules =
false;
1488 if (pgcform->relhastriggers && relation->
trigdesc == NULL)
1490 pgcform->relhastriggers =
false;
1505 oldfrozenxid = pgcform->relfrozenxid;
1507 if (frozenxid_updated)
1508 *frozenxid_updated =
false;
1511 bool update =
false;
1516 futurexid = update =
true;
1520 pgcform->relfrozenxid = frozenxid;
1522 if (frozenxid_updated)
1523 *frozenxid_updated =
true;
1528 oldminmulti = pgcform->relminmxid;
1530 if (minmulti_updated)
1531 *minmulti_updated =
false;
1534 bool update =
false;
1539 futuremxid = update =
true;
1543 pgcform->relminmxid = minmulti;
1545 if (minmulti_updated)
1546 *minmulti_updated =
true;
1559 errmsg_internal(
"overwrote invalid relfrozenxid value %u with new value %u for table \"%s\"",
1560 oldfrozenxid, frozenxid,
1565 errmsg_internal(
"overwrote invalid relminmxid value %u with new value %u for table \"%s\"",
1566 oldminmulti, minmulti,
1653 if (classForm->relkind != RELKIND_RELATION &&
1654 classForm->relkind != RELKIND_MATVIEW &&
1655 classForm->relkind != RELKIND_TOASTVALUE)
1690 newFrozenXid = classForm->relfrozenxid;
1704 newMinMulti = classForm->relminmxid;
1728 Anum_pg_database_oid,
1748 if (dbform->datfrozenxid != newFrozenXid &&
1752 dbform->datfrozenxid = newFrozenXid;
1756 newFrozenXid = dbform->datfrozenxid;
1759 if (dbform->datminmxid != newMinMulti &&
1763 dbform->datminmxid = newMinMulti;
1767 newMinMulti = dbform->datminmxid;
1782 lastSaneFrozenXid, lastSaneMinMulti);
1813 Oid oldestxid_datoid;
1814 Oid minmulti_datoid;
1816 bool frozenAlreadyWrapped =
false;
1870 frozenAlreadyWrapped =
true;
1874 oldestxid_datoid = dbform->oid;
1880 minmulti_datoid = dbform->oid;
1894 if (frozenAlreadyWrapped)
1897 (
errmsg(
"some databases have not been vacuumed in over 2 billion transactions"),
1898 errdetail(
"You might have already suffered transaction-wraparound data loss.")));
1963 int save_sec_context;
2057 if (rel->
rd_rel->relkind != RELKIND_RELATION &&
2058 rel->
rd_rel->relkind != RELKIND_MATVIEW &&
2059 rel->
rd_rel->relkind != RELKIND_TOASTVALUE &&
2060 rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
2063 (
errmsg(
"skipping \"%s\" --- cannot vacuum non-tables or special system tables",
2091 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
2124 vacuum_index_cleanup =
2133 Assert(vacuum_index_cleanup ==
2161 toast_relid = rel->
rd_rel->reltoastrelid;
2233 memcpy(&toast_vacuum_params, params,
sizeof(
VacuumParams));
2236 vacuum_rel(toast_relid, NULL, &toast_vacuum_params,
true, bstrategy);
2283 foreach(indexoidscan, indexoidlist)
2290 (*Irel)[
i++] = indrel;
2485 (
void *) dead_items);
2488 (
errmsg(
"scanned index \"%s\" to remove %d row versions",
2507 (
errmsg(
"index \"%s\" now contains %.0f row versions in %u pages",
2511 errdetail(
"%.0f index row versions were removed.\n"
2512 "%u index pages were newly deleted.\n"
2513 "%u index pages are currently deleted, of which %u are currently reusable.",
2559 if (item < litem || item > ritem)
2568 return (
res != NULL);
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
static uint32 pg_atomic_sub_fetch_u32(volatile pg_atomic_uint32 *ptr, int32 sub_)
static uint32 pg_atomic_add_fetch_u32(volatile pg_atomic_uint32 *ptr, int32 add_)
static uint32 pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr)
void VacuumUpdateCosts(void)
int autovacuum_multixact_freeze_max_age
int autovacuum_freeze_max_age
bool IsAutoVacuumWorkerProcess(void)
void AutoVacuumUpdateCostLimit(void)
#define MAX_PARALLEL_WORKER_LIMIT
TransactionId MultiXactId
#define OidIsValid(objectId)
void TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid)
void cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params)
void analyze_rel(Oid relid, RangeVar *relation, VacuumParams *params, List *va_cols, bool in_outer_xact, BufferAccessStrategy bstrategy)
void AdvanceOldestCommitTsXid(TransactionId oldestXact)
void TruncateCommitTs(TransactionId oldestXact)
static void PGresult * res
elog(ERROR, "%s: %s", p2, msg)
int32 defGetInt32(DefElem *def)
bool defGetBoolean(DefElem *def)
char * defGetString(DefElem *def)
int errmsg_internal(const char *fmt,...)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
BufferAccessStrategy GetAccessStrategyWithSize(BufferAccessStrategyType btype, int ring_size_kb)
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
volatile sig_atomic_t InterruptPending
int VacuumBufferUsageLimit
bool parse_int(const char *value, int *result, int flags, const char **hintmsg)
int NewGUCNestLevel(void)
void AtEOXact_GUC(bool isCommit, int nestLevel)
#define GUC_check_errdetail
void ProcessConfigFile(GucContext context)
void heap_inplace_update(Relation relation, HeapTuple tuple)
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
HeapTuple heap_copytuple(HeapTuple tuple)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static int64 itemptr_encode(ItemPointer itemptr)
IndexBulkDeleteResult * index_vacuum_cleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *istat)
void index_close(Relation relation, LOCKMODE lockmode)
IndexBulkDeleteResult * index_bulk_delete(IndexVacuumInfo *info, IndexBulkDeleteResult *istat, IndexBulkDeleteCallback callback, void *callback_state)
Relation index_open(Oid relationId, LOCKMODE lockmode)
volatile sig_atomic_t ConfigReloadPending
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
ItemPointerData * ItemPointer
struct ItemPointerData ItemPointerData
Assert(fmt[strlen(fmt) - 1] !='\n')
List * lappend(List *list, void *datum)
void list_free(List *list)
List * list_concat(List *list1, const List *list2)
bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode)
void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode)
void LockDatabaseFrozenIds(LOCKMODE lockmode)
#define AccessExclusiveLock
#define ShareUpdateExclusiveLock
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
VacuumRelation * makeVacuumRelation(RangeVar *relation, Oid oid, List *va_cols)
void pfree(void *pointer)
void MemoryContextDelete(MemoryContext context)
MemoryContext PortalContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define MIN_BAS_VAC_RING_SIZE_KB
#define MAX_BAS_VAC_RING_SIZE_KB
#define SECURITY_RESTRICTED_OPERATION
#define CHECK_FOR_INTERRUPTS()
void GetUserIdAndSecContext(Oid *userid, int *sec_context)
void SetUserIdAndSecContext(Oid userid, int sec_context)
bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2)
bool MultiXactIdPrecedesOrEquals(MultiXactId multi1, MultiXactId multi2)
void SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid, bool is_startup)
MultiXactId GetOldestMultiXactId(void)
int MultiXactMemberFreezeThreshold(void)
MultiXactId ReadNextMultiXactId(void)
void TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB)
#define MultiXactIdIsValid(multi)
Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, uint32 flags, RangeVarGetRelidCallback callback, void *callback_arg)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
int parser_errposition(ParseState *pstate, int location)
#define ERRCODE_DATA_CORRUPTED
FormData_pg_class * Form_pg_class
TransactionId datfrozenxid
FormData_pg_database * Form_pg_database
List * find_all_inheritors(Oid parentrelId, LOCKMODE lockmode, List **numparents)
#define lfirst_node(type, lc)
static int list_length(const List *l)
static rewind_source * source
#define ERRCODE_UNDEFINED_TABLE
#define PostmasterIsAlive()
int pg_strcasecmp(const char *s1, const char *s2)
static Datum ObjectIdGetDatum(Oid X)
#define PROC_VACUUM_FOR_WRAPAROUND
TransactionId GetOldestNonRemovableTransactionId(Relation rel)
static long analyze(struct nfa *nfa)
#define RelationGetRelid(relation)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
@ STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO
@ STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF
@ STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON
List * RelationGetIndexList(Relation relation)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void pg_usleep(long microsec)
Snapshot GetTransactionSnapshot(void)
void PushActiveSnapshot(Snapshot snapshot)
bool ActiveSnapshotSet(void)
bool TransactionIdLimitedForOldSnapshots(TransactionId recentXmin, Relation relation, TransactionId *limit_xid, TimestampTz *limit_ts)
void PopActiveSnapshot(void)
void SetOldSnapshotThresholdTimestamp(TimestampTz ts, TransactionId xlimit)
static bool OldSnapshotThresholdActive(void)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation try_relation_open(Oid relationId, LOCKMODE lockmode)
#define BTEqualStrategyNumber
BlockNumber pages_deleted
BlockNumber pages_newly_deleted
ItemPointerData items[FLEXIBLE_ARRAY_MEMBER]
TransactionId FreezeLimit
TransactionId relfrozenxid
MultiXactId MultiXactCutoff
int multixact_freeze_min_age
int multixact_freeze_table_age
VacOptValue index_cleanup
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
#define SearchSysCacheCopy1(cacheId, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, struct ScanKeyData *key)
static void table_endscan(TableScanDesc scan)
static void table_relation_vacuum(Relation rel, struct VacuumParams *params, BufferAccessStrategy bstrategy)
bool has_partition_ancestor_privs(Oid relid, Oid userid, AclMode acl)
bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
bool TransactionIdPrecedesOrEquals(TransactionId id1, TransactionId id2)
static TransactionId ReadNextTransactionId(void)
#define FirstNormalTransactionId
#define TransactionIdIsValid(xid)
#define TransactionIdIsNormal(xid)
static bool vac_tid_reaped(ItemPointer itemptr, void *state)
IndexBulkDeleteResult * vac_bulkdel_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat, VacDeadItems *dead_items)
void ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
pg_atomic_uint32 * VacuumActiveNWorkers
static void vac_truncate_clog(TransactionId frozenXID, MultiXactId minMulti, TransactionId lastSaneFrozenXid, MultiXactId lastSaneMinMulti)
Size vac_max_items_to_alloc_size(int max_items)
int vacuum_freeze_min_age
static List * expand_vacuum_rel(VacuumRelation *vrel, MemoryContext vac_context, int options)
static double compute_parallel_delay(void)
static VacOptValue get_vacoptval_from_boolean(DefElem *def)
void vac_open_indexes(Relation relation, LOCKMODE lockmode, int *nindexes, Relation **Irel)
void vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, MemoryContext vac_context, bool isTopLevel)
bool check_vacuum_buffer_usage_limit(int *newval, void **extra, GucSource source)
int VacuumCostBalanceLocal
static List * get_all_vacuum_rels(MemoryContext vac_context, int options)
void vac_update_relstats(Relation relation, BlockNumber num_pages, double num_tuples, BlockNumber num_all_visible_pages, bool hasindex, TransactionId frozenxid, MultiXactId minmulti, bool *frozenxid_updated, bool *minmulti_updated, bool in_outer_xact)
int vacuum_multixact_freeze_table_age
int vacuum_freeze_table_age
int vacuum_multixact_failsafe_age
static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, bool skip_privs, BufferAccessStrategy bstrategy)
int vacuum_multixact_freeze_min_age
Relation vacuum_open_relation(Oid relid, RangeVar *relation, bits32 options, bool verbose, LOCKMODE lmode)
void vac_close_indexes(int nindexes, Relation *Irel, LOCKMODE lockmode)
void vacuum_delay_point(void)
void vac_update_datfrozenxid(void)
bool vacuum_get_cutoffs(Relation rel, const VacuumParams *params, struct VacuumCutoffs *cutoffs)
bool vacuum_xid_failsafe_check(const struct VacuumCutoffs *cutoffs)
pg_atomic_uint32 * VacuumSharedCostBalance
bool VacuumFailsafeActive
double vac_estimate_reltuples(Relation relation, BlockNumber total_pages, BlockNumber scanned_pages, double scanned_tuples)
IndexBulkDeleteResult * vac_cleanup_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat)
static int vac_cmp_itemptr(const void *left, const void *right)
bool vacuum_is_permitted_for_relation(Oid relid, Form_pg_class reltuple, bits32 options)
#define VACOPT_SKIP_LOCKED
#define MAXDEADITEMS(avail_mem)
#define VACOPT_SKIP_DATABASE_STATS
@ VACOPTVALUE_UNSPECIFIED
#define VACOPT_PROCESS_TOAST
#define VACOPT_DISABLE_PAGE_SKIPPING
#define VACOPT_ONLY_DATABASE_STATS
#define VACOPT_PROCESS_MAIN
void SetTransactionIdLimit(TransactionId oldest_datfrozenxid, Oid oldest_datoid)
bool ForceTransactionIdLimitUpdate(void)
@ WAIT_EVENT_VACUUM_DELAY
static void pgstat_report_wait_start(uint32 wait_event_info)
static void pgstat_report_wait_end(void)
bool IsInTransactionBlock(bool isTopLevel)
void CommandCounterIncrement(void)
void PreventInTransactionBlock(bool isTopLevel, const char *stmtType)
void StartTransactionCommand(void)
void CommitTransactionCommand(void)