From b675cb8a0fa4dcc9dd2800c95fa70d4fc3c673f3 Mon Sep 17 00:00:00 2001 From: "Chao Li (Evan)" Date: Wed, 12 Aug 2026 07:50:12 +0800 Subject: [PATCH v1] Remove comments and security labels when dropping subscriptions Commit 87dee41f3ed added comment and security label support for subscriptions, but overlooked cleaning them up in DROP SUBSCRIPTION. Since subscriptions do not use the generic dependency deletion machinery, their comments and security labels must be removed explicitly. Otherwise, orphaned entries remain in pg_description and pg_shseclabel. Add regression coverage for both cases. Author: Chao Li --- src/backend/commands/subscriptioncmds.c | 6 +++++- .../dummy_seclabel/expected/dummy_seclabel.out | 17 +++++++++++++++++ .../dummy_seclabel/sql/dummy_seclabel.sql | 7 +++++++ src/test/regress/expected/subscription.out | 8 ++++++++ src/test/regress/sql/subscription.sql | 4 ++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 8e8db08bd93..49b485d0f56 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -33,8 +33,10 @@ #include "catalog/pg_subscription_rel.h" #include "catalog/pg_type.h" #include "catalog/pg_user_mapping.h" +#include "commands/comment.h" #include "commands/defrem.h" #include "commands/event_trigger.h" +#include "commands/seclabel.h" #include "commands/subscriptioncmds.h" #include "commands/tablecmds.h" #include "executor/executor.h" @@ -2769,9 +2771,11 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) /* Drop subscription's conflict log table */ drop_sub_conflict_log_table(subid, subname, subconflictlogrelid); - /* Clean up dependencies */ + /* Clean up dependencies, comments, and security labels. */ deleteDependencyRecordsFor(SubscriptionRelationId, subid, false); deleteSharedDependencyRecordsFor(SubscriptionRelationId, subid, 0); + DeleteComments(subid, SubscriptionRelationId, 0); + DeleteSecurityLabel(&myself); /* Remove any associated relation synchronization states. */ RemoveSubscriptionRel(subid, InvalidOid); diff --git a/src/test/modules/dummy_seclabel/expected/dummy_seclabel.out b/src/test/modules/dummy_seclabel/expected/dummy_seclabel.out index de671e5a170..88cb477eb4f 100644 --- a/src/test/modules/dummy_seclabel/expected/dummy_seclabel.out +++ b/src/test/modules/dummy_seclabel/expected/dummy_seclabel.out @@ -116,8 +116,25 @@ NOTICE: event ddl_command_end: SECURITY LABEL DROP EVENT TRIGGER always_start, always_end, always_drop, always_rewrite; DROP VIEW dummy_seclabel_view1; DROP TABLE dummy_seclabel_tbl1, dummy_seclabel_tbl2; +-- Check that dropping objects removes their security labels. DROP SUBSCRIPTION dummy_sub; +SELECT count(*) = 0 AS no_subscription_labels +FROM pg_shseclabel +WHERE classoid = 'pg_subscription'::regclass; + no_subscription_labels +------------------------ + t +(1 row) + DROP PUBLICATION dummy_pub; +SELECT count(*) = 0 AS no_publication_labels +FROM pg_seclabel +WHERE classoid = 'pg_publication'::regclass; + no_publication_labels +----------------------- + t +(1 row) + DROP ROLE regress_dummy_seclabel_user1; DROP ROLE regress_dummy_seclabel_user2; DROP ROLE regress_dummy_seclabel_user3; diff --git a/src/test/modules/dummy_seclabel/sql/dummy_seclabel.sql b/src/test/modules/dummy_seclabel/sql/dummy_seclabel.sql index 649409757e8..5c5e56283d7 100644 --- a/src/test/modules/dummy_seclabel/sql/dummy_seclabel.sql +++ b/src/test/modules/dummy_seclabel/sql/dummy_seclabel.sql @@ -112,8 +112,15 @@ DROP EVENT TRIGGER always_start, always_end, always_drop, always_rewrite; DROP VIEW dummy_seclabel_view1; DROP TABLE dummy_seclabel_tbl1, dummy_seclabel_tbl2; +-- Check that dropping objects removes their security labels. DROP SUBSCRIPTION dummy_sub; +SELECT count(*) = 0 AS no_subscription_labels +FROM pg_shseclabel +WHERE classoid = 'pg_subscription'::regclass; DROP PUBLICATION dummy_pub; +SELECT count(*) = 0 AS no_publication_labels +FROM pg_seclabel +WHERE classoid = 'pg_publication'::regclass; DROP ROLE regress_dummy_seclabel_user1; DROP ROLE regress_dummy_seclabel_user2; diff --git a/src/test/regress/expected/subscription.out b/src/test/regress/expected/subscription.out index fbb2751c678..a9f1c546fab 100644 --- a/src/test/regress/expected/subscription.out +++ b/src/test/regress/expected/subscription.out @@ -357,6 +357,14 @@ ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); BEGIN; DROP SUBSCRIPTION regress_testsub; COMMIT; +SELECT count(*) = 0 AS no_subscription_comments +FROM pg_description +WHERE classoid = 'pg_subscription'::regclass; + no_subscription_comments +-------------------------- + t +(1 row) + DROP SUBSCRIPTION IF EXISTS regress_testsub; NOTICE: subscription "regress_testsub" does not exist, skipping DROP SUBSCRIPTION regress_testsub; -- fail diff --git a/src/test/regress/sql/subscription.sql b/src/test/regress/sql/subscription.sql index cfeebaf9302..e864b58a526 100644 --- a/src/test/regress/sql/subscription.sql +++ b/src/test/regress/sql/subscription.sql @@ -279,6 +279,10 @@ BEGIN; DROP SUBSCRIPTION regress_testsub; COMMIT; +SELECT count(*) = 0 AS no_subscription_comments +FROM pg_description +WHERE classoid = 'pg_subscription'::regclass; + DROP SUBSCRIPTION IF EXISTS regress_testsub; DROP SUBSCRIPTION regress_testsub; -- fail -- 2.50.1 (Apple Git-155)