From 2b4a2a79edd258e13a44601d17b44e9929abab14 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sat, 13 Jul 2024 08:09:33 -0700 Subject: Don't lose partitioned table reltuples=0 after relhassubclass=f. ANALYZE sets relhassubclass=f when a partitioned table no longer has partitions. An ANALYZE doing that proceeded to apply the inplace update of pg_class.reltuples to the old pg_class tuple instead of the new tuple, losing that reltuples=0 change if the ANALYZE committed. Non-partitioning inheritance trees were unaffected. Back-patch to v14, where commit 375aed36ad83f0e021e9bdd3a0034c0c992c66dc introduced maintenance of partitioned table pg_class.reltuples. Reported by Alexander Lakhin. Discussion: https://postgr.es/m/a295b499-dcab-6a99-c06e-01cf60593344@gmail.com --- src/backend/commands/analyze.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/backend/commands/analyze.c') diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index 01efdd5b044..7cbeb16c3a6 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -637,7 +637,11 @@ do_analyze_rel(Relation onerel, VacuumParams *params, visibilitymap_count(onerel, &relallvisible, NULL); - /* Update pg_class for table relation */ + /* + * Update pg_class for table relation. CCI first, in case acquirefunc + * updated pg_class. + */ + CommandCounterIncrement(); vac_update_relstats(onerel, relpages, totalrows, @@ -672,6 +676,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, * Partitioned tables don't have storage, so we don't set any fields * in their pg_class entries except for reltuples and relhasindex. */ + CommandCounterIncrement(); vac_update_relstats(onerel, -1, totalrows, 0, hasindex, InvalidTransactionId, InvalidMultiXactId, -- cgit v1.2.3