Add relallfrozen to pg_dump statistics.
authorJeff Davis <jdavis@postgresql.org>
Mon, 31 Mar 2025 05:14:06 +0000 (22:14 -0700)
committerJeff Davis <jdavis@postgresql.org>
Mon, 31 Mar 2025 05:14:06 +0000 (22:14 -0700)
Author: Corey Huinker <corey.huinker@gmail.com>
Discussion: https://postgr.es/m/CADkLM=desCuf3dVHasADvdUVRmb-5gO0mhMO5u9nzgv6i7U86Q@mail.gmail.com

src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/pg_dump.h
src/bin/pg_dump/t/002_pg_dump.pl
src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm

index 84a78625820cad1e5a29dba90e9175fd3d636275..4ca34be230cd73b94d82550ba97a187bf1a3b627 100644 (file)
@@ -6874,7 +6874,8 @@ getFuncs(Archive *fout)
  */
 static RelStatsInfo *
 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)
 {
    if (!fout->dopt->dumpStatistics)
@@ -6903,6 +6904,7 @@ getRelationStatistics(Archive *fout, DumpableObject *rel, int32 relpages,
        info->relpages = relpages;
        info->reltuples = pstrdup(reltuples);
        info->relallvisible = relallvisible;
+       info->relallfrozen = relallfrozen;
        info->relkind = relkind;
        info->indAttNames = indAttNames;
        info->nindAttNames = nindAttNames;
@@ -6967,6 +6969,7 @@ getTables(Archive *fout, int *numTables)
    int         i_relpages;
    int         i_reltuples;
    int         i_relallvisible;
+   int         i_relallfrozen;
    int         i_toastpages;
    int         i_owning_tab;
    int         i_owning_col;
@@ -7017,8 +7020,15 @@ getTables(Archive *fout, int *numTables)
                         "c.relowner, "
                         "c.relchecks, "
                         "c.relhasindex, c.relhasrules, c.relpages, "
-                        "c.reltuples, c.relallvisible, c.relhastriggers, "
-                        "c.relpersistence, "
+                        "c.reltuples, c.relallvisible, ");
+
+   if (fout->remoteVersion >= 180000)
+       appendPQExpBufferStr(query, "c.relallfrozen, ");
+   else
+       appendPQExpBufferStr(query, "0 AS relallfrozen, ");
+
+   appendPQExpBufferStr(query,
+                        "c.relhastriggers, c.relpersistence, "
                         "c.reloftype, "
                         "c.relacl, "
                         "acldefault(CASE WHEN c.relkind = " CppAsString2(RELKIND_SEQUENCE)
@@ -7183,6 +7193,7 @@ getTables(Archive *fout, int *numTables)
    i_relpages = PQfnumber(res, "relpages");
    i_reltuples = PQfnumber(res, "reltuples");
    i_relallvisible = PQfnumber(res, "relallvisible");
+   i_relallfrozen = PQfnumber(res, "relallfrozen");
    i_toastpages = PQfnumber(res, "toastpages");
    i_owning_tab = PQfnumber(res, "owning_tab");
    i_owning_col = PQfnumber(res, "owning_col");
@@ -7230,6 +7241,7 @@ getTables(Archive *fout, int *numTables)
    for (i = 0; i < ntups; i++)
    {
        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.catId.tableoid = atooid(PQgetvalue(res, i, i_reltableoid));
@@ -7336,7 +7348,7 @@ getTables(Archive *fout, int *numTables)
            stats = getRelationStatistics(fout, &tblinfo[i].dobj,
                                          tblinfo[i].relpages,
                                          PQgetvalue(res, i, i_reltuples),
-                                         relallvisible,
+                                         relallvisible, relallfrozen,
                                          tblinfo[i].relkind, NULL, 0);
            if (tblinfo[i].relkind == RELKIND_MATVIEW)
                tblinfo[i].stats = stats;
@@ -7609,6 +7621,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
                i_relpages,
                i_reltuples,
                i_relallvisible,
+               i_relallfrozen,
                i_parentidx,
                i_indexdef,
                i_indnkeyatts,
@@ -7663,7 +7676,14 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
    appendPQExpBufferStr(query,
                         "SELECT t.tableoid, t.oid, i.indrelid, "
                         "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, "
                         "i.indkey, i.indisclustered, "
                         "c.contype, c.conname, "
@@ -7779,6 +7799,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
    i_relpages = PQfnumber(res, "relpages");
    i_reltuples = PQfnumber(res, "reltuples");
    i_relallvisible = PQfnumber(res, "relallvisible");
+   i_relallfrozen = PQfnumber(res, "relallfrozen");
    i_parentidx = PQfnumber(res, "parentidx");
    i_indexdef = PQfnumber(res, "indexdef");
    i_indnkeyatts = PQfnumber(res, "indnkeyatts");
@@ -7850,6 +7871,7 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
            RelStatsInfo *relstats;
            int32       relpages = atoi(PQgetvalue(res, j, i_relpages));
            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.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,
                                             PQgetvalue(res, j, i_reltuples),
-                                            relallvisible, indexkind,
+                                            relallvisible, relallfrozen, indexkind,
                                             indAttNames, nindAttNames);
 
            contype = *(PQgetvalue(res, j, i_contype));
@@ -10618,9 +10640,15 @@ dumpRelationStats(Archive *fout, const RelStatsInfo *rsinfo)
    appendPQExpBufferStr(out, ",\n");
    appendPQExpBuffer(out, "\t'relpages', '%d'::integer,\n", rsinfo->relpages);
    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);
 
+   if (fout->remoteVersion >= 180000)
+       appendPQExpBuffer(out, ",\n\t'relallfrozen', '%d'::integer", rsinfo->relallfrozen);
+
+   appendPQExpBufferStr(out, "\n);\n");
+
+
    /* fetch attribute stats */
    appendPQExpBufferStr(query, "EXECUTE getAttributeStats(");
    appendStringLiteralAH(query, dobj->namespace->dobj.name, fout);
index 70f7a369e4a6bd9b36c0edf23d0966ac8c2cbfec..e6f0f86a4593a2fb02dcc3e1e988000e43e0b802 100644 (file)
@@ -442,6 +442,7 @@ typedef struct _relStatsInfo
    int32       relpages;
    char       *reltuples;
    int32       relallvisible;
+   int32       relallfrozen;
    char        relkind;        /* 'r', 'm', 'i', etc */
 
    /*
index 51ebf8ad13c10c5290405ca2252108a741e86052..576326daec73364f35a6e40290d6e3217f700b0e 100644 (file)
@@ -4771,7 +4771,8 @@ my %tests = (
            'relname',\s'dup_test_post_data_ix',\s+
            'relpages',\s'\d+'::integer,\s+
            'reltuples',\s'\d+'::real,\s+
-           'relallvisible',\s'\d+'::integer\s+
+           'relallvisible',\s'\d+'::integer,\s+
+           'relallfrozen',\s'\d+'::integer\s+
            \);\s+
            \QSELECT * FROM pg_catalog.pg_restore_attribute_stats(\E\s+
            'version',\s'\d+'::integer,\s+
index 81a8f44aa9f07ff94d5aaac80a4c4cc79e01a21b..c451aea3ac9116673e24ad7dae7dd9e196c99274 100644 (file)
@@ -648,6 +648,11 @@ sub adjust_new_dumpfile
    $dump =~ s {\n(\s+'version',) '\d+'::integer,$}
        {$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).
    if ($old_version < 16)
    {