Teach pg_dump to dump comments on RLS policy objects.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 17 Feb 2020 23:40:02 +0000 (18:40 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 17 Feb 2020 23:40:02 +0000 (18:40 -0500)
This was unaccountably omitted in the original RLS patch.
The SQL syntax is basically the same as for comments on triggers,
so crib code from dumpTrigger().

Per report from Marc Munro.  Back-patch to all supported branches.

Discussion: https://postgr.es/m/1581889298.18009.15.camel@bloodnok.com

src/bin/pg_dump/pg_dump.c

index ec3e2c63b0cb525422ab28a59ffe1fd733a304f7..d92a6626a591c1b2ce8e3fb441d1762c57a8a994 100644 (file)
@@ -3666,6 +3666,8 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
    TableInfo  *tbinfo = polinfo->poltable;
    PQExpBuffer query;
    PQExpBuffer delqry;
+   PQExpBuffer polprefix;
+   char       *qtabname;
    const char *cmd;
    char       *tag;
 
@@ -3723,6 +3725,9 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
 
    query = createPQExpBuffer();
    delqry = createPQExpBuffer();
+   polprefix = createPQExpBuffer();
+
+   qtabname = pg_strdup(fmtId(tbinfo->dobj.name));
 
    appendPQExpBuffer(query, "CREATE POLICY %s", fmtId(polinfo->polname));
 
@@ -3743,6 +3748,9 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
    appendPQExpBuffer(delqry, "DROP POLICY %s", fmtId(polinfo->polname));
    appendPQExpBuffer(delqry, " ON %s;\n", fmtQualifiedDumpable(tbinfo));
 
+   appendPQExpBuffer(polprefix, "POLICY %s ON",
+                     fmtId(polinfo->polname));
+
    tag = psprintf("%s %s", tbinfo->dobj.name, polinfo->dobj.name);
 
    if (polinfo->dobj.dump & DUMP_COMPONENT_POLICY)
@@ -3755,9 +3763,16 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
                                  .createStmt = query->data,
                                  .dropStmt = delqry->data));
 
+   if (polinfo->dobj.dump & DUMP_COMPONENT_COMMENT)
+       dumpComment(fout, polprefix->data, qtabname,
+                   tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
+                   polinfo->dobj.catId, 0, polinfo->dobj.dumpId);
+
    free(tag);
    destroyPQExpBuffer(query);
    destroyPQExpBuffer(delqry);
+   destroyPQExpBuffer(polprefix);
+   free(qtabname);
 }
 
 /*