pg_restore: Fix comment handling with --no-policies.
authorFujii Masao <fujii@postgresql.org>
Tue, 16 Sep 2025 02:54:23 +0000 (11:54 +0900)
committerFujii Masao <fujii@postgresql.org>
Tue, 16 Sep 2025 02:54:23 +0000 (11:54 +0900)
Previously, pg_restore did not skip comments on policies even when
--no-policies was specified. As a result, it could issue COMMENT commands
for policies that were never created, causing those commands to fail.

This commit fixes the issue by ensuring that comments on policies
are also skipped when --no-policies is used.

Backpatch to v18, where --no-policies was added in pg_restore.

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: 18

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

index d64ce19b6731714a729b94e77f645ac5c27a6d05..2f92fce44f68120aff0e1b16552e44d0ff4119b6 100644 (file)
@@ -3049,10 +3049,15 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH)
        return 0;
 
    /*
-    * If it's a comment on a publication or a subscription, maybe ignore it.
+    * If it's a comment on a policy, a publication, or a subscription, maybe
+    * ignore it.
     */
    if (strcmp(te->desc, "COMMENT") == 0)
    {
+       if (ropt->no_policies &&
+           strncmp(te->tag, "POLICY", strlen("POLICY")) == 0)
+           return 0;
+
        if (ropt->no_publications &&
            strncmp(te->tag, "PUBLICATION", strlen("PUBLICATION")) == 0)
            return 0;
index 1e8c6bbf22b63138480ce717e2b307f7d2412493..fc5b9b52f8041c0e855f8f5434d883ceaf02730b 100644 (file)
@@ -632,6 +632,23 @@ my %pgdump_runs = (
            'postgres',
        ],
    },
+   no_policies_restore => {
+       dump_cmd => [
+           'pg_dump', '--no-sync',
+           '--format' => 'custom',
+           '--file' => "$tempdir/no_policies_restore.dump",
+           '--statistics',
+           'postgres',
+       ],
+       restore_cmd => [
+           'pg_restore',
+           '--format' => 'custom',
+           '--file' => "$tempdir/no_policies_restore.sql",
+           '--no-policies',
+           '--statistics',
+           "$tempdir/no_policies_restore.dump",
+       ],
+   },
    no_privs => {
        dump_cmd => [
            'pg_dump', '--no-sync',
@@ -897,6 +914,7 @@ my %full_runs = (
    no_large_objects => 1,
    no_owner => 1,
    no_policies => 1,
+   no_policies_restore => 1,
    no_privs => 1,
    no_statistics => 1,
    no_subscriptions => 1,
@@ -1540,6 +1558,7 @@ my %tests = (
            exclude_dump_test_schema => 1,
            exclude_test_table => 1,
            no_policies => 1,
+           no_policies_restore => 1,
            only_dump_measurement => 1,
        },
    },
@@ -1858,6 +1877,27 @@ my %tests = (
        },
    },
 
+   'COMMENT ON POLICY p1' => {
+       create_order => 55,
+       create_sql => 'COMMENT ON POLICY p1 ON dump_test.test_table
+                      IS \'comment on policy\';',
+       regexp =>
+         qr/^COMMENT ON POLICY p1 ON dump_test.test_table IS 'comment on policy';/m,
+       like => {
+           %full_runs,
+           %dump_test_schema_runs,
+           only_dump_test_table => 1,
+           section_post_data => 1,
+       },
+       unlike => {
+           exclude_dump_test_schema => 1,
+           exclude_test_table => 1,
+           no_policies => 1,
+           no_policies_restore => 1,
+           only_dump_measurement => 1,
+       },
+   },
+
    'COMMENT ON PUBLICATION pub1' => {
        create_order => 55,
        create_sql => 'COMMENT ON PUBLICATION pub1
@@ -3224,6 +3264,7 @@ my %tests = (
            exclude_dump_test_schema => 1,
            exclude_test_table => 1,
            no_policies => 1,
+           no_policies_restore => 1,
            only_dump_measurement => 1,
        },
    },
@@ -3246,6 +3287,7 @@ my %tests = (
            exclude_dump_test_schema => 1,
            exclude_test_table => 1,
            no_policies => 1,
+           no_policies_restore => 1,
            only_dump_measurement => 1,
        },
    },
@@ -3268,6 +3310,7 @@ my %tests = (
            exclude_dump_test_schema => 1,
            exclude_test_table => 1,
            no_policies => 1,
+           no_policies_restore => 1,
            only_dump_measurement => 1,
        },
    },
@@ -3290,6 +3333,7 @@ my %tests = (
            exclude_dump_test_schema => 1,
            exclude_test_table => 1,
            no_policies => 1,
+           no_policies_restore => 1,
            only_dump_measurement => 1,
        },
    },
@@ -3312,6 +3356,7 @@ my %tests = (
            exclude_dump_test_schema => 1,
            exclude_test_table => 1,
            no_policies => 1,
+           no_policies_restore => 1,
            only_dump_measurement => 1,
        },
    },
@@ -3334,6 +3379,7 @@ my %tests = (
            exclude_dump_test_schema => 1,
            exclude_test_table => 1,
            no_policies => 1,
+           no_policies_restore => 1,
            only_dump_measurement => 1,
        },
    },