Hi, Attached is version 3.
The convention seems to be to leave the operator at the end of the line when breaking long lines, so do that. Add extra () -- make operator precedence explicit and have indentation reflect operator precedence. On 09/23/2012 08:52:07 PM, Karl O. Pinc wrote: > On 09/23/2012 12:24:27 AM, Karl O. Pinc wrote: > > On 09/23/2012 12:19:07 AM, Karl O. Pinc wrote: > > > On 09/21/2012 10:54:05 AM, Karl O. Pinc wrote: > > > > On 09/20/2012 12:24:49 PM, Karl O. Pinc wrote: > > > > > > > > > I've had problems using pg_restore --data-only when > > > > > restoring individual schemas (which contain data which > > > > > has had bad things done to it). --clean does not work > > > > > well because of dependent objects in other schemas. > > > > > > Since there wasn't much more to do I've gone ahead > > > and written the patch. Works for me. > > > > > > Against git master. > > > Passes regression tests, but there's no regression > > > tests for pg_restore so this does not say much. > > > Since there's no regression tests I've not written one. > > > > > > Since this is a real patch for application I've given > > > it a new name (it's not a v2). > > > > > > Truncate done right before COPY, since that's what > > > the parallel restores do. Karl <k...@meme.com> Free Software: "You don't pay back, you pay forward." -- Robert A. Heinlein
diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml index b276da6..488d8dc 100644 --- a/doc/src/sgml/ref/pg_restore.sgml +++ b/doc/src/sgml/ref/pg_restore.sgml @@ -539,6 +539,26 @@ </varlistentry> <varlistentry> + <term><option>--truncate-tables</></term> + <listitem> + <para> + This option is only relevant when performing a data-only + restore. It instructs <application>pg_restore</application> + to execute commands to truncate the target tables while the + data is reloaded. Use this when restoring tables or schemas + and <option>--clean</option> cannot be used because dependent + objects would be destroyed. + </para> + + <para> + The <option>--disable-triggers</option> will almost always + always need to be used in conjunction with this option to + disable check constraints on foreign keys. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term><option>--use-set-session-authorization</option></term> <listitem> <para> diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index 3b49395..0aaf1d3 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -101,6 +101,8 @@ typedef struct _restoreOptions int noTablespace; /* Don't issue tablespace-related commands */ int disable_triggers; /* disable triggers during data-only * restore */ + int truncate_tables; /* truncate tables during data-only + * restore */ int use_setsessauth;/* Use SET SESSION AUTHORIZATION commands * instead of OWNER TO */ int no_security_labels; /* Skip security label entries */ diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 722b3e9..43b5806 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -311,6 +311,11 @@ RestoreArchive(Archive *AHX) if (ropt->createDB && ropt->dropSchema) exit_horribly(modulename, "-C and -c are incompatible options\n"); + /* When the schema is dropped and re-created then no point + * truncating tables. */ + if (ropt->dropSchema && ropt->truncate_tables) + exit_horribly(modulename, "-c and --truncate-tables are incompatible options\n"); + /* * -C is not compatible with -1, because we can't create a database inside * a transaction block. @@ -412,6 +417,10 @@ RestoreArchive(Archive *AHX) } } + /* Truncate tables only when restoring data. */ + if (!ropt->dataOnly && ropt->truncate_tables) + exit_horribly(modulename, "--truncate-tables requires the --data-only option\n"); + /* * Setup the output file if necessary. */ @@ -553,6 +562,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, int retval = 0; teReqs reqs; bool defnDumped; + bool truncate; AH->currentTE = te; @@ -687,15 +697,22 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, * server, so no need to see if we should issue BEGIN. */ StartTransaction(AH); + truncate = 1; + } else + /* Truncate the table when asked to. */ + truncate = ropt->truncate_tables; + if (truncate) { /* * If the server version is >= 8.4, make sure we issue * TRUNCATE with ONLY so that child tables are not - * wiped. + * wiped. If we don't know the server version + * then err on the side of safety. */ ahprintf(AH, "TRUNCATE TABLE %s%s;\n\n", - (PQserverVersion(AH->connection) >= 80400 ? - "ONLY " : ""), + ((!AH->connection || + PQserverVersion(AH->connection) >= 80400) ? + "ONLY " : ""), fmtId(te->tag)); } diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index f6c835b..c0b0bfc 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -77,6 +77,7 @@ main(int argc, char **argv) static int disable_triggers = 0; static int no_data_for_failed_tables = 0; static int outputNoTablespaces = 0; + static int truncate_tables = 0; static int use_setsessauth = 0; static int no_security_labels = 0; @@ -119,6 +120,7 @@ main(int argc, char **argv) {"no-tablespaces", no_argument, &outputNoTablespaces, 1}, {"role", required_argument, NULL, 2}, {"section", required_argument, NULL, 3}, + {"truncate-tables", no_argument, &truncate_tables, 1}, {"use-set-session-authorization", no_argument, &use_setsessauth, 1}, {"no-security-labels", no_argument, &no_security_labels, 1}, @@ -324,6 +326,7 @@ main(int argc, char **argv) opts->disable_triggers = disable_triggers; opts->noDataForFailedTables = no_data_for_failed_tables; opts->noTablespace = outputNoTablespaces; + opts->truncate_tables = truncate_tables; opts->use_setsessauth = use_setsessauth; opts->no_security_labels = no_security_labels; @@ -434,6 +437,7 @@ usage(const char *progname) printf(_(" --no-security-labels do not restore security labels\n")); printf(_(" --no-tablespaces do not restore tablespace assignments\n")); printf(_(" --section=SECTION restore named section (pre-data, data, or post-data)\n")); + printf(_(" --truncate-tables truncate tables before restore\n")); printf(_(" --use-set-session-authorization\n" " use SET SESSION AUTHORIZATION commands instead of\n" " ALTER OWNER commands to set ownership\n"));
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers