Hi, One of my colleagues, Jehan-Guillaume de Rorthais, found a weird behaviour of the "-c" command line option in the pg_restore tool while doing a training. Here is the following steps he followed:
createdb foo <adds a few objets in foo> pg_dump -Fc foo > foo.dump createdb bar pg_restore -c -d bar foo.dump bar contains the same objects as foo (nothing unusual here), but... foo is no longer present. Actually, if you use the "-c" command line option, you get a "DROP DATABASE" statement. To me, it feels like a quite terrible bug. It's quite easy to reproduce. Just create a database, and use pg_dump with the "-c" option: createdb foo pg_dump -s -c foo | grep DATABASE and you end up with this: DROP DATABASE foo; I tried from 8.3 till 9.2, and only 9.2 has this behaviour. You'll find attached a patch that fixes this issue. Another colleague, Gilles Darold, tried it in every possible way, and it works. I'm not sure the test I added makes it a very good patch, but it fixes the bug. Regards. -- Guillaume http://blog.guillaume.lelarge.info http://www.dalibo.com
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index c7ef9a6..d1bd454 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -456,8 +456,8 @@ RestoreArchive(Archive *AHX) { AH->currentTE = te; - /* We want anything that's selected and has a dropStmt */ - if (((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) && te->dropStmt) + /* We want anything but database that's selected and has a dropStmt */ + if (((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) && strcmp(te->desc, "DATABASE") != 0 && te->dropStmt) { ahlog(AH, 1, "dropping %s %s\n", te->desc, te->tag); /* Select owner and schema as necessary */
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers