From 93f28ca2d79f325a5ef81cfca5e4b899ed717486 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Mon, 16 Mar 2026 13:39:57 +0100
Subject: [PATCH v20260316 1/2] 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);
 }
 

base-commit: cd8844e7db64d57554c780ec9881457c573c51ab
-- 
2.34.1

