aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/heap/vacuumlazy.c18
-rw-r--r--src/backend/catalog/heap.c2
-rw-r--r--src/backend/catalog/index.c12
-rw-r--r--src/backend/commands/analyze.c12
-rw-r--r--src/backend/commands/cluster.c5
-rw-r--r--src/backend/commands/vacuum.c6
-rw-r--r--src/backend/statistics/relation_stats.c29
-rw-r--r--src/backend/utils/cache/relcache.c2
-rw-r--r--src/include/catalog/catversion.h2
-rw-r--r--src/include/catalog/pg_class.h3
-rw-r--r--src/include/commands/vacuum.h1
-rw-r--r--src/test/regress/expected/stats_import.out99
-rw-r--r--src/test/regress/sql/stats_import.sql49
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(