Fix pg_dump's handling of event triggers.
authorTom Lane
Sun, 23 Jul 2017 00:20:10 +0000 (20:20 -0400)
committerTom Lane
Sun, 23 Jul 2017 00:20:10 +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 64aae43e2fff3e9f486515a8c700a092cd7ca79b..2c1b85b96eefb486e0394b86c5c996efbe22a9ae 100644 (file)
@@ -3093,6 +3093,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)
@@ -3137,7 +3138,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);
 }
 
@@ -3294,6 +3295,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isDat
            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 ||
@@ -3327,7 +3329,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isDat
        }
        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 edeb567b5b06e387f67f83f3a2701d4151a9da67..0ba64a3b3f5767fe003b370e33a687c0e8dbc127 100644 (file)
@@ -14833,6 +14833,7 @@ static void
 dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
 {
    PQExpBuffer query;
+   PQExpBuffer delqry;
    PQExpBuffer labelq;
 
    /* Skip if not to be dumped */
@@ -14840,6 +14841,7 @@ dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
        return;
 
    query = createPQExpBuffer();
+   delqry = createPQExpBuffer();
    labelq = createPQExpBuffer();
 
    appendPQExpBufferStr(query, "CREATE EVENT TRIGGER ");
@@ -14879,19 +14881,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);
 }