1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-21 12:05:57 +03:00

Add relallfrozen to pg_dump statistics.

Author: Corey Huinker <corey.huinker@gmail.com>
Discussion: https://postgr.es/m/CADkLM=desCuf3dVHasADvdUVRmb-5gO0mhMO5u9nzgv6i7U86Q@mail.gmail.com
This commit is contained in:
Jeff Davis 2025-03-30 22:14:06 -07:00
parent 2a5e709e72
commit 4694aedf63
4 changed files with 43 additions and 8 deletions

View File

@ -6874,7 +6874,8 @@ getFuncs(Archive *fout)
*/ */
static RelStatsInfo * static RelStatsInfo *
getRelationStatistics(Archive *fout, DumpableObject *rel, int32 relpages, getRelationStatistics(Archive *fout, DumpableObject *rel, int32 relpages,
char *reltuples, int32 relallvisible, char relkind, char *reltuples, int32 relallvisible,
int32 relallfrozen, char relkind,
char **indAttNames, int nindAttNames) char **indAttNames, int nindAttNames)
{ {
if (!fout->dopt->dumpStatistics) if (!fout->dopt->dumpStatistics)
@ -6903,6 +6904,7 @@ getRelationStatistics(Archive *fout, DumpableObject *rel, int32 relpages,
info->relpages = relpages; info->relpages = relpages;
info->reltuples = pstrdup(reltuples); info->reltuples = pstrdup(reltuples);
info->relallvisible = relallvisible; info->relallvisible = relallvisible;
info->relallfrozen = relallfrozen;
info->relkind = relkind; info->relkind = relkind;
info->indAttNames = indAttNames; info->indAttNames = indAttNames;
info->nindAttNames = nindAttNames; info->nindAttNames = nindAttNames;
@ -6967,6 +6969,7 @@ getTables(Archive *fout, int *numTables)
int i_relpages; int i_relpages;
int i_reltuples; int i_reltuples;
int i_relallvisible; int i_relallvisible;
int i_relallfrozen;
int i_toastpages; int i_toastpages;
int i_owning_tab; int i_owning_tab;
int i_owning_col; int i_owning_col;
@ -7017,8 +7020,15 @@ getTables(Archive *fout, int *numTables)
"c.relowner, " "c.relowner, "
"c.relchecks, " "c.relchecks, "
"c.relhasindex, c.relhasrules, c.relpages, " "c.relhasindex, c.relhasrules, c.relpages, "
"c.reltuples, c.relallvisible, c.relhastriggers, " "c.reltuples, c.relallvisible, ");
"c.relpersistence, "
if (fout->remoteVersion >= 180000)
appendPQExpBufferStr(query, "c.relallfrozen, ");
else
appendPQExpBufferStr(query, "0 AS relallfrozen, ");
appendPQExpBufferStr(query,
"c.relhastriggers, c.relpersistence, "
"c.reloftype, " "c.reloftype, "
"c.relacl, " "c.relacl, "
"acldefault(CASE WHEN c.relkind = " CppAsString2(RELKIND_SEQUENCE) "acldefault(CASE WHEN c.relkind = " CppAsString2(RELKIND_SEQUENCE)
@ -7183,6 +7193,7 @@ getTables(Archive *fout, int *numTables)
i_relpages = PQfnumber(res, "relpages"); i_relpages = PQfnumber(res, "relpages");
i_reltuples = PQfnumber(res, "reltuples"); i_reltuples = PQfnumber(res, "reltuples");
i_relallvisible = PQfnumber(res, "relallvisible"); i_relallvisible = PQfnumber(res, "relallvisible");
i_relallfrozen = PQfnumber(res, "relallfrozen");
i_toastpages = PQfnumber(res, "toastpages"); i_toastpages = PQfnumber(res, "toastpages");
i_owning_tab = PQfnumber(res, "owning_tab"); i_owning_tab = PQfnumber(res, "owning_tab");
i_owning_col = PQfnumber(res, "owning_col"); i_owning_col = PQfnumber(res, "owning_col");
@ -7230,6 +7241,7 @@ getTables(Archive *fout, int *numTables)
for (i = 0; i < ntups; i++) for (i = 0; i < ntups; i++)
{ {
int32 relallvisible = atoi(PQgetvalue(res, i, i_relallvisible)); int32 relallvisible = atoi(PQgetvalue(res, i, i_relallvisible));
int32 relallfrozen = atoi(PQgetvalue(res, i, i_relallfrozen));
tblinfo[i].dobj.objType = DO_TABLE; tblinfo[i].dobj.objType = DO_TABLE;
tblinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_reltableoid)); tblinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_reltableoid));
@ -7336,7 +7348,7 @@ getTables(Archive *fout, int *numTables)
stats = getRelationStatistics(fout, &tblinfo[i].dobj, stats = getRelationStatistics(fout, &tblinfo[i].dobj,
tblinfo[i].relpages, tblinfo[i].relpages,
PQgetvalue(res, i, i_reltuples), PQgetvalue(res, i, i_reltuples),
relallvisible, relallvisible, relallfrozen,
tblinfo[i].relkind, NULL, 0); tblinfo[i].relkind, NULL, 0);
if (tblinfo[i].relkind == RELKIND_MATVIEW) if (tblinfo[i].relkind == RELKIND_MATVIEW)
tblinfo[i].stats = stats; tblinfo[i].stats = stats;
@ -7609,6 +7621,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
i_relpages, i_relpages,
i_reltuples, i_reltuples,
i_relallvisible, i_relallvisible,
i_relallfrozen,
i_parentidx, i_parentidx,
i_indexdef, i_indexdef,
i_indnkeyatts, i_indnkeyatts,
@ -7663,7 +7676,14 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"SELECT t.tableoid, t.oid, i.indrelid, " "SELECT t.tableoid, t.oid, i.indrelid, "
"t.relname AS indexname, " "t.relname AS indexname, "
"t.relpages, t.reltuples, t.relallvisible, " "t.relpages, t.reltuples, t.relallvisible, ");
if (fout->remoteVersion >= 180000)
appendPQExpBufferStr(query, "t.relallfrozen, ");
else
appendPQExpBufferStr(query, "0 AS relallfrozen, ");
appendPQExpBufferStr(query,
"pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, " "pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, "
"i.indkey, i.indisclustered, " "i.indkey, i.indisclustered, "
"c.contype, c.conname, " "c.contype, c.conname, "
@ -7779,6 +7799,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
i_relpages = PQfnumber(res, "relpages"); i_relpages = PQfnumber(res, "relpages");
i_reltuples = PQfnumber(res, "reltuples"); i_reltuples = PQfnumber(res, "reltuples");
i_relallvisible = PQfnumber(res, "relallvisible"); i_relallvisible = PQfnumber(res, "relallvisible");
i_relallfrozen = PQfnumber(res, "relallfrozen");
i_parentidx = PQfnumber(res, "parentidx"); i_parentidx = PQfnumber(res, "parentidx");
i_indexdef = PQfnumber(res, "indexdef"); i_indexdef = PQfnumber(res, "indexdef");
i_indnkeyatts = PQfnumber(res, "indnkeyatts"); i_indnkeyatts = PQfnumber(res, "indnkeyatts");
@ -7850,6 +7871,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
RelStatsInfo *relstats; RelStatsInfo *relstats;
int32 relpages = atoi(PQgetvalue(res, j, i_relpages)); int32 relpages = atoi(PQgetvalue(res, j, i_relpages));
int32 relallvisible = atoi(PQgetvalue(res, j, i_relallvisible)); int32 relallvisible = atoi(PQgetvalue(res, j, i_relallvisible));
int32 relallfrozen = atoi(PQgetvalue(res, j, i_relallfrozen));
indxinfo[j].dobj.objType = DO_INDEX; indxinfo[j].dobj.objType = DO_INDEX;
indxinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid)); indxinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
@ -7892,7 +7914,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
relstats = getRelationStatistics(fout, &indxinfo[j].dobj, relpages, relstats = getRelationStatistics(fout, &indxinfo[j].dobj, relpages,
PQgetvalue(res, j, i_reltuples), PQgetvalue(res, j, i_reltuples),
relallvisible, indexkind, relallvisible, relallfrozen, indexkind,
indAttNames, nindAttNames); indAttNames, nindAttNames);
contype = *(PQgetvalue(res, j, i_contype)); contype = *(PQgetvalue(res, j, i_contype));
@ -10618,9 +10640,15 @@ dumpRelationStats(Archive *fout, const RelStatsInfo *rsinfo)
appendPQExpBufferStr(out, ",\n"); appendPQExpBufferStr(out, ",\n");
appendPQExpBuffer(out, "\t'relpages', '%d'::integer,\n", rsinfo->relpages); appendPQExpBuffer(out, "\t'relpages', '%d'::integer,\n", rsinfo->relpages);
appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", rsinfo->reltuples); appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", rsinfo->reltuples);
appendPQExpBuffer(out, "\t'relallvisible', '%d'::integer\n);\n", appendPQExpBuffer(out, "\t'relallvisible', '%d'::integer",
rsinfo->relallvisible); rsinfo->relallvisible);
if (fout->remoteVersion >= 180000)
appendPQExpBuffer(out, ",\n\t'relallfrozen', '%d'::integer", rsinfo->relallfrozen);
appendPQExpBufferStr(out, "\n);\n");
/* fetch attribute stats */ /* fetch attribute stats */
appendPQExpBufferStr(query, "EXECUTE getAttributeStats("); appendPQExpBufferStr(query, "EXECUTE getAttributeStats(");
appendStringLiteralAH(query, dobj->namespace->dobj.name, fout); appendStringLiteralAH(query, dobj->namespace->dobj.name, fout);

View File

@ -442,6 +442,7 @@ typedef struct _relStatsInfo
int32 relpages; int32 relpages;
char *reltuples; char *reltuples;
int32 relallvisible; int32 relallvisible;
int32 relallfrozen;
char relkind; /* 'r', 'm', 'i', etc */ char relkind; /* 'r', 'm', 'i', etc */
/* /*

View File

@ -4771,7 +4771,8 @@ my %tests = (
'relname',\s'dup_test_post_data_ix',\s+ 'relname',\s'dup_test_post_data_ix',\s+
'relpages',\s'\d+'::integer,\s+ 'relpages',\s'\d+'::integer,\s+
'reltuples',\s'\d+'::real,\s+ 'reltuples',\s'\d+'::real,\s+
'relallvisible',\s'\d+'::integer\s+ 'relallvisible',\s'\d+'::integer,\s+
'relallfrozen',\s'\d+'::integer\s+
\);\s+ \);\s+
\QSELECT * FROM pg_catalog.pg_restore_attribute_stats(\E\s+ \QSELECT * FROM pg_catalog.pg_restore_attribute_stats(\E\s+
'version',\s'\d+'::integer,\s+ 'version',\s'\d+'::integer,\s+

View File

@ -648,6 +648,11 @@ sub adjust_new_dumpfile
$dump =~ s {\n(\s+'version',) '\d+'::integer,$} $dump =~ s {\n(\s+'version',) '\d+'::integer,$}
{$1 '000000'::integer,}mg; {$1 '000000'::integer,}mg;
if ($old_version < 18)
{
$dump =~ s {,\n(\s+'relallfrozen',) '-?\d+'::integer$}{}mg;
}
# pre-v16 dumps do not know about XMLSERIALIZE(NO INDENT). # pre-v16 dumps do not know about XMLSERIALIZE(NO INDENT).
if ($old_version < 16) if ($old_version < 16)
{ {