18#include "catalog/pg_class_d.h"
158 "array length mismatch");
222 cmpval = strcmp(obj1->namespace->dobj.
name,
223 obj2->namespace->dobj.
name);
230 else if (obj2->namespace)
241 cmpval = strcmp(obj1->
name, obj2->
name);
441 cmpval = strcmp(probj1->publication->dobj.name,
442 probj2->publication->dobj.name);
480 if (typid1 == typid2)
486 if (!typobj1 || !typobj2)
504 if (!typobj1->
dobj.namespace || !typobj2->
dobj.namespace)
508 cmpval = strcmp(typobj1->
dobj.namespace->dobj.
name,
509 typobj2->
dobj.namespace->dobj.
name);
529 if (!amobj1 || !amobj2)
565 while (!
TopoSort(objs, numObjs, ordering, &nOrdering))
627 *nOrdering = numObjs;
644 idMap = (
int *)
pg_malloc((maxDumpId + 1) *
sizeof(int));
645 for (
i = 0;
i < numObjs;
i++)
649 if (j <= 0 || j > maxDumpId)
655 if (k <= 0 || k > maxDumpId)
656 pg_fatal(
"invalid dependency %d", k);
669 for (
i = numObjs; --
i >= 0;)
700 for (k = 0; k < obj->
nDeps; k++)
716 for (
j = 1;
j <= maxDumpId;
j++)
719 ordering[k++] = objs[idMap[
j]];
784 for (
i = 0;
i < nObjs;
i++)
803 for (
j = 0;
j < looplen;
j++)
804 processed[workspace[
j]->dumpId] =
true;
814 processed[obj->
dumpId] =
true;
820 pg_fatal(
"could not identify dependency loop");
858 if (processed[obj->
dumpId])
865 if (searchFailed[obj->
dumpId] == startPoint)
874 for (
i = 0;
i < depth;
i++)
876 if (workspace[
i] == obj)
883 workspace[depth++] = obj;
917 searchFailed[obj->
dumpId] = startPoint;
1029 if (nextinfo->
relkind == RELKIND_MATVIEW)
1036 if (nextinfo->
relkind == RELKIND_MATVIEW)
1171 loop[0]->objType ==
DO_TYPE &&
1178 loop[1]->objType ==
DO_TYPE &&
1188 loop[1]->objType ==
DO_RULE &&
1189 (((
TableInfo *) loop[0])->relkind == RELKIND_VIEW ||
1190 ((
TableInfo *) loop[0])->relkind == RELKIND_MATVIEW) &&
1191 ((
RuleInfo *) loop[1])->ev_type ==
'1' &&
1192 ((
RuleInfo *) loop[1])->is_instead &&
1200 loop[0]->objType ==
DO_RULE &&
1201 (((
TableInfo *) loop[1])->relkind == RELKIND_VIEW ||
1202 ((
TableInfo *) loop[1])->relkind == RELKIND_MATVIEW) &&
1203 ((
RuleInfo *) loop[0])->ev_type ==
'1' &&
1204 ((
RuleInfo *) loop[0])->is_instead &&
1214 for (
i = 0;
i < nLoop;
i++)
1217 ((
TableInfo *) loop[
i])->relkind == RELKIND_VIEW)
1219 for (
j = 0;
j < nLoop;
j++)
1222 ((
RuleInfo *) loop[
j])->ev_type ==
'1' &&
1237 for (
i = 0;
i < nLoop;
i++)
1240 ((
TableInfo *) loop[
i])->relkind == RELKIND_MATVIEW)
1242 for (
j = 0;
j < nLoop;
j++)
1248 nextobj = (
j < nLoop - 1) ? loop[
j + 1] : loop[0];
1257 for (
j = 0;
j < nLoop;
j++)
1263 nextobj = (
j < nLoop - 1) ? loop[
j + 1] : loop[0];
1275 for (
i = 0;
i < nLoop;
i++)
1279 for (
j = 0;
j < nLoop;
j++)
1285 nextobj = (
j < nLoop - 1) ? loop[
j + 1] : loop[0];
1317 for (
i = 0;
i < nLoop;
i++)
1321 for (
j = 0;
j < nLoop;
j++)
1358 if (((
IndxInfo *) loop[0])->parentidx == loop[1]->catId.oid)
1363 else if (((
IndxInfo *) loop[1])->parentidx == loop[0]->catId.oid)
1373 for (
i = 0;
i < nLoop;
i++)
1377 for (
j = 0;
j < nLoop;
j++)
1392 loop[0]->objType ==
DO_TYPE &&
1402 loop[1]->objType ==
DO_TYPE &&
1415 for (
i = 0;
i < nLoop;
i++)
1419 for (
j = 0;
j < nLoop;
j++)
1457 for (
i = 0;
i < nLoop;
i++)
1465 "there are circular foreign-key constraints among these tables:",
1467 for (
i = 0;
i < nLoop;
i++)
1469 pg_log_warning_hint(
"You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.");
1470 pg_log_warning_hint(
"Consider using a full dump instead of a --data-only dump to avoid this problem.");
1482 pg_log_warning(
"could not resolve dependency loop among these items:");
1483 for (
i = 0;
i < nLoop;
i++)
1509 "SCHEMA %s (ID %d OID %u)",
1514 "EXTENSION %s (ID %d OID %u)",
1519 "TYPE %s (ID %d OID %u)",
1524 "SHELL TYPE %s (ID %d OID %u)",
1529 "FUNCTION %s (ID %d OID %u)",
1534 "AGGREGATE %s (ID %d OID %u)",
1539 "OPERATOR %s (ID %d OID %u)",
1544 "ACCESS METHOD %s (ID %d OID %u)",
1549 "OPERATOR CLASS %s (ID %d OID %u)",
1554 "OPERATOR FAMILY %s (ID %d OID %u)",
1559 "COLLATION %s (ID %d OID %u)",
1564 "CONVERSION %s (ID %d OID %u)",
1569 "TABLE %s (ID %d OID %u)",
1574 "TABLE ATTACH %s (ID %d)",
1579 "ATTRDEF %s.%s (ID %d OID %u)",
1582 obj->dumpId, obj->catId.oid);
1586 "INDEX %s (ID %d OID %u)",
1587 obj->name, obj->dumpId, obj->catId.oid);
1591 "INDEX ATTACH %s (ID %d)",
1592 obj->name, obj->dumpId);
1596 "STATISTICS %s (ID %d OID %u)",
1597 obj->name, obj->dumpId, obj->catId.oid);
1601 "REFRESH MATERIALIZED VIEW %s (ID %d OID %u)",
1602 obj->name, obj->dumpId, obj->catId.oid);
1606 "RULE %s (ID %d OID %u)",
1607 obj->name, obj->dumpId, obj->catId.oid);
1611 "TRIGGER %s (ID %d OID %u)",
1612 obj->name, obj->dumpId, obj->catId.oid);
1616 "EVENT TRIGGER %s (ID %d OID %u)",
1617 obj->name, obj->dumpId, obj->catId.oid);
1621 "CONSTRAINT %s (ID %d OID %u)",
1622 obj->name, obj->dumpId, obj->catId.oid);
1626 "FK CONSTRAINT %s (ID %d OID %u)",
1627 obj->name, obj->dumpId, obj->catId.oid);
1631 "PROCEDURAL LANGUAGE %s (ID %d OID %u)",
1632 obj->name, obj->dumpId, obj->catId.oid);
1636 "CAST %u to %u (ID %d OID %u)",
1639 obj->dumpId, obj->catId.oid);
1643 "TRANSFORM %u lang %u (ID %d OID %u)",
1646 obj->dumpId, obj->catId.oid);
1650 "TABLE DATA %s (ID %d OID %u)",
1651 obj->name, obj->dumpId, obj->catId.oid);
1655 "SEQUENCE SET %s (ID %d OID %u)",
1656 obj->name, obj->dumpId, obj->catId.oid);
1660 "DUMMY TYPE %s (ID %d OID %u)",
1661 obj->name, obj->dumpId, obj->catId.oid);
1665 "TEXT SEARCH PARSER %s (ID %d OID %u)",
1666 obj->name, obj->dumpId, obj->catId.oid);
1670 "TEXT SEARCH DICTIONARY %s (ID %d OID %u)",
1671 obj->name, obj->dumpId, obj->catId.oid);
1675 "TEXT SEARCH TEMPLATE %s (ID %d OID %u)",
1676 obj->name, obj->dumpId, obj->catId.oid);
1680 "TEXT SEARCH CONFIGURATION %s (ID %d OID %u)",
1681 obj->name, obj->dumpId, obj->catId.oid);
1685 "FOREIGN DATA WRAPPER %s (ID %d OID %u)",
1686 obj->name, obj->dumpId, obj->catId.oid);
1690 "FOREIGN SERVER %s (ID %d OID %u)",
1691 obj->name, obj->dumpId, obj->catId.oid);
1695 "DEFAULT ACL %s (ID %d OID %u)",
1696 obj->name, obj->dumpId, obj->catId.oid);
1700 "LARGE OBJECT (ID %d OID %u)",
1701 obj->dumpId, obj->catId.oid);
1705 "LARGE OBJECT DATA (ID %d)",
1710 "POLICY (ID %d OID %u)",
1711 obj->dumpId, obj->catId.oid);
1715 "PUBLICATION (ID %d OID %u)",
1716 obj->dumpId, obj->catId.oid);
1720 "PUBLICATION TABLE (ID %d OID %u)",
1721 obj->dumpId, obj->catId.oid);
1725 "PUBLICATION TABLES IN SCHEMA (ID %d OID %u)",
1726 obj->dumpId, obj->catId.oid);
1730 "SUBSCRIPTION (ID %d OID %u)",
1731 obj->dumpId, obj->catId.oid);
1735 "SUBSCRIPTION TABLE (ID %d OID %u)",
1736 obj->dumpId, obj->catId.oid);
1740 "PRE-DATA BOUNDARY (ID %d)",
1745 "POST-DATA BOUNDARY (ID %d)",
1750 "RELATION STATISTICS FOR %s (ID %d OID %u)",
1751 obj->name, obj->dumpId, obj->catId.oid);
1756 "object type %d (ID %d OID %u)",
1765 int ai = (int) (intptr_t)
a;
1766 int bi = (int) (intptr_t)
b;
AccessMethodInfo * findAccessMethodByOid(Oid oid)
void addObjectDependency(DumpableObject *dobj, DumpId refId)
DumpableObject * findObjectByDumpId(DumpId dumpId)
TypeInfo * findTypeByOid(Oid oid)
DumpId getMaxDumpId(void)
void removeObjectDependency(DumpableObject *dobj, DumpId refId)
void binaryheap_build(binaryheap *heap)
void binaryheap_add(binaryheap *heap, bh_node_type d)
bh_node_type binaryheap_remove_first(binaryheap *heap)
void binaryheap_free(binaryheap *heap)
void binaryheap_add_unordered(binaryheap *heap, bh_node_type d)
binaryheap * binaryheap_allocate(int capacity, binaryheap_comparator compare, void *arg)
#define binaryheap_empty(h)
#define ngettext(s, p, n)
static int * beforeConstraints
void * pg_malloc(size_t size)
void * pg_malloc0(size_t size)
Assert(PointerIsAligned(start, uint64))
static int pg_cmp_s32(int32 a, int32 b)
#define pg_log_warning_hint(...)
#define pg_log_warning_detail(...)
#define NUM_DUMPABLE_OBJECT_TYPES
#define DUMP_COMPONENT_DEFINITION
@ DO_PUBLICATION_TABLE_IN_SCHEMA
static int pgTypeNameCompare(Oid typid1, Oid typid2)
static int accessMethodNameCompare(Oid am1, Oid am2)
static void repairMatViewBoundaryMultiLoop(DumpableObject *boundaryobj, DumpableObject *nextobj)
static void repairTableAttrDefLoop(DumpableObject *tableobj, DumpableObject *attrdefobj)
static int findLoop(DumpableObject *obj, DumpId startPoint, bool *processed, DumpId *searchFailed, DumpableObject **workspace, int depth)
static void findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs)
static void repairTableConstraintLoop(DumpableObject *tableobj, DumpableObject *constraintobj)
StaticAssertDecl(lengthof(dbObjectTypePriority)==NUM_DUMPABLE_OBJECT_TYPES, "array length mismatch")
static void repairTableAttrDefMultiLoop(DumpableObject *tableobj, DumpableObject *attrdefobj)
static const int dbObjectTypePriority[]
@ PRIO_STATISTICS_DATA_DATA
@ PRIO_POST_DATA_BOUNDARY
@ PRIO_PUBLICATION_TABLE_IN_SCHEMA
static int DOTypeNameCompare(const void *p1, const void *p2)
static void repairViewRuleMultiLoop(DumpableObject *viewobj, DumpableObject *ruleobj)
static void repairDomainConstraintLoop(DumpableObject *domainobj, DumpableObject *constraintobj)
static void repairTableConstraintMultiLoop(DumpableObject *tableobj, DumpableObject *constraintobj)
void sortDumpableObjects(DumpableObject **objs, int numObjs, DumpId preBoundaryId, DumpId postBoundaryId)
static DumpId preDataBoundId
static void describeDumpableObject(DumpableObject *obj, char *buf, int bufsize)
static void repairTypeFuncLoop(DumpableObject *typeobj, DumpableObject *funcobj)
static void repairDomainConstraintMultiLoop(DumpableObject *domainobj, DumpableObject *constraintobj)
static int int_cmp(void *a, void *b, void *arg)
static void repairIndexLoop(DumpableObject *partedindex, DumpableObject *partindex)
void sortDumpableObjectsByTypeName(DumpableObject **objs, int numObjs)
static void repairViewRuleLoop(DumpableObject *viewobj, DumpableObject *ruleobj)
static void repairFunctionBoundaryMultiLoop(DumpableObject *boundaryobj, DumpableObject *nextobj)
static void repairDependencyLoop(DumpableObject **loop, int nLoop)
static bool TopoSort(DumpableObject **objs, int numObjs, DumpableObject **ordering, int *nOrdering)
static DumpId postDataBoundId
#define pg_log_warning(...)
#define qsort(a, b, c, d)
PublicationInfo * publication
DumpableObjectType objType
struct _shellTypeInfo * shellType