]> granicus.if.org Git - postgresql/commitdiff
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 */