diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/heap/vacuumlazy.c | 18 | ||||
-rw-r--r-- | src/backend/catalog/heap.c | 2 | ||||
-rw-r--r-- | src/backend/catalog/index.c | 12 | ||||
-rw-r--r-- | src/backend/commands/analyze.c | 12 | ||||
-rw-r--r-- | src/backend/commands/cluster.c | 5 | ||||
-rw-r--r-- | src/backend/commands/vacuum.c | 6 | ||||
-rw-r--r-- | src/backend/statistics/relation_stats.c | 29 | ||||
-rw-r--r-- | src/backend/utils/cache/relcache.c | 2 | ||||
-rw-r--r-- | src/include/catalog/catversion.h | 2 | ||||
-rw-r--r-- | src/include/catalog/pg_class.h | 3 | ||||
-rw-r--r-- | src/include/commands/vacuum.h | 1 | ||||
-rw-r--r-- | src/test/regress/expected/stats_import.out | 99 | ||||
-rw-r--r-- | src/test/regress/sql/stats_import.sql | 49 |
13 files changed, 170 insertions, 70 deletions
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 1af18a78a2b..3b91d02605a 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -623,7 +623,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, minmulti_updated; BlockNumber orig_rel_pages, new_rel_pages, - new_rel_allvisible; + new_rel_allvisible, + new_rel_allfrozen; PGRUsage ru0; TimestampTz starttime = 0; PgStat_Counter startreadtime = 0, @@ -898,11 +899,19 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, * pg_class.relpages to */ new_rel_pages = vacrel->rel_pages; /* After possible rel truncation */ - visibilitymap_count(rel, &new_rel_allvisible, NULL); + visibilitymap_count(rel, &new_rel_allvisible, &new_rel_allfrozen); if (new_rel_allvisible > new_rel_pages) new_rel_allvisible = new_rel_pages; /* + * An all-frozen block _must_ be all-visible. As such, clamp the count of + * all-frozen blocks to the count of all-visible blocks. This matches the + * clamping of relallvisible above. + */ + if (new_rel_allfrozen > new_rel_allvisible) + new_rel_allfrozen = new_rel_allvisible; + + /* * Now actually update rel's pg_class entry. * * In principle new_live_tuples could be -1 indicating that we (still) @@ -910,7 +919,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, * scan every page that isn't skipped using the visibility map. */ vac_update_relstats(rel, new_rel_pages, vacrel->new_live_tuples, - new_rel_allvisible, vacrel->nindexes > 0, + new_rel_allvisible, new_rel_allfrozen, + vacrel->nindexes > 0, vacrel->NewRelfrozenXid, vacrel->NewRelminMxid, &frozenxid_updated, &minmulti_updated, false); @@ -3720,7 +3730,7 @@ update_relstats_all_indexes(LVRelState *vacrel) vac_update_relstats(indrel, istat->num_pages, istat->num_index_tuples, - 0, + 0, 0, false, InvalidTransactionId, InvalidMultiXactId, diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 956f196fc95..7ef6f0f1cba 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -924,6 +924,7 @@ InsertPgClassTuple(Relation pg_class_desc, values[Anum_pg_class_relpages - 1] = Int32GetDatum(rd_rel->relpages); values[Anum_pg_class_reltuples - 1] = Float4GetDatum(rd_rel->reltuples); values[Anum_pg_class_relallvisible - 1] = Int32GetDatum(rd_rel->relallvisible); + values[Anum_pg_class_relallfrozen - 1] = Int32GetDatum(rd_rel->relallfrozen); values[Anum_pg_class_reltoastrelid - 1] = ObjectIdGetDatum(rd_rel->reltoastrelid); values[Anum_pg_class_relhasindex - 1] = BoolGetDatum(rd_rel->relhasindex); values[Anum_pg_class_relisshared - 1] = BoolGetDatum(rd_rel->relisshared); @@ -994,6 +995,7 @@ AddNewRelationTuple(Relation pg_class_desc, new_rel_reltup->relpages = 0; new_rel_reltup->reltuples = -1; new_rel_reltup->relallvisible = 0; + new_rel_reltup->relallfrozen = 0; /* Sequences always have a known size */ if (relkind == RELKIND_SEQUENCE) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index f37b990c81d..8e1741c81f5 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -2793,8 +2793,8 @@ FormIndexDatum(IndexInfo *indexInfo, * hasindex: set relhasindex to this value * reltuples: if >= 0, set reltuples to this value; else no change * - * If reltuples >= 0, relpages and relallvisible are also updated (using - * RelationGetNumberOfBlocks() and visibilitymap_count()). + * If reltuples >= 0, relpages, relallvisible, and relallfrozen are also + * updated (using RelationGetNumberOfBlocks() and visibilitymap_count()). * * NOTE: an important side-effect of this operation is that an SI invalidation * message is sent out to all backends --- including me --- causing relcache @@ -2812,6 +2812,7 @@ index_update_stats(Relation rel, bool update_stats; BlockNumber relpages = 0; /* keep compiler quiet */ BlockNumber relallvisible = 0; + BlockNumber relallfrozen = 0; Oid relid = RelationGetRelid(rel); Relation pg_class; ScanKeyData key[1]; @@ -2851,7 +2852,7 @@ index_update_stats(Relation rel, relpages = RelationGetNumberOfBlocks(rel); if (rel->rd_rel->relkind != RELKIND_INDEX) - visibilitymap_count(rel, &relallvisible, NULL); + visibilitymap_count(rel, &relallvisible, &relallfrozen); } /* @@ -2924,6 +2925,11 @@ index_update_stats(Relation rel, rd_rel->relallvisible = (int32) relallvisible; dirty = true; } + if (rd_rel->relallfrozen != (int32) relallfrozen) + { + rd_rel->relallfrozen = (int32) relallfrozen; + dirty = true; + } } /* diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index cd75954951b..2b5fbdcbd82 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -630,12 +630,11 @@ do_analyze_rel(Relation onerel, VacuumParams *params, */ if (!inh) { - BlockNumber relallvisible; + BlockNumber relallvisible = 0; + BlockNumber relallfrozen = 0; if (RELKIND_HAS_STORAGE(onerel->rd_rel->relkind)) - visibilitymap_count(onerel, &relallvisible, NULL); - else - relallvisible = 0; + visibilitymap_count(onerel, &relallvisible, &relallfrozen); /* * Update pg_class for table relation. CCI first, in case acquirefunc @@ -646,6 +645,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, relpages, totalrows, relallvisible, + relallfrozen, hasindex, InvalidTransactionId, InvalidMultiXactId, @@ -662,7 +662,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, vac_update_relstats(Irel[ind], RelationGetNumberOfBlocks(Irel[ind]), totalindexrows, - 0, + 0, 0, false, InvalidTransactionId, InvalidMultiXactId, @@ -678,7 +678,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, */ CommandCounterIncrement(); vac_update_relstats(onerel, -1, totalrows, - 0, hasindex, InvalidTransactionId, + 0, 0, hasindex, InvalidTransactionId, InvalidMultiXactId, NULL, NULL, in_outer_xact); diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 99193f5c886..54a08e4102e 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -1226,6 +1226,7 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, int32 swap_pages; float4 swap_tuples; int32 swap_allvisible; + int32 swap_allfrozen; swap_pages = relform1->relpages; relform1->relpages = relform2->relpages; @@ -1238,6 +1239,10 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, swap_allvisible = relform1->relallvisible; relform1->relallvisible = relform2->relallvisible; relform2->relallvisible = swap_allvisible; + + swap_allfrozen = relform1->relallfrozen; + relform1->relallfrozen = relform2->relallfrozen; + relform2->relallfrozen = swap_allfrozen; } /* diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 0239d9bae65..e81c9a8aba3 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -1427,6 +1427,7 @@ void vac_update_relstats(Relation relation, BlockNumber num_pages, double num_tuples, BlockNumber num_all_visible_pages, + BlockNumber num_all_frozen_pages, bool hasindex, TransactionId frozenxid, MultiXactId minmulti, bool *frozenxid_updated, bool *minmulti_updated, @@ -1476,6 +1477,11 @@ vac_update_relstats(Relation relation, pgcform->relallvisible = (int32) num_all_visible_pages; dirty = true; } + if (pgcform->relallfrozen != (int32) num_all_frozen_pages) + { + pgcform->relallfrozen = (int32) num_all_frozen_pages; + dirty = true; + } /* Apply DDL updates, but not inside an outer transaction (see above) */ diff --git a/src/backend/statistics/relation_stats.c b/src/backend/statistics/relation_stats.c index 11b1ef2dbc2..2c1cea3fc80 100644 --- a/src/backend/statistics/relation_stats.c +++ b/src/backend/statistics/relation_stats.c @@ -36,6 +36,7 @@ enum relation_stats_argnum RELPAGES_ARG, RELTUPLES_ARG, RELALLVISIBLE_ARG, + RELALLFROZEN_ARG, NUM_RELATION_STATS_ARGS }; @@ -45,6 +46,7 @@ static struct StatsArgInfo relarginfo[] = [RELPAGES_ARG] = {"relpages", INT4OID}, [RELTUPLES_ARG] = {"reltuples", FLOAT4OID}, [RELALLVISIBLE_ARG] = {"relallvisible", INT4OID}, + [RELALLFROZEN_ARG] = {"relallfrozen", INT4OID}, [NUM_RELATION_STATS_ARGS] = {0} }; @@ -65,11 +67,13 @@ relation_statistics_update(FunctionCallInfo fcinfo) bool update_reltuples = false; BlockNumber relallvisible = 0; bool update_relallvisible = false; + BlockNumber relallfrozen = 0; + bool update_relallfrozen = false; HeapTuple ctup; Form_pg_class pgcform; - int replaces[3] = {0}; - Datum values[3] = {0}; - bool nulls[3] = {0}; + int replaces[4] = {0}; + Datum values[4] = {0}; + bool nulls[4] = {0}; int nreplaces = 0; if (!PG_ARGISNULL(RELPAGES_ARG)) @@ -98,6 +102,12 @@ relation_statistics_update(FunctionCallInfo fcinfo) update_relallvisible = true; } + if (!PG_ARGISNULL(RELALLFROZEN_ARG)) + { + relallfrozen = PG_GETARG_UINT32(RELALLFROZEN_ARG); + update_relallfrozen = true; + } + stats_check_required_arg(fcinfo, relarginfo, RELATION_ARG); reloid = PG_GETARG_OID(RELATION_ARG); @@ -148,6 +158,13 @@ relation_statistics_update(FunctionCallInfo fcinfo) nreplaces++; } + if (update_relallfrozen && relallfrozen != pgcform->relallfrozen) + { + replaces[nreplaces] = Anum_pg_class_relallfrozen; + values[nreplaces] = UInt32GetDatum(relallfrozen); + nreplaces++; + } + if (nreplaces > 0) { TupleDesc tupdesc = RelationGetDescr(crel); @@ -176,9 +193,9 @@ relation_statistics_update(FunctionCallInfo fcinfo) Datum pg_clear_relation_stats(PG_FUNCTION_ARGS) { - LOCAL_FCINFO(newfcinfo, 4); + LOCAL_FCINFO(newfcinfo, 5); - InitFunctionCallInfoData(*newfcinfo, NULL, 4, InvalidOid, NULL, NULL); + InitFunctionCallInfoData(*newfcinfo, NULL, 5, InvalidOid, NULL, NULL); newfcinfo->args[0].value = PG_GETARG_OID(0); newfcinfo->args[0].isnull = PG_ARGISNULL(0); @@ -188,6 +205,8 @@ pg_clear_relation_stats(PG_FUNCTION_ARGS) newfcinfo->args[2].isnull = false; newfcinfo->args[3].value = UInt32GetDatum(0); newfcinfo->args[3].isnull = false; + newfcinfo->args[4].value = UInt32GetDatum(0); + newfcinfo->args[4].isnull = false; relation_statistics_update(newfcinfo); PG_RETURN_VOID(); diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 398114373e9..d1ae761b3f6 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -1928,6 +1928,7 @@ formrdesc(const char *relationName, Oid relationReltype, relation->rd_rel->relpages = 0; relation->rd_rel->reltuples = -1; relation->rd_rel->relallvisible = 0; + relation->rd_rel->relallfrozen = 0; relation->rd_rel->relkind = RELKIND_RELATION; relation->rd_rel->relnatts = (int16) natts; @@ -3885,6 +3886,7 @@ RelationSetNewRelfilenumber(Relation relation, char persistence) classform->relpages = 0; /* it's empty until further notice */ classform->reltuples = -1; classform->relallvisible = 0; + classform->relallfrozen = 0; } classform->relfrozenxid = freezeXid; classform->relminmxid = minmulti; diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 12163ae94be..f0962e17b33 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -57,6 +57,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202502242 +#define CATALOG_VERSION_NO 202503031 #endif diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h index f0d612ca487..fa96ba07bf4 100644 --- a/src/include/catalog/pg_class.h +++ b/src/include/catalog/pg_class.h @@ -68,6 +68,9 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat /* # of all-visible blocks (not always up-to-date) */ int32 relallvisible BKI_DEFAULT(0); + /* # of all-frozen blocks (not always up-to-date) */ + int32 relallfrozen BKI_DEFAULT(0); + /* OID of toast table; 0 if none */ Oid reltoastrelid BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class); diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index 1571a66c6bf..baacc63f590 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -349,6 +349,7 @@ extern void vac_update_relstats(Relation relation, BlockNumber num_pages, double num_tuples, BlockNumber num_all_visible_pages, + BlockNumber num_all_frozen_pages, bool hasindex, TransactionId frozenxid, MultiXactId minmulti, diff --git a/src/test/regress/expected/stats_import.out b/src/test/regress/expected/stats_import.out index 1f150f7b08d..4df287e547f 100644 --- a/src/test/regress/expected/stats_import.out +++ b/src/test/regress/expected/stats_import.out @@ -14,12 +14,12 @@ CREATE TABLE stats_import.test( ) WITH (autovacuum_enabled = false); CREATE INDEX test_i ON stats_import.test(id); -- starting stats -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; - relpages | reltuples | relallvisible -----------+-----------+--------------- - 0 | -1 | 0 + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 0 | -1 | 0 | 0 (1 row) BEGIN; @@ -68,12 +68,12 @@ SELECT (1 row) -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; - relpages | reltuples | relallvisible -----------+-----------+--------------- - 0 | -1 | 0 + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 0 | -1 | 0 | 0 (1 row) -- relpages may be -1 for partitioned tables @@ -170,18 +170,19 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', '17'::integer, 'reltuples', 400::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 2::integer); pg_restore_relation_stats --------------------------- t (1 row) -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; - relpages | reltuples | relallvisible -----------+-----------+--------------- - 17 | 400 | 4 + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 17 | 400 | 4 | 2 (1 row) -- ok: just relpages @@ -194,12 +195,12 @@ SELECT pg_restore_relation_stats( t (1 row) -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; - relpages | reltuples | relallvisible -----------+-----------+--------------- - 16 | 400 | 4 + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 16 | 400 | 4 | 2 (1 row) -- ok: just reltuples @@ -212,12 +213,12 @@ SELECT pg_restore_relation_stats( t (1 row) -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; - relpages | reltuples | relallvisible -----------+-----------+--------------- - 16 | 500 | 4 + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 16 | 500 | 4 | 2 (1 row) -- ok: just relallvisible @@ -230,12 +231,30 @@ SELECT pg_restore_relation_stats( t (1 row) -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; - relpages | reltuples | relallvisible -----------+-----------+--------------- - 16 | 500 | 5 + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 16 | 500 | 5 | 2 +(1 row) + +-- ok: just relallfrozen +SELECT pg_restore_relation_stats( + 'relation', 'stats_import.test'::regclass, + 'version', 150000::integer, + 'relallfrozen', 3::integer); + pg_restore_relation_stats +--------------------------- + t +(1 row) + +SELECT relpages, reltuples, relallvisible, relallfrozen +FROM pg_class +WHERE oid = 'stats_import.test'::regclass; + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 16 | 500 | 5 | 3 (1 row) -- warn: bad relpages type @@ -244,19 +263,20 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', 'nope'::text, 'reltuples', 400.0::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); WARNING: argument "relpages" has type "text", expected type "integer" pg_restore_relation_stats --------------------------- f (1 row) -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; - relpages | reltuples | relallvisible -----------+-----------+--------------- - 16 | 400 | 4 + relpages | reltuples | relallvisible | relallfrozen +----------+-----------+---------------+-------------- + 16 | 400 | 4 | 3 (1 row) -- invalid relkinds for statistics @@ -992,7 +1012,8 @@ SELECT * FROM pg_catalog.pg_restore_relation_stats( 'version', '180000'::integer, 'relpages', '11'::integer, 'reltuples', '10000'::real, - 'relallvisible', '0'::integer + 'relallvisible', '0'::integer, + 'relallfrozen', '0'::integer ); pg_restore_relation_stats --------------------------- @@ -1194,7 +1215,8 @@ SELECT pg_catalog.pg_restore_relation_stats( 'relation', 0::oid, 'relpages', 17::integer, 'reltuples', 400.0::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); WARNING: argument "relation" has type "oid", expected type "regclass" ERROR: "relation" cannot be NULL --- error: relation not found @@ -1202,7 +1224,8 @@ SELECT pg_catalog.pg_restore_relation_stats( 'relation', 0::regclass, 'relpages', 17::integer, 'reltuples', 400.0::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); ERROR: could not open relation with OID 0 -- warn and error: unrecognized argument name SELECT pg_restore_relation_stats( @@ -1219,7 +1242,8 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, NULL, '17'::integer, 'reltuples', 400::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); ERROR: name at variadic position 5 is NULL -- error: argument name is an integer SELECT pg_restore_relation_stats( @@ -1227,7 +1251,8 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 17, '17'::integer, 'reltuples', 400::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); ERROR: name at variadic position 5 has type "integer", expected type "text" -- error: odd number of variadic arguments cannot be pairs SELECT pg_restore_relation_stats( @@ -1235,6 +1260,7 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', '17'::integer, 'reltuples', 400::real, + 'relallfrozen', 3::integer, 'relallvisible'); ERROR: variadic arguments must be name/value pairs HINT: Provide an even number of variadic arguments that can be divided into pairs. @@ -1244,7 +1270,8 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', '17'::integer, 'reltuples', 400::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); ERROR: could not open relation with OID 0 -- error: object does not exist SELECT pg_catalog.pg_restore_attribute_stats( diff --git a/src/test/regress/sql/stats_import.sql b/src/test/regress/sql/stats_import.sql index 8c183bceb8a..febda3d18d9 100644 --- a/src/test/regress/sql/stats_import.sql +++ b/src/test/regress/sql/stats_import.sql @@ -18,7 +18,7 @@ CREATE TABLE stats_import.test( CREATE INDEX test_i ON stats_import.test(id); -- starting stats -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; @@ -49,7 +49,7 @@ SELECT pg_catalog.pg_clear_relation_stats( 'stats_import.test'::regclass); -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; @@ -120,9 +120,10 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', '17'::integer, 'reltuples', 400::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 2::integer); -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; @@ -132,7 +133,7 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', '16'::integer); -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; @@ -142,7 +143,7 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'reltuples', '500'::real); -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; @@ -152,7 +153,17 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relallvisible', 5::integer); -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen +FROM pg_class +WHERE oid = 'stats_import.test'::regclass; + +-- ok: just relallfrozen +SELECT pg_restore_relation_stats( + 'relation', 'stats_import.test'::regclass, + 'version', 150000::integer, + 'relallfrozen', 3::integer); + +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; @@ -162,9 +173,10 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', 'nope'::text, 'reltuples', 400.0::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); -SELECT relpages, reltuples, relallvisible +SELECT relpages, reltuples, relallvisible, relallfrozen FROM pg_class WHERE oid = 'stats_import.test'::regclass; @@ -680,7 +692,8 @@ SELECT * FROM pg_catalog.pg_restore_relation_stats( 'version', '180000'::integer, 'relpages', '11'::integer, 'reltuples', '10000'::real, - 'relallvisible', '0'::integer + 'relallvisible', '0'::integer, + 'relallfrozen', '0'::integer ); -- Generate statistics on table with data @@ -850,14 +863,16 @@ SELECT pg_catalog.pg_restore_relation_stats( 'relation', 0::oid, 'relpages', 17::integer, 'reltuples', 400.0::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); --- error: relation not found SELECT pg_catalog.pg_restore_relation_stats( 'relation', 0::regclass, 'relpages', 17::integer, 'reltuples', 400.0::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); -- warn and error: unrecognized argument name SELECT pg_restore_relation_stats( @@ -873,7 +888,8 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, NULL, '17'::integer, 'reltuples', 400::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); -- error: argument name is an integer SELECT pg_restore_relation_stats( @@ -881,7 +897,8 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 17, '17'::integer, 'reltuples', 400::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); -- error: odd number of variadic arguments cannot be pairs SELECT pg_restore_relation_stats( @@ -889,6 +906,7 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', '17'::integer, 'reltuples', 400::real, + 'relallfrozen', 3::integer, 'relallvisible'); -- error: object doesn't exist @@ -897,7 +915,8 @@ SELECT pg_restore_relation_stats( 'version', 150000::integer, 'relpages', '17'::integer, 'reltuples', 400::real, - 'relallvisible', 4::integer); + 'relallvisible', 4::integer, + 'relallfrozen', 3::integer); -- error: object does not exist SELECT pg_catalog.pg_restore_attribute_stats( |