From: Andrey Rachitskiy <pl0h0yp1@gmail.com>
Subject: [PATCH] Fix pg_event_trigger_ddl_commands for GRANT ON PROPERTY GRAPH

stringify_grant_objtype() treated OBJECT_PROPGRAPH as unused, so
pg_event_trigger_ddl_commands() failed with "unsupported object type"
when a ddl_command_end trigger inspected GRANT/REVOKE on a property
graph.  Return "PROPERTY GRAPH" like the GRANT command syntax.

BUG: 19637
Author: Andrey Rachitskiy <pl0h0yp1@gmail.com>
Reported-by: Alexander Lakhin <exclusion@gmail.com>
Discussion: https://postgr.es/m/19637-4446f72945492ed8@postgresql.org

---
diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c
index adc6eabc0f4..4edc83cdf7d 100644
--- a/src/backend/commands/event_trigger.c
+++ b/src/backend/commands/event_trigger.c
@@ -2288,6 +2288,8 @@ stringify_grant_objtype(ObjectType objtype)
 			return "PARAMETER";
 		case OBJECT_PROCEDURE:
 			return "PROCEDURE";
+		case OBJECT_PROPGRAPH:
+			return "PROPERTY GRAPH";
 		case OBJECT_ROUTINE:
 			return "ROUTINE";
 		case OBJECT_TABLESPACE:
@@ -2315,7 +2317,6 @@ stringify_grant_objtype(ObjectType objtype)
 		case OBJECT_OPERATOR:
 		case OBJECT_OPFAMILY:
 		case OBJECT_POLICY:
-		case OBJECT_PROPGRAPH:
 		case OBJECT_PUBLICATION:
 		case OBJECT_PUBLICATION_NAMESPACE:
 		case OBJECT_PUBLICATION_REL:
diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out
index 86ae50ce531..9b55656a83e 100644
--- a/src/test/regress/expected/event_trigger.out
+++ b/src/test/regress/expected/event_trigger.out
@@ -195,6 +195,35 @@ 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
+-- GRANT/REVOKE ON PROPERTY GRAPH with pg_event_trigger_ddl_commands()
+CREATE FUNCTION event_trigger_report_grant() RETURNS event_trigger
+LANGUAGE plpgsql AS $$
+DECLARE r RECORD;
+BEGIN
+    FOR r IN SELECT * FROM pg_event_trigger_ddl_commands()
+    LOOP
+        RAISE NOTICE 'END: command_tag=% type=%',
+            r.command_tag, r.object_type;
+    END LOOP;
+END; $$;
+NOTICE:  test_event_trigger: ddl_command_start CREATE FUNCTION
+NOTICE:  test_event_trigger: ddl_command_end CREATE FUNCTION
+CREATE EVENT TRIGGER regress_event_trigger_report_grant ON ddl_command_end
+    WHEN TAG IN ('GRANT', 'REVOKE')
+    EXECUTE FUNCTION event_trigger_report_grant();
+CREATE PROPERTY GRAPH pg_evt_grant;
+NOTICE:  test_event_trigger: ddl_command_end CREATE PROPERTY GRAPH
+GRANT SELECT ON PROPERTY GRAPH pg_evt_grant TO public;
+NOTICE:  test_event_trigger: ddl_command_end GRANT
+NOTICE:  END: command_tag=GRANT type=PROPERTY GRAPH
+REVOKE SELECT ON PROPERTY GRAPH pg_evt_grant FROM public;
+NOTICE:  test_event_trigger: ddl_command_end REVOKE
+NOTICE:  END: command_tag=REVOKE type=PROPERTY GRAPH
+DROP PROPERTY GRAPH pg_evt_grant;
+NOTICE:  test_event_trigger: ddl_command_end DROP PROPERTY GRAPH
+DROP EVENT TRIGGER regress_event_trigger_report_grant;
+DROP FUNCTION event_trigger_report_grant();
+NOTICE:  test_event_trigger: ddl_command_end DROP FUNCTION
 -- 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/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql
index d0e6ba295fe..8959c9b6006 100644
--- a/src/test/regress/sql/event_trigger.sql
+++ b/src/test/regress/sql/event_trigger.sql
@@ -158,6 +158,27 @@ ALTER PROPERTY GRAPH gx ALTER EDGE TABLE te1 ALTER LABEL e1 DROP PROPERTIES (p1)
 DROP PROPERTY GRAPH gx;
 DROP TABLE tv1, tv2, te1;
 
+-- GRANT/REVOKE ON PROPERTY GRAPH with pg_event_trigger_ddl_commands()
+CREATE FUNCTION event_trigger_report_grant() RETURNS event_trigger
+LANGUAGE plpgsql AS $$
+DECLARE r RECORD;
+BEGIN
+    FOR r IN SELECT * FROM pg_event_trigger_ddl_commands()
+    LOOP
+        RAISE NOTICE 'END: command_tag=% type=%',
+            r.command_tag, r.object_type;
+    END LOOP;
+END; $$;
+CREATE EVENT TRIGGER regress_event_trigger_report_grant ON ddl_command_end
+    WHEN TAG IN ('GRANT', 'REVOKE')
+    EXECUTE FUNCTION event_trigger_report_grant();
+CREATE PROPERTY GRAPH pg_evt_grant;
+GRANT SELECT ON PROPERTY GRAPH pg_evt_grant TO public;
+REVOKE SELECT ON PROPERTY GRAPH pg_evt_grant FROM public;
+DROP PROPERTY GRAPH pg_evt_grant;
+DROP EVENT TRIGGER regress_event_trigger_report_grant;
+DROP FUNCTION event_trigger_report_grant();
+
 -- alter owner to non-superuser should fail
 alter event trigger regress_event_trigger owner to regress_evt_user;
 
