]> granicus.if.org Git - postgresql/commitdiff
Fix pg_dump's handling of event triggers.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 23 Jul 2017 00:20:09 +0000 (20:20 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
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.yi4e7tzcg3iacclg@gmail.com

src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/t/002_pg_dump.pl

index b9d063aa224e3c489c9e187ac8d340d149b8a481..f461692d45cf47fefbbcd8b52c07b209e64449e5 100644 (file)
@@ -3313,6 +3313,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, "PUBLICATION") == 0 ||
@@ -3359,7 +3360,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);
 }
 
@@ -3518,6 +3519,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 ||
@@ -3556,7 +3558,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 502d5eb7af5d29071d96703b192f9ef8171b3c1e..8e9454885ac73a764b515fc3e12d86155a61b087 100644 (file)
@@ -16844,6 +16844,7 @@ dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
 {
        DumpOptions *dopt = fout->dopt;
        PQExpBuffer query;
+       PQExpBuffer delqry;
        PQExpBuffer labelq;
 
        /* Skip if not to be dumped */
@@ -16851,6 +16852,7 @@ dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
                return;
 
        query = createPQExpBuffer();
+       delqry = createPQExpBuffer();
        labelq = createPQExpBuffer();
 
        appendPQExpBufferStr(query, "CREATE EVENT TRIGGER ");
@@ -16890,14 +16892,21 @@ 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));
 
        if (evtinfo->dobj.dump & DUMP_COMPONENT_DEFINITION)
                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);
 
        if (evtinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
                dumpComment(fout, labelq->data,
@@ -16905,6 +16914,7 @@ dumpEventTrigger(Archive *fout, EventTriggerInfo *evtinfo)
                                        evtinfo->dobj.catId, 0, evtinfo->dobj.dumpId);
 
        destroyPQExpBuffer(query);
+       destroyPQExpBuffer(delqry);
        destroyPQExpBuffer(labelq);
 }
 
index a8000db3369c34672011399c5ab8671b378a7c2d..4c6201be61165ee18af8c0425ca75ca93161eb66 100644 (file)
@@ -466,7 +466,7 @@ my %tests = (
        'ALTER COLLATION test0 OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp    => qr/^ALTER COLLATION test0 OWNER TO .*;/m,
                collation => 1,
                like      => {
@@ -493,7 +493,7 @@ my %tests = (
        'ALTER FOREIGN DATA WRAPPER dummy OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER FOREIGN DATA WRAPPER dummy OWNER TO .*;/m,
                like   => {
                        binary_upgrade           => 1,
@@ -520,7 +520,7 @@ my %tests = (
        'ALTER SERVER s1 OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER SERVER s1 OWNER TO .*;/m,
                like   => {
                        binary_upgrade           => 1,
@@ -547,7 +547,7 @@ my %tests = (
        'ALTER FUNCTION dump_test.pltestlang_call_handler() OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^
                        \QALTER FUNCTION dump_test.pltestlang_call_handler() \E
                        \QOWNER TO \E
@@ -576,7 +576,7 @@ my %tests = (
        'ALTER OPERATOR FAMILY dump_test.op_family OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^
                        \QALTER OPERATOR FAMILY dump_test.op_family USING btree \E
                        \QOWNER TO \E
@@ -655,7 +655,7 @@ my %tests = (
        'ALTER OPERATOR CLASS dump_test.op_class OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^
                        \QALTER OPERATOR CLASS dump_test.op_class USING btree \E
                        \QOWNER TO \E
@@ -746,7 +746,7 @@ my %tests = (
        'ALTER PROCEDURAL LANGUAGE pltestlang OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER PROCEDURAL LANGUAGE pltestlang OWNER TO .*;/m,
                like   => {
                        binary_upgrade           => 1,
@@ -772,7 +772,7 @@ my %tests = (
        'ALTER SCHEMA dump_test OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER SCHEMA dump_test OWNER TO .*;/m,
                like   => {
                        binary_upgrade          => 1,
@@ -798,7 +798,7 @@ my %tests = (
        'ALTER SCHEMA dump_test_second_schema OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER SCHEMA dump_test_second_schema OWNER TO .*;/m,
                like   => {
                        binary_upgrade           => 1,
@@ -1193,7 +1193,7 @@ my %tests = (
        'ALTER TABLE test_table OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER TABLE test_table OWNER TO .*;/m,
                like   => {
                        binary_upgrade          => 1,
@@ -1251,7 +1251,7 @@ my %tests = (
        'ALTER TABLE test_second_table OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER TABLE test_second_table OWNER TO .*;/m,
                like   => {
                        binary_upgrade          => 1,
@@ -1278,7 +1278,7 @@ my %tests = (
        'ALTER TABLE test_third_table OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER TABLE test_third_table OWNER TO .*;/m,
                like   => {
                        binary_upgrade           => 1,
@@ -1305,7 +1305,7 @@ my %tests = (
        'ALTER TABLE measurement OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER TABLE measurement OWNER TO .*;/m,
                like   => {
                        binary_upgrade          => 1,
@@ -1332,7 +1332,7 @@ my %tests = (
        'ALTER TABLE measurement_y2006m2 OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER TABLE measurement_y2006m2 OWNER TO .*;/m,
                like   => {
                        binary_upgrade           => 1,
@@ -1359,7 +1359,7 @@ my %tests = (
        'ALTER FOREIGN TABLE foreign_table OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp => qr/^ALTER FOREIGN TABLE foreign_table OWNER TO .*;/m,
                like   => {
                        binary_upgrade          => 1,
@@ -1386,7 +1386,7 @@ my %tests = (
        'ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp =>
                  qr/^ALTER TEXT SEARCH CONFIGURATION alt_ts_conf1 OWNER TO .*;/m,
                like => {
@@ -1414,7 +1414,7 @@ my %tests = (
        'ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 OWNER TO' => {
                all_runs => 1,
                catch_all =>
-                 'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)',
+                 'ALTER ... OWNER commands (except post-data objects)',
                regexp =>
                  qr/^ALTER TEXT SEARCH DICTIONARY alt_ts_dict1 OWNER TO .*;/m,
                like => {
@@ -1439,11 +1439,11 @@ my %tests = (
                        only_dump_test_table     => 1,
                        role                     => 1, }, },
 
-       # catch-all for ALTER ... OWNER (except LARGE OBJECTs and PUBLICATIONs)
-       'ALTER ... OWNER commands (except LARGE OBJECTs and PUBLICATIONs)' => {
+       # catch-all for ALTER ... OWNER (except post-data objects)
+       'ALTER ... OWNER commands (except post-data objects)' => {
                all_runs => 0,    # catch-all
                regexp =>
-qr/^ALTER (?!LARGE OBJECT|PUBLICATION|SUBSCRIPTION)(.*) OWNER TO .*;/m,
+qr/^ALTER (?!EVENT TRIGGER|LARGE OBJECT|PUBLICATION|SUBSCRIPTION)(.*) OWNER TO .*;/m,
                like   => {},     # use more-specific options above
                unlike => {
                        column_inserts           => 1,