Fix up dumping conditions for extension configuration tables.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 8 Feb 2012 20:23:00 +0000 (15:23 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 8 Feb 2012 20:23:00 +0000 (15:23 -0500)
Various filters that were meant to prevent dumping of table data were not
being applied to extension config tables, notably --exclude-table-data and
--no-unlogged-table-data.  We also would bogusly try to dump data from
views, sequences, or foreign tables, should an extension try to claim they
were config tables.  Fix all that, and refactor/redocument to try to make
this a bit less fragile.  This reverts the implementation, though not the
feature, of commit 7b070e896ca835318c90b02c830a5c4844413b64, which had
broken config-table dumping altogether :-(.

It is still the case that the code will dump config-table data even if
--schema is specified.  That behavior was intentional, as per the comments
in getExtensionMembership, so I think it requires some more discussion
before we change it.

src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/pg_dump.h

index daafc2bc000b465492caaf33e8fd019059f2988c..c91e0983f4de2d0a27a999dea19e05800cda2daa 100644 (file)
@@ -1140,15 +1140,6 @@ 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;
-
 }
 
 /*
@@ -1599,10 +1590,6 @@ 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 */
@@ -1644,33 +1631,50 @@ getTableData(TableInfo *tblinfo, int numTables, bool oids)
 
    for (i = 0; i < numTables; i++)
    {
-       /* Skip VIEWs (no data to dump) */
-       if (tblinfo[i].relkind == RELKIND_VIEW)
-           continue;
-       /* Skip SEQUENCEs (handled elsewhere) */
-       if (tblinfo[i].relkind == RELKIND_SEQUENCE)
-           continue;
-       /* Skip FOREIGN TABLEs (no data to dump) */
-       if (tblinfo[i].relkind == RELKIND_FOREIGN_TABLE)
-           continue;
-       /* Skip unlogged tables if so requested */
-       if (tblinfo[i].relpersistence == RELPERSISTENCE_UNLOGGED
-           && no_unlogged_table_data)
-           continue;
-
-       if (tblinfo[i].dobj.dump && tblinfo[i].dataObj == NULL)
+       if (tblinfo[i].dobj.dump)
            makeTableDataInfo(&(tblinfo[i]), oids);
    }
 }
 
 /*
  * Make a dumpable object for the data of this specific table
+ *
+ * Note: we make a TableDataInfo if and only if we are going to dump the
+ * table data; the "dump" flag in such objects isn't used.
  */
 static void
 makeTableDataInfo(TableInfo *tbinfo, bool oids)
 {
    TableDataInfo *tdinfo;
 
+   /*
+    * Nothing to do if we already decided to dump the table.  This will
+    * happen for "config" tables.
+    */
+   if (tbinfo->dataObj != NULL)
+       return;
+
+   /* Skip VIEWs (no data to dump) */
+   if (tbinfo->relkind == RELKIND_VIEW)
+       return;
+   /* Skip SEQUENCEs (handled elsewhere) */
+   if (tbinfo->relkind == RELKIND_SEQUENCE)
+       return;
+   /* Skip FOREIGN TABLEs (no data to dump) */
+   if (tbinfo->relkind == RELKIND_FOREIGN_TABLE)
+       return;
+
+   /* Don't dump data in unlogged tables, if so requested */
+   if (tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED &&
+       no_unlogged_table_data)
+       return;
+
+   /* Check that the data is not explicitly excluded */
+   if (simple_oid_list_member(&tabledata_exclude_oids,
+                              tbinfo->dobj.catId.oid))
+       return;
+
+   /* OK, let's dump it */
    tdinfo = (TableDataInfo *) pg_malloc(sizeof(TableDataInfo));
 
    tdinfo->dobj.objType = DO_TABLE_DATA;
@@ -14127,14 +14131,17 @@ getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
                TableInfo  *configtbl;
 
                configtbl = findTableByOid(atooid(extconfigarray[j]));
-               if (configtbl && configtbl->dataObj == NULL)
+               if (configtbl == NULL)
+                   continue;
+
+               /*
+                * Note: config tables are dumped without OIDs regardless
+                * of the --oids setting.  This is because row filtering
+                * conditions aren't compatible with dumping OIDs.
+                */
+               makeTableDataInfo(configtbl, false);
+               if (configtbl->dataObj != NULL)
                {
-                   /*
-                    * Note: config tables are dumped without OIDs regardless
-                    * of the --oids setting.  This is because row filtering
-                    * conditions aren't compatible with dumping OIDs.
-                    */
-                   makeTableDataInfo(configtbl, false);
                    if (strlen(extconditionarray[j]) > 0)
                        configtbl->dataObj->filtercond = pg_strdup(extconditionarray[j]);
                }
index 266047ddeb10a2081a3a835c1eecfab15bf4516a..44f7c6bdf0a8495ba8cccf277bf4ef93cc3df312 100644 (file)
@@ -129,7 +129,6 @@ 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 */