Fix pg_dump's handling of event triggers.
authorTom Lane
Sun, 23 Jul 2017 00:20:09 +0000 (20:20 -0400)
committerTom Lane
Sun, 23 Jul 2017 00:20:09 +0000 (20:20 -0400)
pg_dump with the --clean option failed to emit DROP EVENT TRIGGER
commands for event triggers.  In a closely related oversight,
it also did not emit ALTER OWNER commands for event triggers.
Since only superusers can create event triggers, the latter oversight
is of little practical consequence ... but if we're going to record
an owner for event triggers, then surely pg_dump should preserve it.

Per complaint from Greg Atkins.  Back-patch to 9.3 where event triggers
were introduced.

Discussion: https://postgr.es/m/20170722191142[email protected]

src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/pg_dump.c

index e7aeff0e0966b63b4f3017edc1ee923c676cac6c..410071106aef92a0d3850d38403546bc917b0d6d 100644 (file)
@@ -3204,6 +3204,7 @@ _getObjectDescription(PQExpBuffer buf, TocEntry *te, ArchiveHandle *AH)
        strcmp(type, "DATABASE") == 0 ||
        strcmp(type, "PROCEDURAL LANGUAGE") == 0 ||
        strcmp(type, "SCHEMA") == 0 ||
+       strcmp(type, "EVENT TRIGGER") == 0 ||
        strcmp(type, "FOREIGN DATA WRAPPER") == 0 ||
        strcmp(type, "SERVER") == 0 ||
        strcmp(type, "USER MAPPING") == 0)
@@ -3248,7 +3249,7 @@ _getObjectDescription(PQExpBuffer buf, TocEntry *te, ArchiveHandle *AH)
        return;
    }
 
-   write_msg(modulename, "WARNING: don't know how to set owner for object type %s\n",
+   write_msg(modulename, "WARNING: don't know how to set owner for object type \"%s\"\n",
              type);
 }
 
@@ -3407,6 +3408,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData, bool acl_pass)
            strcmp(te->desc, "OPERATOR FAMILY") == 0 ||
            strcmp(te->desc, "PROCEDURAL LANGUAGE") == 0 ||
            strcmp(te->desc, "SCHEMA") == 0 ||
+           strcmp(te->desc, "EVENT TRIGGER") == 0 ||
            strcmp(te->desc, "TABLE") == 0 ||
            strcmp(te->desc, "TYPE") == 0 ||
            strcmp(te->desc, "VIEW") == 0 ||
@@ -3442,7 +3444,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData, bool acl_pass)
        }
        else
        {
-           write_msg(modulename, "WARNING: don't know how to set owner for object type %s\n",
+           write_msg(modulename, "WARNING: don't know how to set owner for object type \"%s\"\n",
                      te->desc);
        }
    }
index db99412607f2b4beadf6ecd4d577308250d5fc4b..a0206274a456a20b3896e12276dd467d9c92174c 100644 (file)
@@ -15536,6 +15536,7 @@ dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
 {
    DumpOptions *dopt = fout->dopt;
    PQExpBuffer query;
+   PQExpBuffer delqry;
    PQExpBuffer labelq;
 
    /* Skip if not to be dumped */
@@ -15543,6 +15544,7 @@ dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
        return;
 
    query = createPQExpBuffer();
+   delqry = createPQExpBuffer();
    labelq = createPQExpBuffer();
 
    appendPQExpBufferStr(query, "CREATE EVENT TRIGGER ");
@@ -15582,19 +15584,27 @@ dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
        }
        appendPQExpBufferStr(query, ";\n");
    }
+
+   appendPQExpBuffer(delqry, "DROP EVENT TRIGGER %s;\n",
+                     fmtId(evtinfo->dobj.name));
+
    appendPQExpBuffer(labelq, "EVENT TRIGGER %s",
                      fmtId(evtinfo->dobj.name));
 
    ArchiveEntry(fout, evtinfo->dobj.catId, evtinfo->dobj.dumpId,
-                evtinfo->dobj.name, NULL, NULL, evtinfo->evtowner, false,
+                evtinfo->dobj.name, NULL, NULL,
+                evtinfo->evtowner, false,
                 "EVENT TRIGGER", SECTION_POST_DATA,
-                query->data, "", NULL, NULL, 0, NULL, NULL);
+                query->data, delqry->data, NULL,
+                NULL, 0,
+                NULL, NULL);
 
    dumpComment(fout, labelq->data,
                NULL, evtinfo->evtowner,
                evtinfo->dobj.catId, 0, evtinfo->dobj.dumpId);
 
    destroyPQExpBuffer(query);
+   destroyPQExpBuffer(delqry);
    destroyPQExpBuffer(labelq);
 }