Re: Test instability when pg_dump orders by OID
Noah Misch <noah@leadboat.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Rewrite previous commit's test for TestUpgradeXversion compatibility.
- fb75e1ef7212 13.23 landed
- 22c6a44f01fd 14.20 landed
- 090c9c9608b3 15.15 landed
- c6dca7c3dd65 18.0 landed
- 49a09c6c51c0 17.7 landed
- 412d29fd2166 16.11 landed
- ad4412480d3f 19 (unreleased) landed
-
Sort DO_DEFAULT_ACL dump objects independent of OIDs.
- 4948bb9df421 14.20 landed
- 05341b2e9914 13.23 landed
- fbf967e996dd 15.15 landed
- e8d22095e5df 17.7 landed
- e68fa9a830f0 16.11 landed
- 7652142f4c14 18.0 landed
- b61a5c4bed7d 19 (unreleased) landed
-
Remove, from stable branches, the new assertion of no pg_dump OID sort.
- bc05590c7fcd 13.22 landed
- 7846f470964c 14.19 landed
- 70637d7ae0a2 15.14 landed
- 28e7252e450a 17.6 landed
- 216683296101 16.10 landed
- 0d2734eac345 18.0 landed
-
Sort dump objects independent of OIDs, for the 7 holdout object types.
- 04bc2c42f765 13.22 landed
- 7ee7c1cd389e 14.19 landed
- 22f126da6cce 15.14 landed
- 1ca1889ea6a3 17.6 landed
- 0ac1581c3f2d 16.10 landed
- c0ae03384fa3 18.0 landed
- 0decd5e89db9 19 (unreleased) landed
-
pg_dump: provide a stable sort order for rules.
- cc9a62c51a18 13.22 landed
- 25388fb2cb84 14.19 landed
- e99010cbd8e2 15.14 landed
- 9affed26349a 16.10 landed
- 5dd4957b28df 17.6 landed
-
pg_dump: include comments on not-null constraints on domains, too
- da71717f0a7c 19 (unreleased) cited
-
Verify roundtrip dump/restore of regression database
- 172259afb563 18.0 cited
-
In pg_dump, use simplehash.h to look up dumpable objects by OID.
- 92316a4582a5 15.0 cited
-
Tweak pg_dumpall to add GRANT CONNECT ON DATABASE ... TO PUBLIC when dumping
- 2ee56b6a3ab8 8.3.0 cited
-
Restructure operator classes to allow improved handling of cross-data-type
- a78fcfb51243 8.3.0 cited
-
First phase of project to use fixed OIDs for all system catalogs and
- 7c13781ee7a6 8.1.0 cited
-
Tweak pg_dump to say GRANT ALL when appropriate, rather than enumerating
- 1b68bcfad33e 7.2.1 cited
Attachments
- dobjcmp20-disambiguate-v2.patch (text/plain) patch v2
- dobjcmp20-disambiguate-v2_17.patch (text/plain) patch v2
- dobjcmp20-disambiguate-v2_15.patch (text/plain) patch v2
- dobjcmp20-disambiguate-v2_14.patch (text/plain) patch v2
- dobjcmp20-disambiguate-v2_13.patch (text/plain) patch v2
On Mon, Jul 21, 2025 at 09:40:02AM -0400, Robert Haas wrote:
> On Fri, Jul 18, 2025 at 3:17 PM Noah Misch <noah@leadboat.com> wrote:
> > + * Sort by encoding, per pg_collation_name_enc_nsp_index. Wherever
> > + * this changes dump order, restoring the dump fails anyway. CREATE
> > + * COLLATION can't create a tie for this to break, because it imposes
> > + * restrictions to make (nspname, collname) uniquely identify a
> > + * collation within a given DatabaseEncoding. While
> > + * pg_import_system_collations() can create a tie, pg_dump+restore
> > + * fails after pg_import_system_collations('my_schema') does so.
> > + * There's little to gain by ignoring one natural key column on the
> > + * basis of those limitations elsewhere, so respect the full natural
> > + * key like we do for other object types.
>
> This is also good. I suggest s/Wherever/Technically, this is not
> necessary, because wherever/ and s/There's/However, there's/.
I used that. I started to prepare the back-branch versions, but that revealed
three problems affecting the master patch:
(1) Sorting constraints segfaulted if either of a pair of equal-name
constraints was a domain constraint. Fortunately, commit da71717 added a test
case for that between when I mailed patch v1 and when I went to commit. One
can reproduce it by dumping a database containing:
CREATE DOMAIN d1 AS int CONSTRAINT dc CHECK (value > 0);
CREATE DOMAIN d2 AS int CONSTRAINT dc CHECK (value > 0);
I made pg_dump sort domain constraints of a given name before table
constraints of that name, for consistency with our decision to sort CREATE
DOMAIN before CREATE TABLE. The main alternative was to sort by parent object
name irrespective of parent object type, i.e. DOMAIN a < TABLE b < DOMAIN c.
That alternative lacked a relevant precedent. I've now audited the natural
keys of catalogs for which I'm changing sort order, and I think that was the
only one I missed.
(2) Sorting opclasses failed a new assertion when dumping a v9.2 source (and
likely 9.[345]), because getAccessMethods() doesn't read pg_am when dumping
from a version predating CREATE ACCESS METHOD. findAccessMethodByOid() found
no access methods, since pg_dump had read none. I've changed
getAccessMethods() to always read pg_am. (For pre-v9.6 sources, I've kept the
function's behavior of never marking an access method for dumping.) pg_am is
small enough for this read to incur negligible cost. The main alternative
was, for pre-v9.6, sorting access methods by pg_am.oid. That would have been
less code, but dump order would have differed between pre-v9.6 and v9.6+.
(3) pgTypeNameCompare() implied postfix operators don't exist, but master
pg_dump will support reading from pre-v14 clusters for several more years.
The code behaved fine, but I've updated the comment.
I regret missing those in v1. I've attached v2, including branch-specific
patches. I'll first need to back-patch 350e6b8, which fixed sorting of CREATE
RULE, to v17 and earlier. Since 350e6b8 is conflict-free all the way back to
v13, I'm not attaching it.
Thanks,
nm