From edf803dcbff0f3f2429380d795f34a87ffc708b6 Mon Sep 17 00:00:00 2001 From: Euler Taveira Date: Sat, 15 Sep 2018 02:52:00 +0000 Subject: [PATCH 7/8] Publication where condition support for pg_dump --- src/bin/pg_dump/pg_dump.c | 15 +++++++++++++-- src/bin/pg_dump/pg_dump.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index bf69adc2f4..0eddf204f6 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -3956,6 +3956,7 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) int i_tableoid; int i_oid; int i_pubname; + int i_pubrelqual; int i, j, ntups; @@ -3988,7 +3989,8 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) /* Get the publication membership for the table. */ appendPQExpBuffer(query, - "SELECT pr.tableoid, pr.oid, p.pubname " + "SELECT pr.tableoid, pr.oid, p.pubname, " + "pg_catalog.pg_get_expr(pr.prqual, pr.prrelid) AS pubrelqual " "FROM pg_publication_rel pr, pg_publication p " "WHERE pr.prrelid = '%u'" " AND p.oid = pr.prpubid", @@ -4009,6 +4011,7 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_pubname = PQfnumber(res, "pubname"); + i_pubrelqual = PQfnumber(res, "pubrelqual"); pubrinfo = pg_malloc(ntups * sizeof(PublicationRelInfo)); @@ -4024,6 +4027,11 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables) pubrinfo[j].pubname = pg_strdup(PQgetvalue(res, j, i_pubname)); pubrinfo[j].pubtable = tbinfo; + if (PQgetisnull(res, j, i_pubrelqual)) + pubrinfo[j].pubrelqual = NULL; + else + pubrinfo[j].pubrelqual = pg_strdup(PQgetvalue(res, j, i_pubrelqual)); + /* Decide whether we want to dump it */ selectDumpablePublicationTable(&(pubrinfo[j].dobj), fout); } @@ -4052,8 +4060,11 @@ dumpPublicationTable(Archive *fout, PublicationRelInfo *pubrinfo) appendPQExpBuffer(query, "ALTER PUBLICATION %s ADD TABLE ONLY", fmtId(pubrinfo->pubname)); - appendPQExpBuffer(query, " %s;\n", + appendPQExpBuffer(query, " %s", fmtQualifiedDumpable(tbinfo)); + if (pubrinfo->pubrelqual) + appendPQExpBuffer(query, " WHERE %s", pubrinfo->pubrelqual); + appendPQExpBufferStr(query, ";\n"); /* * There is no point in creating drop query as the drop is done by table diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 7b2c1524a5..e0ba005d75 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -611,6 +611,7 @@ typedef struct _PublicationRelInfo DumpableObject dobj; TableInfo *pubtable; char *pubname; + char *pubrelqual; } PublicationRelInfo; /* -- 2.11.0