pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Andreas Karlsson <andreas@proxel.se>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Subject: Always have pg_dump write rules in a consistent order
Date: Tue, 29 Oct 2024 19:50:42 +0100
Message-ID: <b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se> (raw)

Hi,

When working on a new feature for PostgreSQL I noticed that the 
pg_upgrade tests became flaky due to rules being dumped in a different 
order between the original cluster and the upgraded cluster. (For 
context: my regress scripts left a bunch of views with dependency 
circles which I had forgot to clean up.)

So I propose that we sort rules on (schema, name, relation_name) instead 
of (schema, name, oid) like it currently does. The patch itself is small 
enough and makes it easier to test that we upgrade rules and views 
correctly with pg_upgrade.

Andreas

Attachments:

  [text/x-patch] 0001-Make-pg_dump-always-write-rules-in-a-stable-order.patch (1.4K, ../b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se/2-0001-Make-pg_dump-always-write-rules-in-a-stable-order.patch)
  download | inline diff:
From 18b39f0e79306082481c7ee304de578f5b32a6b7 Mon Sep 17 00:00:00 2001
From: Andreas Karlsson <andreas@proxel.se>
Date: Tue, 29 Oct 2024 14:59:04 +0100
Subject: [PATCH] Make pg_dump always write rules in a stable order

Instead of sorting rules by schema and name and then finally oid in
pg_dump we sort them by schema, name and relation name. This way we make
sure that the order rules are dumped in consistent across dump plus
restore.

This is especially a big problem if we have to break depednency many
cycles involving views and we get a lot of views named _RETURN.
---
 src/bin/pg_dump/pg_dump_sort.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c
index 4cb754caa55..e0f70abdcc2 100644
--- a/src/bin/pg_dump/pg_dump_sort.c
+++ b/src/bin/pg_dump/pg_dump_sort.c
@@ -305,6 +305,17 @@ DOTypeNameCompare(const void *p1, const void *p2)
 		if (cmpval != 0)
 			return cmpval;
 	}
+	else if (obj1->objType == DO_RULE)
+	{
+		RuleInfo *robj1 = *(RuleInfo *const *) p1;
+		RuleInfo *robj2 = *(RuleInfo *const *) p2;
+
+		/* Sort by the rule's table name (namespace and name were considered already) */
+		cmpval = strcmp(robj1->ruletable->dobj.name,
+						robj2->ruletable->dobj.name);
+		if (cmpval != 0)
+			return cmpval;
+	}
 
 	/* Usually shouldn't get here, but if we do, sort by OID */
 	return oidcmp(obj1->catId.oid, obj2->catId.oid);
-- 
2.45.2



view thread (3+ messages)  latest in thread

Message-ID: <b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se>
Permalink:  ../b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se/
Also on:    postgresql.org/message-id/b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: andreas@proxel.se
  Subject: Re: Always have pg_dump write rules in a consistent order
  In-Reply-To: <b4e468d8-0cd6-42e6-ac8a-1d6afa6e0cf1@proxel.se>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox