]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
pg_restore: Fix comment handling with --no-publications / --no-subscriptions.
authorFujii Masao <fujii@postgresql.org>
Tue, 16 Sep 2025 01:38:09 +0000 (10:38 +0900)
committerFujii Masao <fujii@postgresql.org>
Tue, 16 Sep 2025 01:38:09 +0000 (10:38 +0900)
Previously, pg_restore did not skip comments on publications or subscriptions
even when --no-publications or --no-subscriptions was specified. As a result,
it could issue COMMENT commands for objects that were never created,
causing those commands to fail.

This commit fixes the issue by ensuring that comments on publications and
subscriptions are also skipped when the corresponding options are used.

Backpatch to all supported versions.

Author: Jian He <jian.universality@gmail.com>
Co-authored-by: Fujii Masao <masao.fujii@gmail.com>
Discussion: https://postgr.es/m/CACJufxHCt00pR9h51AVu6+yPD5J7JQn=7dQXxqacj0XyDhc-fA@mail.gmail.com
Backpatch-through: 13

src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/t/002_pg_dump.pl

index b81788f72cb2343d77ba87ceeea25714aadccf38..61beeea77cb5704396a7c852f5fd5bb7aa2d15a4 100644 (file)
@@ -2875,6 +2875,20 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH)
        if (ropt->no_comments && strcmp(te->desc, "COMMENT") == 0)
                return 0;
 
+       /*
+        * If it's a comment on a publication or a subscription, maybe ignore it.
+        */
+       if (strcmp(te->desc, "COMMENT") == 0)
+       {
+               if (ropt->no_publications &&
+                       strncmp(te->tag, "PUBLICATION", strlen("PUBLICATION")) == 0)
+                       return 0;
+
+               if (ropt->no_subscriptions &&
+                       strncmp(te->tag, "SUBSCRIPTION", strlen("SUBSCRIPTION")) == 0)
+                       return 0;
+       }
+
        /*
         * If it's a publication or a table part of a publication, maybe ignore
         * it.
index 70d2922db3d1517d1355d975e1d3834f9a39c130..bef145c33821d724ed46d07b63e63ee987b72727 100644 (file)
@@ -336,6 +336,29 @@ my %pgdump_runs = (
                        'postgres',
                ],
        },
+       no_subscriptions => {
+               dump_cmd => [
+                       'pg_dump', '--no-sync',
+                       '--file' => "$tempdir/no_subscriptions.sql",
+                       '--no-subscriptions',
+                       'postgres',
+               ],
+       },
+       no_subscriptions_restore => {
+               dump_cmd => [
+                       'pg_dump', '--no-sync',
+                       '--format' => 'custom',
+                       '--file' => "$tempdir/no_subscriptions_restore.dump",
+                       'postgres',
+               ],
+               restore_cmd => [
+                       'pg_restore',
+                       '--format' => 'custom',
+                       '--file' => "$tempdir/no_subscriptions_restore.sql",
+                       '--no-subscriptions',
+                       "$tempdir/no_subscriptions_restore.dump",
+               ],
+       },
        no_table_access_method => {
                dump_cmd => [
                        'pg_dump', '--no-sync',
@@ -496,6 +519,8 @@ my %full_runs = (
        no_blobs                 => 1,
        no_owner                 => 1,
        no_privs                 => 1,
+       no_subscriptions => 1,
+       no_subscriptions_restore => 1,
        no_table_access_method   => 1,
        pg_dumpall_dbprivs       => 1,
        pg_dumpall_exclude       => 1,
@@ -1245,6 +1270,10 @@ my %tests = (
                regexp =>
                  qr/^COMMENT ON SUBSCRIPTION sub1 IS 'comment on subscription';/m,
                like => { %full_runs, section_post_data => 1, },
+               unlike => {
+                       no_subscriptions => 1,
+                       no_subscriptions_restore => 1,
+               },
        },
 
        'COMMENT ON TEXT SEARCH CONFIGURATION dump_test.alt_ts_conf1' => {
@@ -2557,6 +2586,10 @@ my %tests = (
                        \QCREATE SUBSCRIPTION sub1 CONNECTION 'dbname=doesnotexist' PUBLICATION pub1 WITH (connect = false, slot_name = 'sub1');\E
                        /xm,
                like => { %full_runs, section_post_data => 1, },
+               unlike => {
+                       no_subscriptions => 1,
+                       no_subscriptions_restore => 1,
+               },
        },
 
        'ALTER PUBLICATION pub1 ADD TABLE test_table' => {
@@ -3251,6 +3284,8 @@ my %tests = (
                        no_blobs                => 1,
                        no_privs                => 1,
                        no_owner                => 1,
+                       no_subscriptions => 1,
+                       no_subscriptions_restore => 1,
                        no_table_access_method  => 1,
                        only_dump_test_schema   => 1,
                        pg_dumpall_dbprivs      => 1,
@@ -3324,6 +3359,8 @@ my %tests = (
                        no_blobs                 => 1,
                        no_privs                 => 1,
                        no_owner                 => 1,
+                       no_subscriptions => 1,
+                       no_subscriptions_restore => 1,
                        no_table_access_method   => 1,
                        pg_dumpall_dbprivs       => 1,
                        pg_dumpall_exclude       => 1,