On 11.03.26 08:34, Ashutosh Bapat wrote:
There are two new patches 0004 and 0005 in the attached patchset.

I have committed this, including the 0004 patch. Let's consider the 0005 patch separately.

The buildfarm shows some instability in the pg_upgrade test, because labels are printed by pg_get_propgraphdef() in implementation-dependent order. Attached is a quick patch to sort the labels before printing. Check please.
From 97b94795b3489936a1ad0d78c2fa5e859c078421 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 16 Mar 2026 13:39:57 +0100
Subject: [PATCH] WIP: Dump labels in reproducible order

---
 src/backend/utils/adt/ruleutils.c | 43 ++++++++++++++++++++++++++-----
 1 file changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/backend/utils/adt/ruleutils.c 
b/src/backend/utils/adt/ruleutils.c
index 153a92fd3ea..dc736c6bd37 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -1772,6 +1772,21 @@ make_propgraphdef_elements(StringInfo buf, Oid pgrelid, 
char pgekind)
        table_close(pgerel, AccessShareLock);
 }
 
+struct oid_str_pair
+{
+       Oid oid;
+       char *str;
+};
+
+static int
+list_oid_str_pair_cmp_by_str(const ListCell *p1, const ListCell *p2)
+{
+       struct oid_str_pair *v1 = lfirst(p1);
+       struct oid_str_pair *v2 = lfirst(p2);
+
+       return strcmp(v1->str, v2->str);
+}
+
 /*
  * Generates label and properties list.  Pass in the element OID, the element
  * alias, and the graph relation OID.  Result is appended to buf.
@@ -1784,6 +1799,7 @@ make_propgraphdef_labels(StringInfo buf, Oid elid, const 
char *elalias, Oid elre
        SysScanDesc scan;
        int                     count;
        HeapTuple       tup;
+       List       *label_list = NIL;
 
        pglrel = table_open(PropgraphElementLabelRelationId, AccessShareLock);
 
@@ -1800,29 +1816,42 @@ make_propgraphdef_labels(StringInfo buf, Oid elid, 
const char *elalias, Oid elre
        }
        systable_endscan(scan);
 
+       /*
+        * Collect the labels into a list, then sort before printing, to get 
stable dump output.
+        */
+
        scan = systable_beginscan(pglrel, 
PropgraphElementLabelElementLabelIndexId, true, NULL, 1, scankey);
 
        while ((tup = systable_getnext(scan)))
        {
                Form_pg_propgraph_element_label pgelform = 
(Form_pg_propgraph_element_label) GETSTRUCT(tup);
-               const char *labelname;
+               struct oid_str_pair *osp;
+
+               osp = palloc_object(struct oid_str_pair);
+               osp->oid = pgelform->oid;
+               osp->str = get_propgraph_label_name(pgelform->pgellabelid);
 
-               labelname = get_propgraph_label_name(pgelform->pgellabelid);
+               label_list = lappend(label_list, osp);
+       }
+
+       systable_endscan(scan);
 
-               if (strcmp(labelname, elalias) == 0)
+       list_sort(label_list, list_oid_str_pair_cmp_by_str);
+
+       foreach_ptr(struct oid_str_pair, osp, label_list)
+       {
+               if (strcmp(osp->str, elalias) == 0)
                {
                        /* If the default label is the only label, don't print 
anything. */
                        if (count != 1)
                                appendStringInfo(buf, " DEFAULT LABEL");
                }
                else
-                       appendStringInfo(buf, " LABEL %s", 
quote_identifier(labelname));
+                       appendStringInfo(buf, " LABEL %s", 
quote_identifier(osp->str));
 
-               make_propgraphdef_properties(buf, pgelform->oid, elrelid);
+               make_propgraphdef_properties(buf, osp->oid, elrelid);
        }
 
-       systable_endscan(scan);
-
        table_close(pglrel, AccessShareLock);
 }
 
-- 
2.53.0

Reply via email to