Ensure that "pg_restore -l" reports dependent TOC entries correctly.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 7 May 2024 22:22:52 +0000 (18:22 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 7 May 2024 22:23:07 +0000 (18:23 -0400)
If -l was specified together with selective-restore options such as -n
or -N, dependent TOC entries such as comments would be omitted from
the listing, even when an actual restore would have selected them.
This happened because PrintTOCSummary neglected to update the te->reqs
marking of the entry they depended on.

Per report from Justin Pryzby.  This has been wrong since 0d4e6ed30
taught _tocEntryRequired to sometimes look at the "reqs" marking of
other TOC entries, so back-patch to all supported branches.

Discussion: https://postgr.es/m/ZjoeirG7yxODdC4P@pryzbyj2023

src/bin/pg_dump/pg_backup_archiver.c

index 5d23121d43233798696b874d26217950f4d4fda5..ea979b50b0078102cac91ed75bc2e7ae9cb8daeb 100644 (file)
@@ -1222,10 +1222,13 @@ PrintTOCSummary(Archive *AHX)
    curSection = SECTION_PRE_DATA;
    for (te = AH->toc->next; te != AH->toc; te = te->next)
    {
+       /* This bit must match ProcessArchiveRestoreOptions' marking logic */
        if (te->section != SECTION_NONE)
            curSection = te->section;
+       te->reqs = _tocEntryRequired(te, curSection, AH);
+       /* Now, should we print it? */
        if (ropt->verbose ||
-           (_tocEntryRequired(te, curSection, AH) & (REQ_SCHEMA | REQ_DATA)) != 0)
+           (te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0)
        {
            char       *sanitized_name;
            char       *sanitized_schema;