pg_restore -t of a view does an empty data-only restore - Mailing list pgsql-bugs

From Craig Ringer
Subject pg_restore -t of a view does an empty data-only restore
Date
Msg-id CAMsr+YGJ50TvTVK4Dbp66gAjeOC0KaP6KXFEHAOM+neQmHvoQA@mail.gmail.com
Whole thread Raw
List pgsql-bugs
TL;DR: pg_restore -t should match views too, I'll send a patch.


A user reported an issue where they can't selectively restore the schema of
a view. The view is ignored by -t, so they get an empty restore.

When they

  pg_restore -t theview -v - d dbname thedump

they get:

pg_restore: connecting to database for restore
pg_restore: implied data-only restore

... and the view is not restored. Omitting the target database shows that
pg_restore is just emitting its prelude then an empty body.

Looking at the pg_restore source, it's emitting that message
from src/bin/pg_dump/pg_backup_archiver.c:404 . It looks like it's scanned
the ToC for wanted entries, determined that none have been found, and
therefore assumed a data-only restore.



It looks like this is by design. -t is stored in opts->tableNames , which
is checked in _tocEntryRequired:

if (strcmp(te->desc, "TABLE") == 0 ||
    strcmp(te->desc, "TABLE DATA") == 0)
{
    if (!ropt->selTable)
        return 0;
    if (ropt->tableNames.head != NULL &&
(!(simple_string_list_member(&ropt->tableNames, te->tag))))
        return 0;
}


IMO this should also match views, sequences, materialized views, foreign
tables, and anything else in pg_class. Elsewhere we treat them all as
relations, and they share the same namespace so there's no need to
differentiate between them based on object type.



--
 Craig Ringer                   http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services

pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: Problem with date formatting and FM
Next
From: "Dreamsxin"
Date:
Subject: =?gb18030?B?u9i4tKO6IFtCVUdTXSBCVUcgIzEyOTA5OiBwZ19k?= =?gb18030?B?dW1wIGVycm9y?=