Add --exclude-table-data option to pg_dump.
authorAndrew Dunstan <[email protected]>
Wed, 14 Dec 2011 14:23:17 +0000 (09:23 -0500)
committerAndrew Dunstan <[email protected]>
Wed, 14 Dec 2011 14:23:17 +0000 (09:23 -0500)
Andrew Dunstan, reviewed by Josh Berkus, Robert Haas and Peter Geoghegan.

This allows dumping of a table definition but not its data, on a per table basis.
Table name patterns are supported just as for --exclude-table.

doc/src/sgml/ref/pg_dump.sgml
src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/pg_dump.h

index f6f33de7e7e0a41f64265ef376af19be8397704b..98f0ec68f8f37cd55d00a58728e0a0a1d21f0243 100644 (file)
@@ -404,6 +404,10 @@ PostgreSQL documentation
        <para>
         Dump only the object definitions (schema), not data.
        </para>
+       <para>
+        To exclude table data for only a subset of tables in the database, 
+        see <option>--exclude-table-data</>.
+       </para>
       </listitem>
      </varlistentry>
 
@@ -611,6 +615,24 @@ PostgreSQL documentation
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>--exclude-table-data=<replaceable class="parameter">table</replaceable></option></term>
+      <listitem>
+       <para>
+        Do not dump data for any tables matching the <replaceable
+        class="parameter">table</replaceable> pattern. The pattern is
+        interpreted according to the same rules as for <option>-t</>.
+        <option>--exclude-table-data</> can be given more than once to 
+        exclude tables matching any of several patterns. This option is
+        useful when you need the definition of a particular table even
+        though you do not need the data in it.
+       </para>
+       <para>
+        To exclude data for all tables in the database, see <option>--schema-only</>.
+       <para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>--inserts</option></term>
       <listitem>
index afeae6f9f7fd6c949b7e1b1b4a6b409296fc972b..2fa99dd0bbdff4a87965c23274f7e0431269750c 100644 (file)
@@ -115,6 +115,8 @@ static SimpleStringList table_include_patterns = {NULL, NULL};
 static SimpleOidList table_include_oids = {NULL, NULL};
 static SimpleStringList table_exclude_patterns = {NULL, NULL};
 static SimpleOidList table_exclude_oids = {NULL, NULL};
+static SimpleStringList tabledata_exclude_patterns = {NULL, NULL};
+static SimpleOidList tabledata_exclude_oids = {NULL, NULL};
 
 /* default, if no "inclusion" switches appear, is to dump everything */
 static bool include_everything = true;
@@ -324,6 +326,7 @@ main(int argc, char **argv)
        {"column-inserts", no_argument, &column_inserts, 1},
        {"disable-dollar-quoting", no_argument, &disable_dollar_quoting, 1},
        {"disable-triggers", no_argument, &disable_triggers, 1},
+       {"exclude-table-data", required_argument, NULL, 4},
        {"inserts", no_argument, &dump_inserts, 1},
        {"lock-wait-timeout", required_argument, NULL, 2},
        {"no-tablespaces", no_argument, &outputNoTablespaces, 1},
@@ -487,6 +490,10 @@ main(int argc, char **argv)
                use_role = optarg;
                break;
 
+           case 4:         /* exclude table(s) data */
+               simple_string_list_append(&tabledata_exclude_patterns, optarg);
+               break;
+
            default:
                fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
                exit(1);
@@ -715,6 +722,10 @@ main(int argc, char **argv)
    }
    expand_table_name_patterns(&table_exclude_patterns,
                               &table_exclude_oids);
+
+   expand_table_name_patterns(&tabledata_exclude_patterns,
+                              &tabledata_exclude_oids);
+
    /* non-matching exclusion patterns aren't an error */
 
    /*
@@ -854,6 +865,7 @@ help(const char *progname)
    printf(_("  --column-inserts            dump data as INSERT commands with column names\n"));
    printf(_("  --disable-dollar-quoting    disable dollar quoting, use SQL standard quoting\n"));
    printf(_("  --disable-triggers          disable triggers during data-only restore\n"));
+   printf(_("  --exclude-table-data=TABLE  do NOT dump data for the named table(s)\n"));
    printf(_("  --inserts                   dump data as INSERT commands, rather than COPY\n"));
    printf(_("  --no-security-labels        do not dump security label assignments\n"));
    printf(_("  --no-tablespaces            do not dump tablespace assignments\n"));
@@ -1087,6 +1099,15 @@ selectDumpableTable(TableInfo *tbinfo)
        simple_oid_list_member(&table_exclude_oids,
                               tbinfo->dobj.catId.oid))
        tbinfo->dobj.dump = false;
+
+   /* If table is to be dumped, check that the data is not excluded */
+   if (tbinfo->dobj.dump && !
+       simple_oid_list_member(&tabledata_exclude_oids,
+                              tbinfo->dobj.catId.oid))
+       tbinfo->dobj.dumpdata = true;
+   else
+       tbinfo->dobj.dumpdata = false;
+       
 }
 
 /*
@@ -1518,6 +1539,10 @@ dumpTableData(Archive *fout, TableDataInfo *tdinfo)
    DataDumperPtr dumpFn;
    char       *copyStmt;
 
+   /* don't do anything if the data isn't wanted */
+   if (!tbinfo->dobj.dumpdata)
+       return;
+
    if (!dump_inserts)
    {
        /* Dump/restore using COPY */
index c248e755992bb68f8e02fdd84a8c4ae3959a392b..31442f1622d76442fdee07d7ece7adb7a0469075 100644 (file)
@@ -129,6 +129,7 @@ typedef struct _dumpableObject
    char       *name;           /* object name (should never be NULL) */
    struct _namespaceInfo *namespace;   /* containing namespace, or NULL */
    bool        dump;           /* true if we want to dump this object */
+   bool        dumpdata;       /* true if we want data for this object */
    bool        ext_member;     /* true if object is member of extension */
    DumpId     *dependencies;   /* dumpIds of objects this one depends on */
    int         nDeps;          /* number of valid dependencies */