Skip to content
Snippets Groups Projects
Commit dc42602f authored by Tom Lane's avatar Tom Lane
Browse files

Fix dumping of matviews with indirect dependencies on primary keys.

Commit 62215de2 turns out to have been not quite on-the-mark.
When we are forced to postpone dumping of a materialized view into
the dump's post-data section (because it depends on a unique index
that isn't created till that section), we may also have to postpone
dumping other matviews that depend on said matview.  The previous fix
didn't reliably work for such cases: it'd break the dependency loops
properly, producing a workable object ordering, but it didn't
necessarily mark all the matviews as "postponed_def".  This led to
harmless bleating about "archive items not in correct section order",
as reported by Tom Cassidy in bug #15602.  Less harmlessly,
selective-restore options such as --section might misbehave due to
the matview dump objects not being properly labeled.

The right way to fix it is to consider that each pre-data dependency
we break amounts to moving the no-longer-dependent object into
post-data, and hence we should mark that object if it's a matview.

Back-patch to all supported versions, since the issue's been there
since matviews were introduced.

Discussion: https://postgr.es/m/15602-e895445f73dc450b@postgresql.org
parent e101878d
No related branches found
No related tags found
No related merge requests found
...@@ -844,19 +844,26 @@ repairViewRuleMultiLoop(DumpableObject *viewobj, ...@@ -844,19 +844,26 @@ repairViewRuleMultiLoop(DumpableObject *viewobj,
* *
* Note that the "next object" is not necessarily the matview itself; * Note that the "next object" is not necessarily the matview itself;
* it could be the matview's rowtype, for example. We may come through here * it could be the matview's rowtype, for example. We may come through here
* several times while removing all the pre-data linkages. * several times while removing all the pre-data linkages. In particular,
* if there are other matviews that depend on the one with the circularity
* problem, we'll come through here for each such matview and mark them all
* as postponed. (This works because all MVs have pre-data dependencies
* to begin with, so each of them will get visited.)
*/ */
static void static void
repairMatViewBoundaryMultiLoop(DumpableObject *matviewobj, repairMatViewBoundaryMultiLoop(DumpableObject *boundaryobj,
DumpableObject *boundaryobj,
DumpableObject *nextobj) DumpableObject *nextobj)
{ {
TableInfo *matviewinfo = (TableInfo *) matviewobj;
/* remove boundary's dependency on object after it in loop */ /* remove boundary's dependency on object after it in loop */
removeObjectDependency(boundaryobj, nextobj->dumpId); removeObjectDependency(boundaryobj, nextobj->dumpId);
/* mark matview as postponed into post-data section */ /* if that object is a matview, mark it as postponed into post-data */
matviewinfo->postponed_def = true; if (nextobj->objType == DO_TABLE)
{
TableInfo *nextinfo = (TableInfo *) nextobj;
if (nextinfo->relkind == RELKIND_MATVIEW)
nextinfo->postponed_def = true;
}
} }
/* /*
...@@ -1038,8 +1045,7 @@ repairDependencyLoop(DumpableObject **loop, ...@@ -1038,8 +1045,7 @@ repairDependencyLoop(DumpableObject **loop,
DumpableObject *nextobj; DumpableObject *nextobj;
nextobj = (j < nLoop - 1) ? loop[j + 1] : loop[0]; nextobj = (j < nLoop - 1) ? loop[j + 1] : loop[0];
repairMatViewBoundaryMultiLoop(loop[i], loop[j], repairMatViewBoundaryMultiLoop(loop[j], nextobj);
nextobj);
return; return;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment