Ensure that user created rows in extension tables get dumped if the table is explicit...
authorJoe Conway <mail@joeconway.com>
Fri, 26 Apr 2013 18:50:00 +0000 (11:50 -0700)
committerJoe Conway <mail@joeconway.com>
Fri, 26 Apr 2013 19:02:40 +0000 (12:02 -0700)
Backpatched to 9.1 when the extension management facility was added.

src/bin/pg_dump/pg_dump.c

index 366eca1ffad1a4260d52474ce02c07d51ee5112e..221ae73fc555de7cb40f55cfab866784eba51118 100644 (file)
@@ -14621,10 +14621,6 @@ getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
                int                     nconfigitems;
                int                     nconditionitems;
 
-               /* Tables of not-to-be-dumped extensions shouldn't be dumped */
-               if (!curext->dobj.dump)
-                       continue;
-
                if (parsePGArray(extconfig, &extconfigarray, &nconfigitems) &&
                  parsePGArray(extcondition, &extconditionarray, &nconditionitems) &&
                        nconfigitems == nconditionitems)
@@ -14634,21 +14630,54 @@ getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
                        for (j = 0; j < nconfigitems; j++)
                        {
                                TableInfo  *configtbl;
+                               Oid                     configtbloid = atooid(extconfigarray[j]);
+                               bool            dumpobj = curext->dobj.dump;
 
-                               configtbl = findTableByOid(atooid(extconfigarray[j]));
+                               configtbl = findTableByOid(configtbloid);
                                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.
+                                * Tables of not-to-be-dumped extensions shouldn't be dumped
+                                * unless the table or its schema is explicitly included
                                 */
-                               makeTableDataInfo(configtbl, false);
-                               if (configtbl->dataObj != NULL)
+                               if (!curext->dobj.dump)
                                {
-                                       if (strlen(extconditionarray[j]) > 0)
-                                               configtbl->dataObj->filtercond = pg_strdup(extconditionarray[j]);
+                                       /* check table explicitly requested */
+                                       if (table_include_oids.head != NULL &&
+                                               simple_oid_list_member(&table_include_oids,
+                                                                                               configtbloid))
+                                               dumpobj = true;
+
+                                       /* check table's schema explicitly requested */
+                                       if (configtbl->dobj.namespace->dobj.dump)
+                                               dumpobj = true;
+                               }
+
+                               /* check table excluded by an exclusion switch */
+                               if (table_exclude_oids.head != NULL &&
+                                       simple_oid_list_member(&table_exclude_oids,
+                                                                                       configtbloid))
+                                       dumpobj = false;
+
+                               /* check schema excluded by an exclusion switch */
+                               if (simple_oid_list_member(&schema_exclude_oids,
+                                       configtbl->dobj.namespace->dobj.catId.oid))
+                                       dumpobj = false;
+
+                               if (dumpobj)
+                               {
+                                       /*
+                                        * 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)
+                                       {
+                                               if (strlen(extconditionarray[j]) > 0)
+                                                       configtbl->dataObj->filtercond = pg_strdup(extconditionarray[j]);
+                                       }
                                }
                        }
                }