On 2025/06/27 13:08, jian he wrote:
hi.

first looking at function dumpPolicy (pg_dump.c):

     appendPQExpBuffer(polprefix, "POLICY %s ON",
                       fmtId(polinfo->polname));
     tag = psprintf("%s %s", tbinfo->dobj.name, polinfo->dobj.name);
   ....
     if (polinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
         dumpComment(fout, polprefix->data, qtabname,
                     tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,


then looking at function dumpCommentExtended:

         appendPQExpBuffer(query, "COMMENT ON %s ", type);
         if (namespace && *namespace)
             appendPQExpBuffer(query, "%s.", fmtId(namespace));
         appendPQExpBuffer(query, "%s IS ", name);
         appendStringLiteralAH(query, comments->descr, fout);
         appendPQExpBufferStr(query, ";\n");

         appendPQExpBuffer(tag, "%s %s", type, name);
         /*
          * We mark comments as SECTION_NONE because they really belong in the
          * same section as their parent, whether that is pre-data or
          * post-data.
          */
         ArchiveEntry(fout, nilCatalogId, createDumpId(),
                      ARCHIVE_OPTS(.tag = tag->data,
                                   .namespace = namespace,
                                   .owner = owner,
                                   .description = "COMMENT",
                                   .section = SECTION_NONE,
                                   .createStmt = query->data,
                                   .deps = &dumpId,
                                   .nDeps = 1));

also looking at function ArchiveEntry in pg_backup_archiver.c

     newToc->tag = pg_strdup(opts->tag);


if pg_restore --no-policies is specified then we generally don't want
to restore policies' comments too.

Agreed. Otherwise, pg_restore --no-policies might skip creating
the policy object but still try to run a COMMENT command on it,
which would fail since the policy object doesn't exist.


To do that, we need
1. we checked that COMMENTS on policies, the TocEntry->tag begins with
"POLICY". which is true, see above code walk through.
2. We also need to make sure that no other dumpComment call results in a
COMMENT command whose TocEntry->tag also starts with "POLICY".
which is also true, per https://www.postgresql.org/docs/current/sql-comment.html
after "COMMENT ON", the next word is fixed, and "POLICY" only occurs once.


If this is what we want, we can do the same for
"--no-publications", "--no-subscriptions" too.

Agreed.

Regards,

--
Fujii Masao
NTT DATA Japan Corporation



Reply via email to