mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
Add relallfrozen to pg_class
Add relallfrozen, an estimate of the number of pages marked all-frozen in the visibility map. pg_class already has relallvisible, an estimate of the number of pages in the relation marked all-visible in the visibility map. This is used primarily for planning. relallfrozen, together with relallvisible, is useful for estimating the outstanding number of all-visible but not all-frozen pages in the relation for the purposes of scheduling manual VACUUMs and tuning vacuum freeze parameters. A future commit will use relallfrozen to trigger more frequent vacuums on insert-focused workloads with significant volume of frozen data. Bump catalog version Author: Melanie Plageman <melanieplageman@gmail.com> Reviewed-by: Nathan Bossart <nathandbossart@gmail.com> Reviewed-by: Robert Treat <rob@xzilla.net> Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Reviewed-by: Greg Sabino Mullane <htamfids@gmail.com> Discussion: https://postgr.es/m/flat/CAAKRu_aj-P7YyBz_cPNwztz6ohP%2BvWis%3Diz3YcomkB3NpYA--w%40mail.gmail.com
This commit is contained in:
@ -2066,6 +2066,26 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l
|
|||||||
</para></entry>
|
</para></entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
|
<row>
|
||||||
|
<entry role="catalog_table_entry"><para role="column_definition">
|
||||||
|
<structfield>relallfrozen</structfield> <type>int4</type>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Number of pages that are marked all-frozen in the table's visibility
|
||||||
|
map. This is only an estimate and can be used along with
|
||||||
|
<structfield>relallvisible</structfield> for scheduling vacuums and
|
||||||
|
tuning <link linkend="runtime-config-vacuum-freezing">vacuum's freezing
|
||||||
|
behavior</link>.
|
||||||
|
|
||||||
|
It is updated by
|
||||||
|
<link linkend="sql-vacuum"><command>VACUUM</command></link>,
|
||||||
|
<link linkend="sql-analyze"><command>ANALYZE</command></link>,
|
||||||
|
and a few DDL commands such as
|
||||||
|
<link linkend="sql-createindex"><command>CREATE INDEX</command></link>.
|
||||||
|
</para></entry>
|
||||||
|
</row>
|
||||||
|
|
||||||
|
|
||||||
<row>
|
<row>
|
||||||
<entry role="catalog_table_entry"><para role="column_definition">
|
<entry role="catalog_table_entry"><para role="column_definition">
|
||||||
<structfield>reltoastrelid</structfield> <type>oid</type>
|
<structfield>reltoastrelid</structfield> <type>oid</type>
|
||||||
|
@ -623,7 +623,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
|
|||||||
minmulti_updated;
|
minmulti_updated;
|
||||||
BlockNumber orig_rel_pages,
|
BlockNumber orig_rel_pages,
|
||||||
new_rel_pages,
|
new_rel_pages,
|
||||||
new_rel_allvisible;
|
new_rel_allvisible,
|
||||||
|
new_rel_allfrozen;
|
||||||
PGRUsage ru0;
|
PGRUsage ru0;
|
||||||
TimestampTz starttime = 0;
|
TimestampTz starttime = 0;
|
||||||
PgStat_Counter startreadtime = 0,
|
PgStat_Counter startreadtime = 0,
|
||||||
@ -898,10 +899,18 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
|
|||||||
* pg_class.relpages to
|
* pg_class.relpages to
|
||||||
*/
|
*/
|
||||||
new_rel_pages = vacrel->rel_pages; /* After possible rel truncation */
|
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)
|
if (new_rel_allvisible > new_rel_pages)
|
||||||
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.
|
* Now actually update rel's pg_class entry.
|
||||||
*
|
*
|
||||||
@ -910,7 +919,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
|
|||||||
* scan every page that isn't skipped using the visibility map.
|
* scan every page that isn't skipped using the visibility map.
|
||||||
*/
|
*/
|
||||||
vac_update_relstats(rel, new_rel_pages, vacrel->new_live_tuples,
|
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,
|
vacrel->NewRelfrozenXid, vacrel->NewRelminMxid,
|
||||||
&frozenxid_updated, &minmulti_updated, false);
|
&frozenxid_updated, &minmulti_updated, false);
|
||||||
|
|
||||||
@ -3720,7 +3730,7 @@ update_relstats_all_indexes(LVRelState *vacrel)
|
|||||||
vac_update_relstats(indrel,
|
vac_update_relstats(indrel,
|
||||||
istat->num_pages,
|
istat->num_pages,
|
||||||
istat->num_index_tuples,
|
istat->num_index_tuples,
|
||||||
0,
|
0, 0,
|
||||||
false,
|
false,
|
||||||
InvalidTransactionId,
|
InvalidTransactionId,
|
||||||
InvalidMultiXactId,
|
InvalidMultiXactId,
|
||||||
|
@ -924,6 +924,7 @@ InsertPgClassTuple(Relation pg_class_desc,
|
|||||||
values[Anum_pg_class_relpages - 1] = Int32GetDatum(rd_rel->relpages);
|
values[Anum_pg_class_relpages - 1] = Int32GetDatum(rd_rel->relpages);
|
||||||
values[Anum_pg_class_reltuples - 1] = Float4GetDatum(rd_rel->reltuples);
|
values[Anum_pg_class_reltuples - 1] = Float4GetDatum(rd_rel->reltuples);
|
||||||
values[Anum_pg_class_relallvisible - 1] = Int32GetDatum(rd_rel->relallvisible);
|
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_reltoastrelid - 1] = ObjectIdGetDatum(rd_rel->reltoastrelid);
|
||||||
values[Anum_pg_class_relhasindex - 1] = BoolGetDatum(rd_rel->relhasindex);
|
values[Anum_pg_class_relhasindex - 1] = BoolGetDatum(rd_rel->relhasindex);
|
||||||
values[Anum_pg_class_relisshared - 1] = BoolGetDatum(rd_rel->relisshared);
|
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->relpages = 0;
|
||||||
new_rel_reltup->reltuples = -1;
|
new_rel_reltup->reltuples = -1;
|
||||||
new_rel_reltup->relallvisible = 0;
|
new_rel_reltup->relallvisible = 0;
|
||||||
|
new_rel_reltup->relallfrozen = 0;
|
||||||
|
|
||||||
/* Sequences always have a known size */
|
/* Sequences always have a known size */
|
||||||
if (relkind == RELKIND_SEQUENCE)
|
if (relkind == RELKIND_SEQUENCE)
|
||||||
|
@ -2793,8 +2793,8 @@ FormIndexDatum(IndexInfo *indexInfo,
|
|||||||
* hasindex: set relhasindex to this value
|
* hasindex: set relhasindex to this value
|
||||||
* reltuples: if >= 0, set reltuples to this value; else no change
|
* reltuples: if >= 0, set reltuples to this value; else no change
|
||||||
*
|
*
|
||||||
* If reltuples >= 0, relpages and relallvisible are also updated (using
|
* If reltuples >= 0, relpages, relallvisible, and relallfrozen are also
|
||||||
* RelationGetNumberOfBlocks() and visibilitymap_count()).
|
* updated (using RelationGetNumberOfBlocks() and visibilitymap_count()).
|
||||||
*
|
*
|
||||||
* NOTE: an important side-effect of this operation is that an SI invalidation
|
* NOTE: an important side-effect of this operation is that an SI invalidation
|
||||||
* message is sent out to all backends --- including me --- causing relcache
|
* message is sent out to all backends --- including me --- causing relcache
|
||||||
@ -2812,6 +2812,7 @@ index_update_stats(Relation rel,
|
|||||||
bool update_stats;
|
bool update_stats;
|
||||||
BlockNumber relpages = 0; /* keep compiler quiet */
|
BlockNumber relpages = 0; /* keep compiler quiet */
|
||||||
BlockNumber relallvisible = 0;
|
BlockNumber relallvisible = 0;
|
||||||
|
BlockNumber relallfrozen = 0;
|
||||||
Oid relid = RelationGetRelid(rel);
|
Oid relid = RelationGetRelid(rel);
|
||||||
Relation pg_class;
|
Relation pg_class;
|
||||||
ScanKeyData key[1];
|
ScanKeyData key[1];
|
||||||
@ -2851,7 +2852,7 @@ index_update_stats(Relation rel,
|
|||||||
relpages = RelationGetNumberOfBlocks(rel);
|
relpages = RelationGetNumberOfBlocks(rel);
|
||||||
|
|
||||||
if (rel->rd_rel->relkind != RELKIND_INDEX)
|
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;
|
rd_rel->relallvisible = (int32) relallvisible;
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
|
if (rd_rel->relallfrozen != (int32) relallfrozen)
|
||||||
|
{
|
||||||
|
rd_rel->relallfrozen = (int32) relallfrozen;
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -630,12 +630,11 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
|
|||||||
*/
|
*/
|
||||||
if (!inh)
|
if (!inh)
|
||||||
{
|
{
|
||||||
BlockNumber relallvisible;
|
BlockNumber relallvisible = 0;
|
||||||
|
BlockNumber relallfrozen = 0;
|
||||||
|
|
||||||
if (RELKIND_HAS_STORAGE(onerel->rd_rel->relkind))
|
if (RELKIND_HAS_STORAGE(onerel->rd_rel->relkind))
|
||||||
visibilitymap_count(onerel, &relallvisible, NULL);
|
visibilitymap_count(onerel, &relallvisible, &relallfrozen);
|
||||||
else
|
|
||||||
relallvisible = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update pg_class for table relation. CCI first, in case acquirefunc
|
* Update pg_class for table relation. CCI first, in case acquirefunc
|
||||||
@ -646,6 +645,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
|
|||||||
relpages,
|
relpages,
|
||||||
totalrows,
|
totalrows,
|
||||||
relallvisible,
|
relallvisible,
|
||||||
|
relallfrozen,
|
||||||
hasindex,
|
hasindex,
|
||||||
InvalidTransactionId,
|
InvalidTransactionId,
|
||||||
InvalidMultiXactId,
|
InvalidMultiXactId,
|
||||||
@ -662,7 +662,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
|
|||||||
vac_update_relstats(Irel[ind],
|
vac_update_relstats(Irel[ind],
|
||||||
RelationGetNumberOfBlocks(Irel[ind]),
|
RelationGetNumberOfBlocks(Irel[ind]),
|
||||||
totalindexrows,
|
totalindexrows,
|
||||||
0,
|
0, 0,
|
||||||
false,
|
false,
|
||||||
InvalidTransactionId,
|
InvalidTransactionId,
|
||||||
InvalidMultiXactId,
|
InvalidMultiXactId,
|
||||||
@ -678,7 +678,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params,
|
|||||||
*/
|
*/
|
||||||
CommandCounterIncrement();
|
CommandCounterIncrement();
|
||||||
vac_update_relstats(onerel, -1, totalrows,
|
vac_update_relstats(onerel, -1, totalrows,
|
||||||
0, hasindex, InvalidTransactionId,
|
0, 0, hasindex, InvalidTransactionId,
|
||||||
InvalidMultiXactId,
|
InvalidMultiXactId,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
in_outer_xact);
|
in_outer_xact);
|
||||||
|
@ -1226,6 +1226,7 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class,
|
|||||||
int32 swap_pages;
|
int32 swap_pages;
|
||||||
float4 swap_tuples;
|
float4 swap_tuples;
|
||||||
int32 swap_allvisible;
|
int32 swap_allvisible;
|
||||||
|
int32 swap_allfrozen;
|
||||||
|
|
||||||
swap_pages = relform1->relpages;
|
swap_pages = relform1->relpages;
|
||||||
relform1->relpages = relform2->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;
|
swap_allvisible = relform1->relallvisible;
|
||||||
relform1->relallvisible = relform2->relallvisible;
|
relform1->relallvisible = relform2->relallvisible;
|
||||||
relform2->relallvisible = swap_allvisible;
|
relform2->relallvisible = swap_allvisible;
|
||||||
|
|
||||||
|
swap_allfrozen = relform1->relallfrozen;
|
||||||
|
relform1->relallfrozen = relform2->relallfrozen;
|
||||||
|
relform2->relallfrozen = swap_allfrozen;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1427,6 +1427,7 @@ void
|
|||||||
vac_update_relstats(Relation relation,
|
vac_update_relstats(Relation relation,
|
||||||
BlockNumber num_pages, double num_tuples,
|
BlockNumber num_pages, double num_tuples,
|
||||||
BlockNumber num_all_visible_pages,
|
BlockNumber num_all_visible_pages,
|
||||||
|
BlockNumber num_all_frozen_pages,
|
||||||
bool hasindex, TransactionId frozenxid,
|
bool hasindex, TransactionId frozenxid,
|
||||||
MultiXactId minmulti,
|
MultiXactId minmulti,
|
||||||
bool *frozenxid_updated, bool *minmulti_updated,
|
bool *frozenxid_updated, bool *minmulti_updated,
|
||||||
@ -1476,6 +1477,11 @@ vac_update_relstats(Relation relation,
|
|||||||
pgcform->relallvisible = (int32) num_all_visible_pages;
|
pgcform->relallvisible = (int32) num_all_visible_pages;
|
||||||
dirty = true;
|
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) */
|
/* Apply DDL updates, but not inside an outer transaction (see above) */
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ enum relation_stats_argnum
|
|||||||
RELPAGES_ARG,
|
RELPAGES_ARG,
|
||||||
RELTUPLES_ARG,
|
RELTUPLES_ARG,
|
||||||
RELALLVISIBLE_ARG,
|
RELALLVISIBLE_ARG,
|
||||||
|
RELALLFROZEN_ARG,
|
||||||
NUM_RELATION_STATS_ARGS
|
NUM_RELATION_STATS_ARGS
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -45,6 +46,7 @@ static struct StatsArgInfo relarginfo[] =
|
|||||||
[RELPAGES_ARG] = {"relpages", INT4OID},
|
[RELPAGES_ARG] = {"relpages", INT4OID},
|
||||||
[RELTUPLES_ARG] = {"reltuples", FLOAT4OID},
|
[RELTUPLES_ARG] = {"reltuples", FLOAT4OID},
|
||||||
[RELALLVISIBLE_ARG] = {"relallvisible", INT4OID},
|
[RELALLVISIBLE_ARG] = {"relallvisible", INT4OID},
|
||||||
|
[RELALLFROZEN_ARG] = {"relallfrozen", INT4OID},
|
||||||
[NUM_RELATION_STATS_ARGS] = {0}
|
[NUM_RELATION_STATS_ARGS] = {0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -65,11 +67,13 @@ relation_statistics_update(FunctionCallInfo fcinfo)
|
|||||||
bool update_reltuples = false;
|
bool update_reltuples = false;
|
||||||
BlockNumber relallvisible = 0;
|
BlockNumber relallvisible = 0;
|
||||||
bool update_relallvisible = false;
|
bool update_relallvisible = false;
|
||||||
|
BlockNumber relallfrozen = 0;
|
||||||
|
bool update_relallfrozen = false;
|
||||||
HeapTuple ctup;
|
HeapTuple ctup;
|
||||||
Form_pg_class pgcform;
|
Form_pg_class pgcform;
|
||||||
int replaces[3] = {0};
|
int replaces[4] = {0};
|
||||||
Datum values[3] = {0};
|
Datum values[4] = {0};
|
||||||
bool nulls[3] = {0};
|
bool nulls[4] = {0};
|
||||||
int nreplaces = 0;
|
int nreplaces = 0;
|
||||||
|
|
||||||
if (!PG_ARGISNULL(RELPAGES_ARG))
|
if (!PG_ARGISNULL(RELPAGES_ARG))
|
||||||
@ -98,6 +102,12 @@ relation_statistics_update(FunctionCallInfo fcinfo)
|
|||||||
update_relallvisible = true;
|
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);
|
stats_check_required_arg(fcinfo, relarginfo, RELATION_ARG);
|
||||||
reloid = PG_GETARG_OID(RELATION_ARG);
|
reloid = PG_GETARG_OID(RELATION_ARG);
|
||||||
|
|
||||||
@ -148,6 +158,13 @@ relation_statistics_update(FunctionCallInfo fcinfo)
|
|||||||
nreplaces++;
|
nreplaces++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (update_relallfrozen && relallfrozen != pgcform->relallfrozen)
|
||||||
|
{
|
||||||
|
replaces[nreplaces] = Anum_pg_class_relallfrozen;
|
||||||
|
values[nreplaces] = UInt32GetDatum(relallfrozen);
|
||||||
|
nreplaces++;
|
||||||
|
}
|
||||||
|
|
||||||
if (nreplaces > 0)
|
if (nreplaces > 0)
|
||||||
{
|
{
|
||||||
TupleDesc tupdesc = RelationGetDescr(crel);
|
TupleDesc tupdesc = RelationGetDescr(crel);
|
||||||
@ -176,9 +193,9 @@ relation_statistics_update(FunctionCallInfo fcinfo)
|
|||||||
Datum
|
Datum
|
||||||
pg_clear_relation_stats(PG_FUNCTION_ARGS)
|
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].value = PG_GETARG_OID(0);
|
||||||
newfcinfo->args[0].isnull = PG_ARGISNULL(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[2].isnull = false;
|
||||||
newfcinfo->args[3].value = UInt32GetDatum(0);
|
newfcinfo->args[3].value = UInt32GetDatum(0);
|
||||||
newfcinfo->args[3].isnull = false;
|
newfcinfo->args[3].isnull = false;
|
||||||
|
newfcinfo->args[4].value = UInt32GetDatum(0);
|
||||||
|
newfcinfo->args[4].isnull = false;
|
||||||
|
|
||||||
relation_statistics_update(newfcinfo);
|
relation_statistics_update(newfcinfo);
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID();
|
||||||
|
2
src/backend/utils/cache/relcache.c
vendored
2
src/backend/utils/cache/relcache.c
vendored
@ -1928,6 +1928,7 @@ formrdesc(const char *relationName, Oid relationReltype,
|
|||||||
relation->rd_rel->relpages = 0;
|
relation->rd_rel->relpages = 0;
|
||||||
relation->rd_rel->reltuples = -1;
|
relation->rd_rel->reltuples = -1;
|
||||||
relation->rd_rel->relallvisible = 0;
|
relation->rd_rel->relallvisible = 0;
|
||||||
|
relation->rd_rel->relallfrozen = 0;
|
||||||
relation->rd_rel->relkind = RELKIND_RELATION;
|
relation->rd_rel->relkind = RELKIND_RELATION;
|
||||||
relation->rd_rel->relnatts = (int16) natts;
|
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->relpages = 0; /* it's empty until further notice */
|
||||||
classform->reltuples = -1;
|
classform->reltuples = -1;
|
||||||
classform->relallvisible = 0;
|
classform->relallvisible = 0;
|
||||||
|
classform->relallfrozen = 0;
|
||||||
}
|
}
|
||||||
classform->relfrozenxid = freezeXid;
|
classform->relfrozenxid = freezeXid;
|
||||||
classform->relminmxid = minmulti;
|
classform->relminmxid = minmulti;
|
||||||
|
@ -57,6 +57,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 202502242
|
#define CATALOG_VERSION_NO 202503031
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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) */
|
/* # of all-visible blocks (not always up-to-date) */
|
||||||
int32 relallvisible BKI_DEFAULT(0);
|
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 of toast table; 0 if none */
|
||||||
Oid reltoastrelid BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class);
|
Oid reltoastrelid BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class);
|
||||||
|
|
||||||
|
@ -349,6 +349,7 @@ extern void vac_update_relstats(Relation relation,
|
|||||||
BlockNumber num_pages,
|
BlockNumber num_pages,
|
||||||
double num_tuples,
|
double num_tuples,
|
||||||
BlockNumber num_all_visible_pages,
|
BlockNumber num_all_visible_pages,
|
||||||
|
BlockNumber num_all_frozen_pages,
|
||||||
bool hasindex,
|
bool hasindex,
|
||||||
TransactionId frozenxid,
|
TransactionId frozenxid,
|
||||||
MultiXactId minmulti,
|
MultiXactId minmulti,
|
||||||
|
@ -14,12 +14,12 @@ CREATE TABLE stats_import.test(
|
|||||||
) WITH (autovacuum_enabled = false);
|
) WITH (autovacuum_enabled = false);
|
||||||
CREATE INDEX test_i ON stats_import.test(id);
|
CREATE INDEX test_i ON stats_import.test(id);
|
||||||
-- starting stats
|
-- starting stats
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
relpages | reltuples | relallvisible
|
relpages | reltuples | relallvisible | relallfrozen
|
||||||
----------+-----------+---------------
|
----------+-----------+---------------+--------------
|
||||||
0 | -1 | 0
|
0 | -1 | 0 | 0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
BEGIN;
|
BEGIN;
|
||||||
@ -68,12 +68,12 @@ SELECT
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
relpages | reltuples | relallvisible
|
relpages | reltuples | relallvisible | relallfrozen
|
||||||
----------+-----------+---------------
|
----------+-----------+---------------+--------------
|
||||||
0 | -1 | 0
|
0 | -1 | 0 | 0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- relpages may be -1 for partitioned tables
|
-- relpages may be -1 for partitioned tables
|
||||||
@ -170,18 +170,19 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relpages', '17'::integer,
|
'relpages', '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 2::integer);
|
||||||
pg_restore_relation_stats
|
pg_restore_relation_stats
|
||||||
---------------------------
|
---------------------------
|
||||||
t
|
t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
relpages | reltuples | relallvisible
|
relpages | reltuples | relallvisible | relallfrozen
|
||||||
----------+-----------+---------------
|
----------+-----------+---------------+--------------
|
||||||
17 | 400 | 4
|
17 | 400 | 4 | 2
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- ok: just relpages
|
-- ok: just relpages
|
||||||
@ -194,12 +195,12 @@ SELECT pg_restore_relation_stats(
|
|||||||
t
|
t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
relpages | reltuples | relallvisible
|
relpages | reltuples | relallvisible | relallfrozen
|
||||||
----------+-----------+---------------
|
----------+-----------+---------------+--------------
|
||||||
16 | 400 | 4
|
16 | 400 | 4 | 2
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- ok: just reltuples
|
-- ok: just reltuples
|
||||||
@ -212,12 +213,12 @@ SELECT pg_restore_relation_stats(
|
|||||||
t
|
t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
relpages | reltuples | relallvisible
|
relpages | reltuples | relallvisible | relallfrozen
|
||||||
----------+-----------+---------------
|
----------+-----------+---------------+--------------
|
||||||
16 | 500 | 4
|
16 | 500 | 4 | 2
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- ok: just relallvisible
|
-- ok: just relallvisible
|
||||||
@ -230,12 +231,30 @@ SELECT pg_restore_relation_stats(
|
|||||||
t
|
t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
relpages | reltuples | relallvisible
|
relpages | reltuples | relallvisible | relallfrozen
|
||||||
----------+-----------+---------------
|
----------+-----------+---------------+--------------
|
||||||
16 | 500 | 5
|
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)
|
(1 row)
|
||||||
|
|
||||||
-- warn: bad relpages type
|
-- warn: bad relpages type
|
||||||
@ -244,19 +263,20 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relpages', 'nope'::text,
|
'relpages', 'nope'::text,
|
||||||
'reltuples', 400.0::real,
|
'reltuples', 400.0::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
WARNING: argument "relpages" has type "text", expected type "integer"
|
WARNING: argument "relpages" has type "text", expected type "integer"
|
||||||
pg_restore_relation_stats
|
pg_restore_relation_stats
|
||||||
---------------------------
|
---------------------------
|
||||||
f
|
f
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
relpages | reltuples | relallvisible
|
relpages | reltuples | relallvisible | relallfrozen
|
||||||
----------+-----------+---------------
|
----------+-----------+---------------+--------------
|
||||||
16 | 400 | 4
|
16 | 400 | 4 | 3
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- invalid relkinds for statistics
|
-- invalid relkinds for statistics
|
||||||
@ -992,7 +1012,8 @@ SELECT * FROM pg_catalog.pg_restore_relation_stats(
|
|||||||
'version', '180000'::integer,
|
'version', '180000'::integer,
|
||||||
'relpages', '11'::integer,
|
'relpages', '11'::integer,
|
||||||
'reltuples', '10000'::real,
|
'reltuples', '10000'::real,
|
||||||
'relallvisible', '0'::integer
|
'relallvisible', '0'::integer,
|
||||||
|
'relallfrozen', '0'::integer
|
||||||
);
|
);
|
||||||
pg_restore_relation_stats
|
pg_restore_relation_stats
|
||||||
---------------------------
|
---------------------------
|
||||||
@ -1194,7 +1215,8 @@ SELECT pg_catalog.pg_restore_relation_stats(
|
|||||||
'relation', 0::oid,
|
'relation', 0::oid,
|
||||||
'relpages', 17::integer,
|
'relpages', 17::integer,
|
||||||
'reltuples', 400.0::real,
|
'reltuples', 400.0::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
WARNING: argument "relation" has type "oid", expected type "regclass"
|
WARNING: argument "relation" has type "oid", expected type "regclass"
|
||||||
ERROR: "relation" cannot be NULL
|
ERROR: "relation" cannot be NULL
|
||||||
--- error: relation not found
|
--- error: relation not found
|
||||||
@ -1202,7 +1224,8 @@ SELECT pg_catalog.pg_restore_relation_stats(
|
|||||||
'relation', 0::regclass,
|
'relation', 0::regclass,
|
||||||
'relpages', 17::integer,
|
'relpages', 17::integer,
|
||||||
'reltuples', 400.0::real,
|
'reltuples', 400.0::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
ERROR: could not open relation with OID 0
|
ERROR: could not open relation with OID 0
|
||||||
-- warn and error: unrecognized argument name
|
-- warn and error: unrecognized argument name
|
||||||
SELECT pg_restore_relation_stats(
|
SELECT pg_restore_relation_stats(
|
||||||
@ -1219,7 +1242,8 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
NULL, '17'::integer,
|
NULL, '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
ERROR: name at variadic position 5 is NULL
|
ERROR: name at variadic position 5 is NULL
|
||||||
-- error: argument name is an integer
|
-- error: argument name is an integer
|
||||||
SELECT pg_restore_relation_stats(
|
SELECT pg_restore_relation_stats(
|
||||||
@ -1227,7 +1251,8 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
17, '17'::integer,
|
17, '17'::integer,
|
||||||
'reltuples', 400::real,
|
'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: name at variadic position 5 has type "integer", expected type "text"
|
||||||
-- error: odd number of variadic arguments cannot be pairs
|
-- error: odd number of variadic arguments cannot be pairs
|
||||||
SELECT pg_restore_relation_stats(
|
SELECT pg_restore_relation_stats(
|
||||||
@ -1235,6 +1260,7 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relpages', '17'::integer,
|
'relpages', '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
|
'relallfrozen', 3::integer,
|
||||||
'relallvisible');
|
'relallvisible');
|
||||||
ERROR: variadic arguments must be name/value pairs
|
ERROR: variadic arguments must be name/value pairs
|
||||||
HINT: Provide an even number of variadic arguments that can be divided into 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,
|
'version', 150000::integer,
|
||||||
'relpages', '17'::integer,
|
'relpages', '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
ERROR: could not open relation with OID 0
|
ERROR: could not open relation with OID 0
|
||||||
-- error: object does not exist
|
-- error: object does not exist
|
||||||
SELECT pg_catalog.pg_restore_attribute_stats(
|
SELECT pg_catalog.pg_restore_attribute_stats(
|
||||||
|
@ -18,7 +18,7 @@ CREATE TABLE stats_import.test(
|
|||||||
CREATE INDEX test_i ON stats_import.test(id);
|
CREATE INDEX test_i ON stats_import.test(id);
|
||||||
|
|
||||||
-- starting stats
|
-- starting stats
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ SELECT
|
|||||||
pg_catalog.pg_clear_relation_stats(
|
pg_catalog.pg_clear_relation_stats(
|
||||||
'stats_import.test'::regclass);
|
'stats_import.test'::regclass);
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
|
|
||||||
@ -120,9 +120,10 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relpages', '17'::integer,
|
'relpages', '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 2::integer);
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
|
|
||||||
@ -132,7 +133,7 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relpages', '16'::integer);
|
'relpages', '16'::integer);
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
|
|
||||||
@ -142,7 +143,7 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'reltuples', '500'::real);
|
'reltuples', '500'::real);
|
||||||
|
|
||||||
SELECT relpages, reltuples, relallvisible
|
SELECT relpages, reltuples, relallvisible, relallfrozen
|
||||||
FROM pg_class
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
|
|
||||||
@ -152,7 +153,17 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relallvisible', 5::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
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
|
|
||||||
@ -162,9 +173,10 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relpages', 'nope'::text,
|
'relpages', 'nope'::text,
|
||||||
'reltuples', 400.0::real,
|
'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
|
FROM pg_class
|
||||||
WHERE oid = 'stats_import.test'::regclass;
|
WHERE oid = 'stats_import.test'::regclass;
|
||||||
|
|
||||||
@ -680,7 +692,8 @@ SELECT * FROM pg_catalog.pg_restore_relation_stats(
|
|||||||
'version', '180000'::integer,
|
'version', '180000'::integer,
|
||||||
'relpages', '11'::integer,
|
'relpages', '11'::integer,
|
||||||
'reltuples', '10000'::real,
|
'reltuples', '10000'::real,
|
||||||
'relallvisible', '0'::integer
|
'relallvisible', '0'::integer,
|
||||||
|
'relallfrozen', '0'::integer
|
||||||
);
|
);
|
||||||
|
|
||||||
-- Generate statistics on table with data
|
-- Generate statistics on table with data
|
||||||
@ -850,14 +863,16 @@ SELECT pg_catalog.pg_restore_relation_stats(
|
|||||||
'relation', 0::oid,
|
'relation', 0::oid,
|
||||||
'relpages', 17::integer,
|
'relpages', 17::integer,
|
||||||
'reltuples', 400.0::real,
|
'reltuples', 400.0::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
|
|
||||||
--- error: relation not found
|
--- error: relation not found
|
||||||
SELECT pg_catalog.pg_restore_relation_stats(
|
SELECT pg_catalog.pg_restore_relation_stats(
|
||||||
'relation', 0::regclass,
|
'relation', 0::regclass,
|
||||||
'relpages', 17::integer,
|
'relpages', 17::integer,
|
||||||
'reltuples', 400.0::real,
|
'reltuples', 400.0::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
|
|
||||||
-- warn and error: unrecognized argument name
|
-- warn and error: unrecognized argument name
|
||||||
SELECT pg_restore_relation_stats(
|
SELECT pg_restore_relation_stats(
|
||||||
@ -873,7 +888,8 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
NULL, '17'::integer,
|
NULL, '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
|
|
||||||
-- error: argument name is an integer
|
-- error: argument name is an integer
|
||||||
SELECT pg_restore_relation_stats(
|
SELECT pg_restore_relation_stats(
|
||||||
@ -881,7 +897,8 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
17, '17'::integer,
|
17, '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
|
|
||||||
-- error: odd number of variadic arguments cannot be pairs
|
-- error: odd number of variadic arguments cannot be pairs
|
||||||
SELECT pg_restore_relation_stats(
|
SELECT pg_restore_relation_stats(
|
||||||
@ -889,6 +906,7 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relpages', '17'::integer,
|
'relpages', '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
|
'relallfrozen', 3::integer,
|
||||||
'relallvisible');
|
'relallvisible');
|
||||||
|
|
||||||
-- error: object doesn't exist
|
-- error: object doesn't exist
|
||||||
@ -897,7 +915,8 @@ SELECT pg_restore_relation_stats(
|
|||||||
'version', 150000::integer,
|
'version', 150000::integer,
|
||||||
'relpages', '17'::integer,
|
'relpages', '17'::integer,
|
||||||
'reltuples', 400::real,
|
'reltuples', 400::real,
|
||||||
'relallvisible', 4::integer);
|
'relallvisible', 4::integer,
|
||||||
|
'relallfrozen', 3::integer);
|
||||||
|
|
||||||
-- error: object does not exist
|
-- error: object does not exist
|
||||||
SELECT pg_catalog.pg_restore_attribute_stats(
|
SELECT pg_catalog.pg_restore_attribute_stats(
|
||||||
|
Reference in New Issue
Block a user