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
