From d77354eaec53ed469a6f2444813ff3a4fd9d7a48 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 8 Feb 2012 15:23:00 -0500 Subject: [PATCH] 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. --- src/bin/pg_dump/pg_dump.c | 77 +++++++++++++++++++++------------------ src/bin/pg_dump/pg_dump.h | 1 - 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 */ -- 2.39.5