On Wed, Jun 10, 2026 at 6:48 AM Michael Paquier <[email protected]> wrote:
>
> On Mon, Jun 08, 2026 at 02:43:22PM -0400, Tom Lane wrote:
> > The argument that these only need to be machine-readable doesn't sway
> > me a lot.  In the end, any code that is disassembling these strings is
> > going to be written by a human, and the human is a lot more likely to
> > make a mistake about which identifier is which if they're not labeled.
>
> +1.  I'm not a robot yet and I still want to be able to parse these
> strings by reading them.  As things stand, this code does not allow
> one to understand what each sub-object refers to.  We are still in
> beta, let's improve the situation.

Here's a patch fixing it.

-- 
Best Wishes,
Ashutosh Bapat
From a598fa1207301f822e608b4143324a1125a44685 Mon Sep 17 00:00:00 2001
From: Ashutosh Bapat <[email protected]>
Date: Wed, 10 Jun 2026 09:05:21 +0530
Subject: [PATCH v20260610 8/8] Readable identity strings for property graph
 objects

The 'identity' column of pg_identify_object() for property graph objects can be
long string of names connected by 'of' e.g. "a of l of e of g". The type of the
first named object is given by column 'type'. But the types of intermediate
objects are not easy to find from the identity string especially when some of
them share the same name.  Some objects like user mappings, or authorization
identifier members, add types of objects other than the first one in the
identity string. Do the same for property graph objects.

Author: Ashutosh Bapat <[email protected]>
---
 src/backend/catalog/objectaddress.c           | 10 ++--
 .../expected/create_property_graph.out        | 50 +++++++++----------
 2 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 33706f6de60..d5d1d41b512 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -6186,7 +6186,7 @@ getObjectIdentityParts(const ObjectAddress *object,
 					break;
 				}
 				pge = (Form_pg_propgraph_element) GETSTRUCT(tup);
-				appendStringInfo(&buffer, "%s of ", quote_identifier(NameStr(pge->pgealias)));
+				appendStringInfo(&buffer, "%s of property graph ", quote_identifier(NameStr(pge->pgealias)));
 
 				getRelationIdentity(&buffer, pge->pgepgid, objname, false);
 				if (objname)
@@ -6210,7 +6210,7 @@ getObjectIdentityParts(const ObjectAddress *object,
 				}
 
 				pgl = (Form_pg_propgraph_label) GETSTRUCT(tup);
-				appendStringInfo(&buffer, "%s of ", quote_identifier(NameStr(pgl->pgllabel)));
+				appendStringInfo(&buffer, "%s of property graph ", quote_identifier(NameStr(pgl->pgllabel)));
 				getRelationIdentity(&buffer, pgl->pglpgid, objname, false);
 				if (objname)
 					*objname = lappend(*objname, pstrdup(NameStr(pgl->pgllabel)));
@@ -6232,7 +6232,7 @@ getObjectIdentityParts(const ObjectAddress *object,
 				}
 
 				pgp = (Form_pg_propgraph_property) GETSTRUCT(tup);
-				appendStringInfo(&buffer, "%s of ", quote_identifier(NameStr(pgp->pgpname)));
+				appendStringInfo(&buffer, "%s of property graph ", quote_identifier(NameStr(pgp->pgpname)));
 				getRelationIdentity(&buffer, pgp->pgppgid, objname, false);
 				if (objname)
 					*objname = lappend(*objname, pstrdup(NameStr(pgp->pgpname)));
@@ -6265,7 +6265,7 @@ getObjectIdentityParts(const ObjectAddress *object,
 				pgelform = (Form_pg_propgraph_element_label) GETSTRUCT(tup);
 
 				labelname = get_propgraph_label_name(pgelform->pgellabelid);
-				appendStringInfo(&buffer, "%s of ", quote_identifier(labelname));
+				appendStringInfo(&buffer, "%s of element ", quote_identifier(labelname));
 				ObjectAddressSet(oa, PropgraphElementRelationId, pgelform->pgelelid);
 				appendStringInfoString(&buffer, getObjectIdentityParts(&oa, objname,
 																	   objargs, false));
@@ -6303,7 +6303,7 @@ getObjectIdentityParts(const ObjectAddress *object,
 				plpform = (Form_pg_propgraph_label_property) GETSTRUCT(tup);
 
 				propname = get_propgraph_property_name(plpform->plppropid);
-				appendStringInfo(&buffer, "%s of ", quote_identifier(propname));
+				appendStringInfo(&buffer, "%s of label ", quote_identifier(propname));
 				ObjectAddressSet(oa, PropgraphElementLabelRelationId, plpform->plpellabelid);
 				appendStringInfoString(&buffer, getObjectIdentityParts(&oa, objname,
 																	   objargs, false));
diff --git a/src/test/regress/expected/create_property_graph.out b/src/test/regress/expected/create_property_graph.out
index f9d17aeb34a..1e733f9b572 100644
--- a/src/test/regress/expected/create_property_graph.out
+++ b/src/test/regress/expected/create_property_graph.out
@@ -759,31 +759,31 @@ SELECT (pg_identify_object_as_address(classid, objid, objsubid)).*
 SELECT (pg_identify_object(classid, objid, objsubid)).*
     FROM (SELECT DISTINCT classid, objid, objsubid FROM deps_tree)
     ORDER BY 1, 2, 3, 4;
-             type              | schema | name |                    identity                     
--------------------------------+--------+------+-------------------------------------------------
- property graph element        |        |      | e of create_property_graph_tests.gt
- property graph element        |        |      | v1 of create_property_graph_tests.gt
- property graph element        |        |      | v2 of create_property_graph_tests.gt
- property graph element label  |        |      | e of e of create_property_graph_tests.gt
- property graph element label  |        |      | v1 of v1 of create_property_graph_tests.gt
- property graph element label  |        |      | v2 of v2 of create_property_graph_tests.gt
- property graph label          |        |      | e of create_property_graph_tests.gt
- property graph label          |        |      | v1 of create_property_graph_tests.gt
- property graph label          |        |      | v2 of create_property_graph_tests.gt
- property graph label property |        |      | a of v1 of v1 of create_property_graph_tests.gt
- property graph label property |        |      | b of v1 of v1 of create_property_graph_tests.gt
- property graph label property |        |      | c of e of e of create_property_graph_tests.gt
- property graph label property |        |      | k1 of e of e of create_property_graph_tests.gt
- property graph label property |        |      | k2 of e of e of create_property_graph_tests.gt
- property graph label property |        |      | m of v2 of v2 of create_property_graph_tests.gt
- property graph label property |        |      | n of v2 of v2 of create_property_graph_tests.gt
- property graph property       |        |      | a of create_property_graph_tests.gt
- property graph property       |        |      | b of create_property_graph_tests.gt
- property graph property       |        |      | c of create_property_graph_tests.gt
- property graph property       |        |      | k1 of create_property_graph_tests.gt
- property graph property       |        |      | k2 of create_property_graph_tests.gt
- property graph property       |        |      | m of create_property_graph_tests.gt
- property graph property       |        |      | n of create_property_graph_tests.gt
+             type              | schema | name |                                   identity                                   
+-------------------------------+--------+------+------------------------------------------------------------------------------
+ property graph element        |        |      | e of property graph create_property_graph_tests.gt
+ property graph element        |        |      | v1 of property graph create_property_graph_tests.gt
+ property graph element        |        |      | v2 of property graph create_property_graph_tests.gt
+ property graph element label  |        |      | e of element e of property graph create_property_graph_tests.gt
+ property graph element label  |        |      | v1 of element v1 of property graph create_property_graph_tests.gt
+ property graph element label  |        |      | v2 of element v2 of property graph create_property_graph_tests.gt
+ property graph label          |        |      | e of property graph create_property_graph_tests.gt
+ property graph label          |        |      | v1 of property graph create_property_graph_tests.gt
+ property graph label          |        |      | v2 of property graph create_property_graph_tests.gt
+ property graph label property |        |      | a of label v1 of element v1 of property graph create_property_graph_tests.gt
+ property graph label property |        |      | b of label v1 of element v1 of property graph create_property_graph_tests.gt
+ property graph label property |        |      | c of label e of element e of property graph create_property_graph_tests.gt
+ property graph label property |        |      | k1 of label e of element e of property graph create_property_graph_tests.gt
+ property graph label property |        |      | k2 of label e of element e of property graph create_property_graph_tests.gt
+ property graph label property |        |      | m of label v2 of element v2 of property graph create_property_graph_tests.gt
+ property graph label property |        |      | n of label v2 of element v2 of property graph create_property_graph_tests.gt
+ property graph property       |        |      | a of property graph create_property_graph_tests.gt
+ property graph property       |        |      | b of property graph create_property_graph_tests.gt
+ property graph property       |        |      | c of property graph create_property_graph_tests.gt
+ property graph property       |        |      | k1 of property graph create_property_graph_tests.gt
+ property graph property       |        |      | k2 of property graph create_property_graph_tests.gt
+ property graph property       |        |      | m of property graph create_property_graph_tests.gt
+ property graph property       |        |      | n of property graph create_property_graph_tests.gt
 (23 rows)
 
 \a\t
-- 
2.34.1

Reply via email to