summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-02-08 15:23:00 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2012-02-08 15:23:00 -0500
commitd77354eaec53ed469a6f2444813ff3a4fd9d7a48 (patch)
tree1c5062e113db05089e05eba7d93ca1b2c8314afe /src
parentcb7c84fae8a6780d836687aa2c9655eb936ebd25 (diff)
Fix up dumping conditions for extension configuration tables.
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.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_dump.c77
-rw-r--r--src/bin/pg_dump/pg_dump.h1
2 files changed, 42 insertions, 36 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index daafc2bc000..c91e0983f4d 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -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]);
}
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index 266047ddeb1..44f7c6bdf0a 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -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 */