Skip to content

Commit ebe73fe

Browse files
nathan-bossartCommitfest Bot
authored andcommitted
pg_dump: Adjust reltuples from 0 to -1 for dumps on 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 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. 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 pretty innocuous. Author: Hari Krishna Sunder <[email protected]> Discussion: https://postgr.es/m/CAAeiqZ0o2p4SX5_xPcuAbbsmXjg6MJLNuPYSLUjC%3DWh-VeW64A%40mail.gmail.com
1 parent f3622b6 commit ebe73fe

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
@@ -10929,7 +10929,20 @@ dumpRelationStats_dumper(Archive *fout, const void *userArg, const TocEntry *te)
1092910929
appendStringLiteralAH(out, rsinfo->dobj.name, fout);
1093010930
appendPQExpBufferStr(out, ",\n");
1093110931
appendPQExpBuffer(out, "\t'relpages', '%d'::integer,\n", rsinfo->relpages);
10932-
appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", rsinfo->reltuples);
10932+
10933+
/*
10934+
* Before v14, a reltuples value of 0 was ambiguous: it could either mean
10935+
* the relation is empty, or it could mean that it hadn't yet been
10936+
* vacuumed or analyzed. (Newer versions use -1 for the latter case.)
10937+
* This ambiguity can cause the planner to choose inefficient plans after
10938+
* restoring to v18 or newer. To deal with this, let's just set reltuples
10939+
* to -1 in that case.
10940+
*/
10941+
if (fout->remoteVersion < 140000 && strcmp("0", rsinfo->reltuples) == 0)
10942+
appendPQExpBufferStr(out, "\t'reltuples', '-1'::real,\n");
10943+
else
10944+
appendPQExpBuffer(out, "\t'reltuples', '%s'::real,\n", rsinfo->reltuples);
10945+
1093310946
appendPQExpBuffer(out, "\t'relallvisible', '%d'::integer",
1093410947
rsinfo->relallvisible);
1093510948

0 commit comments

Comments
 (0)