From: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
To: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Cc: Michael Paquier <michael@paquier.xyz>
Cc: pgsql-hackers@lists.postgresql.org, Peter Eisentraut <peter@eisentraut.org>
Subject: Re: Fix DROP PROPERTY GRAPH "unsupported object class" error
Date: Tue, 5 May 2026 06:00:23 +0000
Message-ID: <afmHd5vSCJtMFueS@bdtpg> (raw)
In-Reply-To: <CAExHW5udMZbMKiQFWB=hDeAK+=t2PXPrmBuscpUc3888kzAi2A@mail.gmail.com>
References: <aej1DkLwhyZWmtxJ@bdtpg>
<aem-pjK57peuLI-x@paquier.xyz>
<CAExHW5vtRyD_kfFP5S6o=+afzpR7Yd7sS=cia_0uHhM3GzLcag@mail.gmail.com>
<aen77u5go8P7RJaL@bdtpg>
<CAExHW5vfxVCQFADhiEmi3goyOgGb5qQjURHaM2QDtW6CksUzWA@mail.gmail.com>
<aet7rawq/V07+H1L@bdtpg>
<CAExHW5vJGHDXyLDAVC3eJF_ykU73AB9CG6HvJ+WtmO+GE4dnzA@mail.gmail.com>
<afM8dgqqxsxqmnY7@bdtpg>
<CAExHW5udMZbMKiQFWB=hDeAK+=t2PXPrmBuscpUc3888kzAi2A@mail.gmail.com>
Hi,
On Thu, Apr 30, 2026 at 06:01:22PM +0530, Ashutosh Bapat wrote:
> On Thu, Apr 30, 2026 at 4:56 PM Bertrand Drouvot
> <bertranddrouvot.pg@gmail.com> wrote:
> >
> > I can see the the instability locally with en_US.UTF-8 (gt before _gt) and I
> > can see that, for example sifaka, has en_US.UTF-8 in locales. So, modifying the
> > impacted query a bit to add COLLATE "C" in the attached.
> >
>
> I did wonder where the instability is coming from the new query - it's
> because now we are traversing the entire dependency tree which also
> contains array type of reltype.
Right.
> I think we should just eliminate it
> from the result just like we are eliminating the rule. There is slight
> convenience in keeping the query as is - it need not change even
> though the columns returned by the function change and it's more
> readable. I also think that we don't need a type defined for a
> property graph - it doesn't contain any row as well as the shape of
> the result of GRAPH_TABLE depends upon the COLUMNS clause - so that's
> not fixed as well. I will start a separate thread for that discussion.
Yeah, now that 891a57c7394 is in, PFA a new version of the patch. This is just
a mandatory rebase and the COLLATE "C" removals.
Regards,
--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.comAttachments:v6-0001-Handle-element-label-and-element-label-property-o.patch (text/x-diff, 31.7K) download
From 322cd4e2fe26d032398c289ad30055dbb83551b4 Mon Sep 17 00:00:00 2001
From: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Date: Thu, 23 Apr 2026 09:27:39 +0000
Subject: [PATCH] Handle element label and element label property objects in
object address functions
getObjectTypeDescription() and getObjectIdentityParts() do not handle objects in
pg_propgraph_element_label and pg_propgraph_label_property catalogs. These
functions when called for handling a DDL that affects these objects causes
"unsupported object class" error. An error is reported when these functions are
called when pg_identify_object() and pg_identify_object_as_address() are invoked
with objects from the said catalogs.
The objects in these catalogs do not have a (user given) name but they can be
manipulated invdividually through ALTER PROPERTY GRAPH sub-commands. Hence they
need to be accessible to the event triggers. Handle these catalogs in the
respective functions.
Reported-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Author: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Author: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Reviewed-by: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com>
Discussion: https://postgr.es/m/aej1DkLwhyZWmtxJ@bdtpg
---
src/backend/catalog/objectaddress.c | 111 ++++++++--
.../expected/create_property_graph.out | 189 ++++++++++--------
src/test/regress/expected/event_trigger.out | 22 ++
src/test/regress/expected/object_address.out | 9 +-
.../regress/sql/create_property_graph.sql | 31 ++-
src/test/regress/sql/event_trigger.sql | 15 ++
src/test/regress/sql/object_address.sql | 5 +-
7 files changed, 267 insertions(+), 115 deletions(-)
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.cindex c1862809577..70058522b35 100644--- a/src/backend/catalog/objectaddress.c+++ b/src/backend/catalog/objectaddress.c@@ -4106,26 +4106,19 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok)
case PropgraphElementLabelRelationId:
{
Relation rel;
- SysScanDesc scan;- ScanKeyData key[1];
HeapTuple tuple;
Form_pg_propgraph_element_label pgelform;
ObjectAddress oa;
rel = table_open(PropgraphElementLabelRelationId, AccessShareLock);
- ScanKeyInit(&key[0],- Anum_pg_propgraph_element_label_oid,- BTEqualStrategyNumber, F_OIDEQ,- ObjectIdGetDatum(object->objectId));-- scan = systable_beginscan(rel, PropgraphElementLabelObjectIndexId, true, NULL, 1, key);- tuple = systable_getnext(scan);+ tuple = get_catalog_object_by_oid(rel,+ Anum_pg_propgraph_element_label_oid,+ object->objectId);
if (!HeapTupleIsValid(tuple))
{
if (!missing_ok)
elog(ERROR, "could not find tuple for element label %u", object->objectId);
- systable_endscan(scan);
table_close(rel, AccessShareLock);
break;
}
@@ -4136,7 +4129,6 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok)
ObjectAddressSet(oa, PropgraphElementRelationId, pgelform->pgelelid);
appendStringInfoString(&buffer, getObjectDescription(&oa, false));
- systable_endscan(scan);
table_close(rel, AccessShareLock);
break;
}
@@ -4166,26 +4158,19 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok)
case PropgraphLabelPropertyRelationId:
{
Relation rel;
- SysScanDesc scan;- ScanKeyData key[1];
HeapTuple tuple;
Form_pg_propgraph_label_property plpform;
ObjectAddress oa;
rel = table_open(PropgraphLabelPropertyRelationId, AccessShareLock);
- ScanKeyInit(&key[0],- Anum_pg_propgraph_label_property_oid,- BTEqualStrategyNumber, F_OIDEQ,- ObjectIdGetDatum(object->objectId));-- scan = systable_beginscan(rel, PropgraphLabelPropertyObjectIndexId, true, NULL, 1, key);- tuple = systable_getnext(scan);+ tuple = get_catalog_object_by_oid(rel,+ Anum_pg_propgraph_label_property_oid,+ object->objectId);
if (!HeapTupleIsValid(tuple))
{
if (!missing_ok)
elog(ERROR, "could not find tuple for label property %u", object->objectId);
- systable_endscan(scan);
table_close(rel, AccessShareLock);
break;
}
@@ -4196,7 +4181,6 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok)
ObjectAddressSet(oa, PropgraphElementLabelRelationId, plpform->plpellabelid);
appendStringInfoString(&buffer, getObjectDescription(&oa, false));
- systable_endscan(scan);
table_close(rel, AccessShareLock);
break;
}
@@ -4913,6 +4897,14 @@ getObjectTypeDescription(const ObjectAddress *object, bool missing_ok)
appendStringInfoString(&buffer, "property graph property");
break;
+ case PropgraphElementLabelRelationId:+ appendStringInfoString(&buffer, "property graph element label");+ break;++ case PropgraphLabelPropertyRelationId:+ appendStringInfoString(&buffer, "property graph element label property");+ break;+
case PublicationRelationId:
appendStringInfoString(&buffer, "publication");
break;
@@ -6228,6 +6220,81 @@ getObjectIdentityParts(const ObjectAddress *object,
break;
}
+ case PropgraphElementLabelRelationId:+ {+ Relation ellabelDesc;+ HeapTuple tup;+ Form_pg_propgraph_element_label pgelform;+ ObjectAddress oa;+ char *labelname;++ ellabelDesc = table_open(PropgraphElementLabelRelationId, AccessShareLock);+ tup = get_catalog_object_by_oid(ellabelDesc,+ Anum_pg_propgraph_element_label_oid,+ object->objectId);+ if (!HeapTupleIsValid(tup))+ {+ if (!missing_ok)+ elog(ERROR, "could not find tuple for element label %u",+ object->objectId);++ table_close(ellabelDesc, AccessShareLock);+ break;+ }++ pgelform = (Form_pg_propgraph_element_label) GETSTRUCT(tup);++ labelname = get_propgraph_label_name(pgelform->pgellabelid);+ appendStringInfo(&buffer, _("%s of "), quote_identifier(labelname));+ ObjectAddressSet(oa, PropgraphElementRelationId, pgelform->pgelelid);+ appendStringInfoString(&buffer, getObjectIdentityParts(&oa, objname,+ objargs, false));+ /* labelname is already pstrdup'ed. */+ if (objname)+ *objname = lappend(*objname, labelname);++ table_close(ellabelDesc, AccessShareLock);+ break;+ }++ case PropgraphLabelPropertyRelationId:+ {+ Relation lblpropDesc;+ HeapTuple tup;+ Form_pg_propgraph_label_property plpform;+ ObjectAddress oa;+ char *propname;++ lblpropDesc = table_open(PropgraphLabelPropertyRelationId,+ AccessShareLock);+ tup = get_catalog_object_by_oid(lblpropDesc,+ Anum_pg_propgraph_label_property_oid,+ object->objectId);+ if (!HeapTupleIsValid(tup))+ {+ if (!missing_ok)+ elog(ERROR, "could not find tuple for label property %u",+ object->objectId);++ table_close(lblpropDesc, AccessShareLock);+ break;+ }++ plpform = (Form_pg_propgraph_label_property) GETSTRUCT(tup);++ propname = get_propgraph_property_name(plpform->plppropid);+ appendStringInfo(&buffer, _("%s of "), quote_identifier(propname));+ ObjectAddressSet(oa, PropgraphElementLabelRelationId, plpform->plpellabelid);+ appendStringInfoString(&buffer, getObjectIdentityParts(&oa, objname,+ objargs, false));+ /* propname is already pstrdup'ed. */+ if (objname)+ *objname = lappend(*objname, propname);++ table_close(lblpropDesc, AccessShareLock);+ break;+ }+
case PublicationRelationId:
{
char *pubname;
diff --git a/src/test/regress/expected/create_property_graph.out b/src/test/regress/expected/create_property_graph.outindex 4fc4759f18e..844fb07a807 100644--- a/src/test/regress/expected/create_property_graph.out+++ b/src/test/regress/expected/create_property_graph.out@@ -661,93 +661,122 @@ SELECT * FROM information_schema.pg_property_graph_privileges WHERE grantee LIKE
(2 rows)
-- test object address functions
+CREATE TEMPORARY VIEW deps_tree AS+ WITH RECURSIVE deps (classid, objid, objsubid, refclassid, refobjid, refobjsubid) AS (+ SELECT classid, objid, objsubid,+ refclassid, refobjid, refobjsubid+ FROM pg_depend+ WHERE refclassid = 'pg_class'::regclass AND+ refobjid = 'create_property_graph_tests.gt'::regclass AND+ -- eliminate this view, which is not a real dependency, from the result+ classid <> 'pg_rewrite'::regclass+ UNION ALL+ SELECT d.classid, d.objid, d.objsubid,+ d.refclassid, d.refobjid, d.refobjsubid+ FROM pg_depend d+ JOIN deps dp ON d.refclassid = dp.classid AND d.refobjid = dp.objid AND d.refobjsubid = dp.objsubid+ ) SELECT DISTINCT * FROM deps;
SELECT pg_describe_object(classid, objid, objsubid) as obj,
- pg_describe_object(refclassid, refobjid, refobjsubid) as reference_graph- FROM pg_depend- WHERE refclassid = 'pg_class'::regclass AND- refobjid = 'create_property_graph_tests.g2'::regclass- ORDER BY 1, 2;- obj | reference_graph ----------------------------------+-------------------- edge e1 of property graph g2 | property graph g2- edge e2 of property graph g2 | property graph g2- label e1 of property graph g2 | property graph g2- label e2 of property graph g2 | property graph g2- label t1 of property graph g2 | property graph g2- label t2 of property graph g2 | property graph g2- label t3l1 of property graph g2 | property graph g2- label t3l2 of property graph g2 | property graph g2- property a of property graph g2 | property graph g2- property b of property graph g2 | property graph g2- property i of property graph g2 | property graph g2- property j of property graph g2 | property graph g2- property k of property graph g2 | property graph g2- property t of property graph g2 | property graph g2- property x of property graph g2 | property graph g2- property y of property graph g2 | property graph g2- property z of property graph g2 | property graph g2- vertex t1 of property graph g2 | property graph g2- vertex t2 of property graph g2 | property graph g2- vertex t3 of property graph g2 | property graph g2-(20 rows)+ pg_describe_object(refclassid, refobjid, refobjsubid) as refobj+ FROM deps_tree ORDER BY 1, 2;+ obj | refobj +----------------------------------------------------------+--------------------------------------------+ edge e of property graph gt | property graph gt+ edge e of property graph gt | vertex v1 of property graph gt+ edge e of property graph gt | vertex v2 of property graph gt+ label e of edge e of property graph gt | edge e of property graph gt+ label e of edge e of property graph gt | label e of property graph gt+ label e of property graph gt | property graph gt+ label v1 of property graph gt | property graph gt+ label v1 of vertex v1 of property graph gt | label v1 of property graph gt+ label v1 of vertex v1 of property graph gt | vertex v1 of property graph gt+ label v2 of property graph gt | property graph gt+ label v2 of vertex v2 of property graph gt | label v2 of property graph gt+ label v2 of vertex v2 of property graph gt | vertex v2 of property graph gt+ property a of label v1 of vertex v1 of property graph gt | label v1 of vertex v1 of property graph gt+ property a of label v1 of vertex v1 of property graph gt | property a of property graph gt+ property a of property graph gt | property graph gt+ property b of label v1 of vertex v1 of property graph gt | label v1 of vertex v1 of property graph gt+ property b of label v1 of vertex v1 of property graph gt | property b of property graph gt+ property b of property graph gt | property graph gt+ property c of label e of edge e of property graph gt | label e of edge e of property graph gt+ property c of label e of edge e of property graph gt | property c of property graph gt+ property c of property graph gt | property graph gt+ property k1 of label e of edge e of property graph gt | label e of edge e of property graph gt+ property k1 of label e of edge e of property graph gt | property k1 of property graph gt+ property k1 of property graph gt | property graph gt+ property k2 of label e of edge e of property graph gt | label e of edge e of property graph gt+ property k2 of label e of edge e of property graph gt | property k2 of property graph gt+ property k2 of property graph gt | property graph gt+ property m of label v2 of vertex v2 of property graph gt | label v2 of vertex v2 of property graph gt+ property m of label v2 of vertex v2 of property graph gt | property m of property graph gt+ property m of property graph gt | property graph gt+ property n of label v2 of vertex v2 of property graph gt | label v2 of vertex v2 of property graph gt+ property n of label v2 of vertex v2 of property graph gt | property n of property graph gt+ property n of property graph gt | property graph gt+ vertex v1 of property graph gt | property graph gt+ vertex v2 of property graph gt | property graph gt+(35 rows)
SELECT (pg_identify_object_as_address(classid, objid, objsubid)).*
- FROM pg_depend- WHERE refclassid = 'pg_class'::regclass AND- refobjid = 'create_property_graph_tests.g2'::regclass+ FROM (SELECT DISTINCT classid, objid, objsubid FROM deps_tree)
ORDER BY 1, 2, 3;
- type | object_names | object_args --------------------------+---------------------------------------+-------------- property graph element | {create_property_graph_tests,g2,e1} | {}- property graph element | {create_property_graph_tests,g2,e2} | {}- property graph element | {create_property_graph_tests,g2,t1} | {}- property graph element | {create_property_graph_tests,g2,t2} | {}- property graph element | {create_property_graph_tests,g2,t3} | {}- property graph label | {create_property_graph_tests,g2,e1} | {}- property graph label | {create_property_graph_tests,g2,e2} | {}- property graph label | {create_property_graph_tests,g2,t1} | {}- property graph label | {create_property_graph_tests,g2,t2} | {}- property graph label | {create_property_graph_tests,g2,t3l1} | {}- property graph label | {create_property_graph_tests,g2,t3l2} | {}- property graph property | {create_property_graph_tests,g2,a} | {}- property graph property | {create_property_graph_tests,g2,b} | {}- property graph property | {create_property_graph_tests,g2,i} | {}- property graph property | {create_property_graph_tests,g2,j} | {}- property graph property | {create_property_graph_tests,g2,k} | {}- property graph property | {create_property_graph_tests,g2,t} | {}- property graph property | {create_property_graph_tests,g2,x} | {}- property graph property | {create_property_graph_tests,g2,y} | {}- property graph property | {create_property_graph_tests,g2,z} | {}-(20 rows)+ type | object_names | object_args +---------------------------------------+------------------------------------------+-------------+ property graph element | {create_property_graph_tests,gt,e} | {}+ property graph element | {create_property_graph_tests,gt,v1} | {}+ property graph element | {create_property_graph_tests,gt,v2} | {}+ property graph element label | {create_property_graph_tests,gt,e,e} | {}+ property graph element label | {create_property_graph_tests,gt,v1,v1} | {}+ property graph element label | {create_property_graph_tests,gt,v2,v2} | {}+ property graph element label property | {create_property_graph_tests,gt,e,e,c} | {}+ property graph element label property | {create_property_graph_tests,gt,e,e,k1} | {}+ property graph element label property | {create_property_graph_tests,gt,e,e,k2} | {}+ property graph element label property | {create_property_graph_tests,gt,v1,v1,a} | {}+ property graph element label property | {create_property_graph_tests,gt,v1,v1,b} | {}+ property graph element label property | {create_property_graph_tests,gt,v2,v2,m} | {}+ property graph element label property | {create_property_graph_tests,gt,v2,v2,n} | {}+ property graph label | {create_property_graph_tests,gt,e} | {}+ property graph label | {create_property_graph_tests,gt,v1} | {}+ property graph label | {create_property_graph_tests,gt,v2} | {}+ property graph property | {create_property_graph_tests,gt,a} | {}+ property graph property | {create_property_graph_tests,gt,b} | {}+ property graph property | {create_property_graph_tests,gt,c} | {}+ property graph property | {create_property_graph_tests,gt,k1} | {}+ property graph property | {create_property_graph_tests,gt,k2} | {}+ property graph property | {create_property_graph_tests,gt,m} | {}+ property graph property | {create_property_graph_tests,gt,n} | {}+(23 rows)
SELECT (pg_identify_object(classid, objid, objsubid)).*
- FROM pg_depend- WHERE refclassid = 'pg_class'::regclass AND- refobjid = 'create_property_graph_tests.g2'::regclass+ FROM (SELECT DISTINCT classid, objid, objsubid FROM deps_tree)
ORDER BY 1, 2, 3, 4;
- type | schema | name | identity --------------------------+--------+------+----------------------------------------- property graph element | | | e1 of create_property_graph_tests.g2- property graph element | | | e2 of create_property_graph_tests.g2- property graph element | | | t1 of create_property_graph_tests.g2- property graph element | | | t2 of create_property_graph_tests.g2- property graph element | | | t3 of create_property_graph_tests.g2- property graph label | | | e1 of create_property_graph_tests.g2- property graph label | | | e2 of create_property_graph_tests.g2- property graph label | | | t1 of create_property_graph_tests.g2- property graph label | | | t2 of create_property_graph_tests.g2- property graph label | | | t3l1 of create_property_graph_tests.g2- property graph label | | | t3l2 of create_property_graph_tests.g2- property graph property | | | a of create_property_graph_tests.g2- property graph property | | | b of create_property_graph_tests.g2- property graph property | | | i of create_property_graph_tests.g2- property graph property | | | j of create_property_graph_tests.g2- property graph property | | | k of create_property_graph_tests.g2- property graph property | | | t of create_property_graph_tests.g2- property graph property | | | x of create_property_graph_tests.g2- property graph property | | | y of create_property_graph_tests.g2- property graph property | | | z of create_property_graph_tests.g2-(20 rows)+ 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 element label property | | | a of v1 of v1 of create_property_graph_tests.gt+ property graph element label property | | | b of v1 of v1 of create_property_graph_tests.gt+ property graph element label property | | | c of e of e of create_property_graph_tests.gt+ property graph element label property | | | k1 of e of e of create_property_graph_tests.gt+ property graph element label property | | | k2 of e of e of create_property_graph_tests.gt+ property graph element label property | | | m of v2 of v2 of create_property_graph_tests.gt+ property graph element label property | | | n of 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 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+(23 rows)
\a\t
SELECT pg_get_propgraphdef('g2'::regclass);
diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.outindex 065f586310f..86ae50ce531 100644--- a/src/test/regress/expected/event_trigger.out+++ b/src/test/regress/expected/event_trigger.out@@ -173,6 +173,28 @@ NOTICE: test_event_trigger: ddl_command_end CREATE USER MAPPING
alter default privileges for role regress_evt_user
revoke delete on tables from regress_evt_user;
NOTICE: test_event_trigger: ddl_command_end ALTER DEFAULT PRIVILEGES
+-- DROP PROPERTY GRAPH should work with event trigger in place+CREATE TABLE tv1 (a int PRIMARY KEY, b text);+NOTICE: test_event_trigger: ddl_command_start CREATE TABLE+NOTICE: test_event_trigger: ddl_command_end CREATE TABLE+CREATE TABLE tv2 (i int PRIMARY KEY, j text);+NOTICE: test_event_trigger: ddl_command_start CREATE TABLE+NOTICE: test_event_trigger: ddl_command_end CREATE TABLE+CREATE TABLE te1 (p int PRIMARY KEY, a int REFERENCES tv1(a), b int REFERENCES tv2(i), q text);+NOTICE: test_event_trigger: ddl_command_start CREATE TABLE+NOTICE: test_event_trigger: ddl_command_end CREATE TABLE+CREATE PROPERTY GRAPH gx+ VERTEX TABLES (+ tv1 LABEL l1 PROPERTIES (b AS p1),+ tv2 LABEL l2 PROPERTIES (j AS p1))+ EDGE TABLES (te1 SOURCE tv1 DESTINATION tv2 LABEL e1 PROPERTIES (q as p1));+NOTICE: test_event_trigger: ddl_command_end CREATE PROPERTY GRAPH+ALTER PROPERTY GRAPH gx ALTER EDGE TABLE te1 ALTER LABEL e1 DROP PROPERTIES (p1);+NOTICE: test_event_trigger: ddl_command_end ALTER PROPERTY GRAPH+DROP PROPERTY GRAPH gx;+NOTICE: test_event_trigger: ddl_command_end DROP PROPERTY GRAPH+DROP TABLE tv1, tv2, te1;+NOTICE: test_event_trigger: ddl_command_end DROP TABLE
-- alter owner to non-superuser should fail
alter event trigger regress_event_trigger owner to regress_evt_user;
ERROR: permission denied to change owner of event trigger "regress_event_trigger"
diff --git a/src/test/regress/expected/object_address.out b/src/test/regress/expected/object_address.outindex 97227d67a54..9f2d08398b0 100644--- a/src/test/regress/expected/object_address.out+++ b/src/test/regress/expected/object_address.out@@ -67,7 +67,8 @@ DECLARE
BEGIN
FOR objtype IN VALUES ('toast table'), ('index column'), ('sequence column'),
('toast table column'), ('view column'), ('materialized view column'),
- ('property graph element'), ('property graph label'), ('property graph property')+ ('property graph element'), ('property graph label'), ('property graph property'),+ ('property graph element label'), ('property graph element label property')
LOOP
BEGIN
PERFORM pg_get_object_address(objtype, '{one}', '{}');
@@ -86,6 +87,8 @@ WARNING: error for materialized view column: unsupported object type "materiali
WARNING: error for property graph element: unsupported object type "property graph element"
WARNING: error for property graph label: unsupported object type "property graph label"
WARNING: error for property graph property: unsupported object type "property graph property"
+WARNING: error for property graph element label: unrecognized object type "property graph element label"+WARNING: error for property graph element label property: unrecognized object type "property graph element label property"
-- miscellaneous other errors
select * from pg_get_object_address('operator of access method', '{btree,integer_ops,1}', '{int4,bool}');
ERROR: operator 1 (int4, bool) of operator family integer_ops for access method btree does not exist
@@ -595,6 +598,8 @@ WITH objects (classid, objid, objsubid) AS (VALUES
('pg_propgraph_element'::regclass, 0, 0), -- no property graph element
('pg_propgraph_label'::regclass, 0, 0), -- no property graph label
('pg_propgraph_property'::regclass, 0, 0), -- no property graph property
+ ('pg_propgraph_element_label'::regclass, 0, 0), -- no property graph element label+ ('pg_propgraph_label_property'::regclass, 0, 0), -- no property graph label property
('pg_publication'::regclass, 0, 0), -- no publication
('pg_publication_namespace'::regclass, 0, 0), -- no publication namespace
('pg_publication_rel'::regclass, 0, 0), -- no publication relation
@@ -653,6 +658,8 @@ ORDER BY objects.classid, objects.objid, objects.objsubid;
("(""parameter ACL"",,,)")|("(""parameter ACL"",,)")|NULL
("(""property graph element"",,,)")|("(""property graph element"",,)")|NULL
("(""property graph label"",,,)")|("(""property graph label"",,)")|NULL
+("(""property graph element label"",,,)")|("(""property graph element label"",,)")|NULL
("(""property graph property"",,,)")|("(""property graph property"",,)")|NULL
+("(""property graph element label property"",,,)")|("(""property graph element label property"",,)")|NULL
-- restore normal output mode
\a\t
diff --git a/src/test/regress/sql/create_property_graph.sql b/src/test/regress/sql/create_property_graph.sqlindex 241f93df302..85088ae632c 100644--- a/src/test/regress/sql/create_property_graph.sql+++ b/src/test/regress/sql/create_property_graph.sql@@ -281,21 +281,30 @@ SELECT * FROM information_schema.pg_property_data_types ORDER BY property_graph_
SELECT * FROM information_schema.pg_property_graph_privileges WHERE grantee LIKE 'regress%' ORDER BY property_graph_name, grantor, grantee, privilege_type;
-- test object address functions
+CREATE TEMPORARY VIEW deps_tree AS+ WITH RECURSIVE deps (classid, objid, objsubid, refclassid, refobjid, refobjsubid) AS (+ SELECT classid, objid, objsubid,+ refclassid, refobjid, refobjsubid+ FROM pg_depend+ WHERE refclassid = 'pg_class'::regclass AND+ refobjid = 'create_property_graph_tests.gt'::regclass AND+ -- eliminate this view, which is not a real dependency, from the result+ classid <> 'pg_rewrite'::regclass+ UNION ALL+ SELECT d.classid, d.objid, d.objsubid,+ d.refclassid, d.refobjid, d.refobjsubid+ FROM pg_depend d+ JOIN deps dp ON d.refclassid = dp.classid AND d.refobjid = dp.objid AND d.refobjsubid = dp.objsubid+ ) SELECT DISTINCT * FROM deps;+
SELECT pg_describe_object(classid, objid, objsubid) as obj,
- pg_describe_object(refclassid, refobjid, refobjsubid) as reference_graph- FROM pg_depend- WHERE refclassid = 'pg_class'::regclass AND- refobjid = 'create_property_graph_tests.g2'::regclass- ORDER BY 1, 2;+ pg_describe_object(refclassid, refobjid, refobjsubid) as refobj+ FROM deps_tree ORDER BY 1, 2;
SELECT (pg_identify_object_as_address(classid, objid, objsubid)).*
- FROM pg_depend- WHERE refclassid = 'pg_class'::regclass AND- refobjid = 'create_property_graph_tests.g2'::regclass+ FROM (SELECT DISTINCT classid, objid, objsubid FROM deps_tree)
ORDER BY 1, 2, 3;
SELECT (pg_identify_object(classid, objid, objsubid)).*
- FROM pg_depend- WHERE refclassid = 'pg_class'::regclass AND- refobjid = 'create_property_graph_tests.g2'::regclass+ FROM (SELECT DISTINCT classid, objid, objsubid FROM deps_tree)
ORDER BY 1, 2, 3, 4;
\a\t
diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sqlindex 32e9bb58c5e..d0e6ba295fe 100644--- a/src/test/regress/sql/event_trigger.sql+++ b/src/test/regress/sql/event_trigger.sql@@ -143,6 +143,21 @@ create user mapping for regress_evt_user server useless_server;
alter default privileges for role regress_evt_user
revoke delete on tables from regress_evt_user;
+-- DROP PROPERTY GRAPH should work with event trigger in place+CREATE TABLE tv1 (a int PRIMARY KEY, b text);+CREATE TABLE tv2 (i int PRIMARY KEY, j text);+CREATE TABLE te1 (p int PRIMARY KEY, a int REFERENCES tv1(a), b int REFERENCES tv2(i), q text);++CREATE PROPERTY GRAPH gx+ VERTEX TABLES (+ tv1 LABEL l1 PROPERTIES (b AS p1),+ tv2 LABEL l2 PROPERTIES (j AS p1))+ EDGE TABLES (te1 SOURCE tv1 DESTINATION tv2 LABEL e1 PROPERTIES (q as p1));++ALTER PROPERTY GRAPH gx ALTER EDGE TABLE te1 ALTER LABEL e1 DROP PROPERTIES (p1);+DROP PROPERTY GRAPH gx;+DROP TABLE tv1, tv2, te1;+
-- alter owner to non-superuser should fail
alter event trigger regress_event_trigger owner to regress_evt_user;
diff --git a/src/test/regress/sql/object_address.sql b/src/test/regress/sql/object_address.sqlindex 1bbe9457c1c..e987bd3542f 100644--- a/src/test/regress/sql/object_address.sql+++ b/src/test/regress/sql/object_address.sql@@ -67,7 +67,8 @@ DECLARE
BEGIN
FOR objtype IN VALUES ('toast table'), ('index column'), ('sequence column'),
('toast table column'), ('view column'), ('materialized view column'),
- ('property graph element'), ('property graph label'), ('property graph property')+ ('property graph element'), ('property graph label'), ('property graph property'),+ ('property graph element label'), ('property graph element label property')
LOOP
BEGIN
PERFORM pg_get_object_address(objtype, '{one}', '{}');
@@ -284,6 +285,8 @@ WITH objects (classid, objid, objsubid) AS (VALUES
('pg_propgraph_element'::regclass, 0, 0), -- no property graph element
('pg_propgraph_label'::regclass, 0, 0), -- no property graph label
('pg_propgraph_property'::regclass, 0, 0), -- no property graph property
+ ('pg_propgraph_element_label'::regclass, 0, 0), -- no property graph element label+ ('pg_propgraph_label_property'::regclass, 0, 0), -- no property graph label property
('pg_publication'::regclass, 0, 0), -- no publication
('pg_publication_namespace'::regclass, 0, 0), -- no publication namespace
('pg_publication_rel'::regclass, 0, 0), -- no publication relation
--
2.47.3
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: bertranddrouvot.pg@gmail.com, ashutosh.bapat.oss@gmail.com, michael@paquier.xyz, peter@eisentraut.org
Subject: Re: Fix DROP PROPERTY GRAPH "unsupported object class" error
In-Reply-To: <afmHd5vSCJtMFueS@bdtpg>
* 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