Skip to content

Commit cefdf54

Browse files
nathan-bossarthari90
authored andcommitted
pg_dump: Adjust reltuples from 0 to -1 for dumps of older versions.
Before v14, a reltuples value of 0 was ambiguous: it could either mean the relation is empty, or it could mean that it hadn't yet been vacuumed or analyzed. (Commit 3d351d9 taught v14 and newer to use -1 for the latter case.) This ambiguity allegedly can cause the planner to choose inefficient plans after restoring to v18 or newer. To fix, let's just dump reltuples as -1 in that case. This will cause some truly empty tables to be seen as not-yet-processed, but that seems unlikely to cause too much trouble in practice. Note that we could alternatively teach pg_restore_relation_stats() to translate reltuples based on the version argument, but since that function doesn't exist until v18, there's no particular advantage to that approach. That is, there's no chance of restoring stats dumped from a pre-v14 server to another pre-v14 server. Per discussion, the current policy is to fix pre-v18 behavior differences during export and everything else during import. Commit 9879105 fixed a similar problem for vacuumdb by removing the check for reltuples != 0. Presumably we could reinstate that check now, but I've chosen to leave it in place in case reltuples isn't accurate. As before, processing some empty tables seems relatively harmless. Author: Hari Krishna Sunder <hari.db.pg@gmail.com> Reviewed-by: Jeff Davis <pgsql@j-davis.com> Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Discussion: https://postgr.es/m/CAAeiqZ0o2p4SX5_xPcuAbbsmXjg6MJLNuPYSLUjC%3DWh-VeW64A%40mail.gmail.com (cherry picked from commit 5d6eac8)
1 parent 7c4b9bd commit cefdf54

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

src/bin/pg_dump/pg_dump.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10184,7 +10184,20 @@ dumpRelationStats_dumper(Archive *fout, const void *userArg, const TocEntry *te)
1018410184
appendStringLiteralAH(out, rsinfo->dobj.name, fout);
1018510185
appendPQExpBufferStr(out, ",\n");
1018610186
appendPQExpBuffer(out, "\t'relpages', '%d'::integer,\n", rsinfo->relpages);
10187-
appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", rsinfo->reltuples);
10187+
10188+
/*
10189+
* Before v14, a reltuples value of 0 was ambiguous: it could either mean
10190+
* the relation is empty, or it could mean that it hadn't yet been
10191+
* vacuumed or analyzed. (Newer versions use -1 for the latter case.)
10192+
* This ambiguity allegedly can cause the planner to choose inefficient
10193+
* plans after restoring to v18 or newer. To deal with this, let's just
10194+
* set reltuples to -1 in that case.
10195+
*/
10196+
if (fout->remoteVersion < 140000 && strcmp("0", rsinfo->reltuples) == 0)
10197+
appendPQExpBufferStr(out, "\t'reltuples', '-1'::real,\n");
10198+
else
10199+
appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", rsinfo->reltuples);
10200+
1018810201
appendPQExpBuffer(out, "\t'relallvisible', '%d'::integer\n);\n",
1018910202
rsinfo->relallvisible);
1019010203

0 commit comments

Comments
 (0)