BlockNumber possibly_freeable;
PGRUsage ru0;
TimestampTz starttime = 0;
- bool scan_all;
+ bool scan_all; /* should we scan all pages? */
+ bool scanned_all; /* did we actually scan all pages? */
TransactionId freezeTableLimit;
BlockNumber new_rel_pages;
double new_rel_tuples;
/* Done with indexes */
vac_close_indexes(nindexes, Irel, NoLock);
+ /*
+ * Compute whether we actually scanned the whole relation. If we did, we
+ * can adjust relfrozenxid.
+ *
+ * NB: We need to check this before truncating the relation, because that
+ * will change ->rel_pages.
+ */
+ if (vacrelstats->scanned_pages < vacrelstats->rel_pages)
+ {
+ Assert(!scan_all);
+ scanned_all = false;
+ }
+ else
+ scanned_all = true;
+
/*
* Optionally truncate the relation.
*
new_rel_tuples = vacrelstats->old_rel_tuples;
}
- new_frozen_xid = FreezeLimit;
- if (vacrelstats->scanned_pages < vacrelstats->rel_pages)
- new_frozen_xid = InvalidTransactionId;
+ new_frozen_xid = scanned_all ? FreezeLimit : InvalidTransactionId;
vac_update_relstats(onerel,
new_rel_pages, new_rel_tuples,