Re: schema-only -n option in pg_restore fails

From: Josh Berkus <josh(at)agliodbs(dot)com>
To:
Cc: pgsql-bugs(at)postgresql(dot)org, PostgreSQL-development <pgsql-hackers(at)postgreSQL(dot)org>
Subject: Re: schema-only -n option in pg_restore fails
Date: 2014-10-09 21:19:18
Message-ID: 5436FBD6.9090400@agliodbs.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs pgsql-hackers

All,

Crossing this over to -hackers because it's stopped being a bug and is
now a TODO item. See below.

For those not on pgsql-bugs, I've quoted the full bug report below my
proposal.

On 10/09/2014 12:36 PM, Josh Berkus wrote:
> Summary: pg_restore -n attempts to restore objects to pg_catalog schema
> Versions Tested: 9.3.5, 9.3.0, 9.2.4

Explored this some with Andrew offlist. Turns out this is going to be a
PITA to fix, so it should go on the big pile of TODOs for when we
overhaul search_path.

Here's what's happening under the hood, pg_restore generates this SQL text:

SET search_path = schem_a, pg_catalog;
CREATE TABLE tab_a (
test text
);

Since schem_a doesn't exist, it's skipped over and pg_restore attempts
to create the objects in pg_catalog. So this is Yet Another Issue
caused by the ten meter tall tar baby which is search_path.

So, my proposal for a resolution:

1) In current versions, patch the docs to explicitly say that -n does
not create the schema, and that if the user doesn't create the schema
pg_restore will fail.

2) Patch 9.5's pg_restore to do "CREATE SCHEMA IF NOT EXISTS" when -n is
used. This will be 100% backwards-compatible with current behavior.

Discuss?

Original bug report follows.

On 10/09/2014 12:36 PM, Josh Berkus wrote:> Summary: pg_restore -n
attempts to restore objects to pg_catalog schema
> Versions Tested: 9.3.5, 9.3.0, 9.2.4
> Severity: Failure
> Description:
>
> The -n option (or --schema) for pg_restore is supposed to allow you to
> restore a single schema from a custom-format pg_dump file. Instead, it
> attempts to restore that schema's objects to the pg_catalog schema
> instead. See the test case below.
>
> What's happening here is that the user is apparently expected to create
> the schema manually before doing a -n pg_restore. However, that's not
> what the documentation says, and additionally doesn't make any sense if
> we're not giving the user the ability to restore to an alternate schema
> name (and so far we aren't). If the schema does not already exist,
> pg_restore attempts to restore to the pg_catalog schema instead, which
> fails.
>
> In other words, pg_restore -n is "just broken". Clearly few people use
> it or we'd have a bug on it before now.
>
> What should happen is that pg_restore -n should create the schema if it
> doesn't already exist. If for some reason you think that pg_restore
> shouldn't create the schema (which would be user-hostile, but at least
> consistent), then this should fail cleanly with a "schema does not
> exist" error message instead of trying to restore to pg_catalog.
>
> Test Case:
>
> 1. createdb schtest;
> 2. createdb schrestore;
> 3. psql schtest
>
> 4. create schema schem_a;
> create table schem_a.tab_a ( test text );
> create schema schem_b;
> create table schem_b.tab_b ( test text );
> create schema schem_c;
> create table schem_c.tab_c ( test text );
>
> 5. pg_dump -Fc -f /tmp/schmtest.dump schtest
> 6. pg_restore -Fc -n schem_a -d schrestore /tmp/schmtest.dump
> 7.
>
> pg_restore: [archiver (db)] Error while PROCESSING TOC:
> pg_restore: [archiver (db)] Error from TOC entry 171; 1259 1191591 TABLE
> tab_a josh
> pg_restore: [archiver (db)] could not execute query: ERROR: permission
> denied to create "pg_catalog.tab_a"
> DETAIL: System catalog modifications are currently disallowed.
> Command was: CREATE TABLE tab_a (
> test text
> );
>
> pg_restore: [archiver (db)] could not execute query: ERROR: schema
> "schem_a" does not exist
> Command was: ALTER TABLE schem_a.tab_a OWNER TO josh;
>
> pg_restore: [archiver (db)] Error from TOC entry 2194; 0 1191591 TABLE
> DATA tab_a josh
> pg_restore: [archiver (db)] could not execute query: ERROR: relation
> "tab_a" does not exist
> Command was: COPY tab_a (test) FROM stdin;
>

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Inoue, Hiroshi 2014-10-10 04:08:23 Re: [BUGS] BUG #11608: ODBC driver crashes after wrong password entered
Previous Message support 2014-10-09 20:00:31 BUG #11617: issue with dump/restore involving view with hstore data type embedded in where condition

Browse pgsql-hackers by date

  From Date Subject
Next Message Andres Freund 2014-10-09 21:19:41 Re: Autovacuum fails to keep visibility map up-to-date in mostly-insert-only-tables
Previous Message Alvaro Herrera 2014-10-09 21:18:29 Re: Autovacuum fails to keep visibility map up-to-date in mostly-insert-only-tables