diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 09ca6ddbeb..cdbed20908 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -5064,6 +5064,16 @@ getRules(Archive *fout, int *numRules) } else ruleinfo[i].separate = true; + + /* + * If we're forced to break a dependency loop by dumping a view as a + * table and separate _RETURN rule, we'll move the view's reloptions + * to the rule. (This is necessary because tables and views have + * different valid reloptions, so we can't apply the options until the + * backend knows it's a view.) Otherwise the rule's reloptions stay + * NULL. + */ + ruleinfo[i].reloptions = NULL; } PQclear(res); @@ -13873,10 +13883,7 @@ dumpRule(Archive *fout, RuleInfo *rinfo) */ if (rinfo->ev_enabled != 'O') { - appendPQExpBuffer(cmd, "ALTER TABLE %s.", - fmtId(tbinfo->dobj.namespace->dobj.name)); - appendPQExpBuffer(cmd, "%s ", - fmtId(tbinfo->dobj.name)); + appendPQExpBuffer(cmd, "ALTER TABLE %s ", fmtId(tbinfo->dobj.name)); switch (rinfo->ev_enabled) { case 'A': @@ -13894,6 +13901,16 @@ dumpRule(Archive *fout, RuleInfo *rinfo) } } + /* + * Apply view's reloptions when its ON SELECT rule is separate. + */ + if (rinfo->reloptions) + { + appendPQExpBuffer(cmd, "ALTER VIEW %s SET (%s);\n", + fmtId(tbinfo->dobj.name), + rinfo->reloptions); + } + /* * DROP must be fully qualified in case same name appears in pg_catalog */ diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 5793bca0c4..2aa206038d 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -333,6 +333,8 @@ typedef struct _ruleInfo char ev_enabled; bool separate; /* TRUE if must dump as separate item */ /* separate is always true for non-ON SELECT rules */ + char *reloptions; /* options specified by WITH (...) */ + /* reloptions is only set if we need to dump the options with the rule */ } RuleInfo; typedef struct _triggerInfo diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index cccc1e0646..ddbe8305b1 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -725,12 +725,21 @@ static void repairViewRuleMultiLoop(DumpableObject *viewobj, DumpableObject *ruleobj) { + TableInfo *viewinfo = (TableInfo *) viewobj; + RuleInfo *ruleinfo = (RuleInfo *) ruleobj; + /* remove view's dependency on rule */ removeObjectDependency(viewobj, ruleobj->dumpId); /* pretend view is a plain table and dump it that way */ - ((TableInfo *) viewobj)->relkind = 'r'; /* RELKIND_RELATION */ + viewinfo->relkind = 'r'; /* RELKIND_RELATION */ /* mark rule as needing its own dump */ - ((RuleInfo *) ruleobj)->separate = true; + ruleinfo->separate = true; + /* move any reloptions from view to rule */ + if (viewinfo->reloptions) + { + ruleinfo->reloptions = viewinfo->reloptions; + viewinfo->reloptions = NULL; + } /* put back rule's dependency on view */ addObjectDependency(ruleobj, viewobj->dumpId); /* now that rule is separate, it must be post-data */