18#include "catalog/pg_class_d.h"
158 "array length mismatch");
223 obj2->namespace->dobj.name);
230 else if (
obj2->namespace)
362 pobj2->poltable->dobj.name);
373 robj2->ruletable->dobj.name);
384 tobj2->tgtable->dobj.name);
398 if (
robj1->condomain)
400 if (
robj2->condomain)
404 robj2->condomain->dobj.name);
411 else if (
robj2->condomain)
417 robj2->contable->dobj.name);
442 probj2->publication->dobj.name);
453 psobj2->publication->dobj.name);
464 srobj2->subinfo->dobj.name);
520 typobj2->dobj.namespace->dobj.name);
667 pg_fatal(
"invalid dependency %d", k);
711 for (k = 0; k < obj->
nDeps; k++)
727 for (
j = 1;
j <= maxDumpId;
j++)
815 processed[workspace[
j]->dumpId] =
true;
825 processed[obj->
dumpId] =
true;
831 pg_fatal(
"could not identify dependency loop");
869 if (processed[obj->
dumpId])
885 for (
i = 0;
i < depth;
i++)
887 if (workspace[
i] == obj)
894 workspace[depth++] = obj;
1476 "there are circular foreign-key constraints among these tables:",
1480 pg_log_warning_hint(
"You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.");
1481 pg_log_warning_hint(
"Consider using a full dump instead of a --data-only dump to avoid this problem.");
1493 pg_log_warning(
"could not resolve dependency loop among these items:");
1520 "SCHEMA %s (ID %d OID %u)",
1525 "EXTENSION %s (ID %d OID %u)",
1530 "TYPE %s (ID %d OID %u)",
1535 "SHELL TYPE %s (ID %d OID %u)",
1540 "FUNCTION %s (ID %d OID %u)",
1545 "AGGREGATE %s (ID %d OID %u)",
1550 "OPERATOR %s (ID %d OID %u)",
1555 "ACCESS METHOD %s (ID %d OID %u)",
1560 "OPERATOR CLASS %s (ID %d OID %u)",
1565 "OPERATOR FAMILY %s (ID %d OID %u)",
1570 "COLLATION %s (ID %d OID %u)",
1575 "CONVERSION %s (ID %d OID %u)",
1580 "TABLE %s (ID %d OID %u)",
1585 "TABLE ATTACH %s (ID %d)",
1590 "ATTRDEF %s.%s (ID %d OID %u)",
1593 obj->dumpId, obj->catId.oid);
1597 "INDEX %s (ID %d OID %u)",
1598 obj->name, obj->dumpId, obj->catId.oid);
1602 "INDEX ATTACH %s (ID %d)",
1603 obj->name, obj->dumpId);
1607 "STATISTICS %s (ID %d OID %u)",
1608 obj->name, obj->dumpId, obj->catId.oid);
1612 "REFRESH MATERIALIZED VIEW %s (ID %d OID %u)",
1613 obj->name, obj->dumpId, obj->catId.oid);
1617 "RULE %s (ID %d OID %u)",
1618 obj->name, obj->dumpId, obj->catId.oid);
1622 "TRIGGER %s (ID %d OID %u)",
1623 obj->name, obj->dumpId, obj->catId.oid);
1627 "EVENT TRIGGER %s (ID %d OID %u)",
1628 obj->name, obj->dumpId, obj->catId.oid);
1632 "CONSTRAINT %s (ID %d OID %u)",
1633 obj->name, obj->dumpId, obj->catId.oid);
1637 "FK CONSTRAINT %s (ID %d OID %u)",
1638 obj->name, obj->dumpId, obj->catId.oid);
1642 "PROCEDURAL LANGUAGE %s (ID %d OID %u)",
1643 obj->name, obj->dumpId, obj->catId.oid);
1647 "CAST %u to %u (ID %d OID %u)",
1650 obj->dumpId, obj->catId.oid);
1654 "TRANSFORM %u lang %u (ID %d OID %u)",
1657 obj->dumpId, obj->catId.oid);
1661 "TABLE DATA %s (ID %d OID %u)",
1662 obj->name, obj->dumpId, obj->catId.oid);
1666 "SEQUENCE SET %s (ID %d OID %u)",
1667 obj->name, obj->dumpId, obj->catId.oid);
1671 "DUMMY TYPE %s (ID %d OID %u)",
1672 obj->name, obj->dumpId, obj->catId.oid);
1676 "TEXT SEARCH PARSER %s (ID %d OID %u)",
1677 obj->name, obj->dumpId, obj->catId.oid);
1681 "TEXT SEARCH DICTIONARY %s (ID %d OID %u)",
1682 obj->name, obj->dumpId, obj->catId.oid);
1686 "TEXT SEARCH TEMPLATE %s (ID %d OID %u)",
1687 obj->name, obj->dumpId, obj->catId.oid);
1691 "TEXT SEARCH CONFIGURATION %s (ID %d OID %u)",
1692 obj->name, obj->dumpId, obj->catId.oid);
1696 "FOREIGN DATA WRAPPER %s (ID %d OID %u)",
1697 obj->name, obj->dumpId, obj->catId.oid);
1701 "FOREIGN SERVER %s (ID %d OID %u)",
1702 obj->name, obj->dumpId, obj->catId.oid);
1706 "DEFAULT ACL %s (ID %d OID %u)",
1707 obj->name, obj->dumpId, obj->catId.oid);
1711 "LARGE OBJECT (ID %d OID %u)",
1712 obj->dumpId, obj->catId.oid);
1716 "LARGE OBJECT DATA (ID %d)",
1721 "POLICY (ID %d OID %u)",
1722 obj->dumpId, obj->catId.oid);
1726 "PUBLICATION (ID %d OID %u)",
1727 obj->dumpId, obj->catId.oid);
1731 "PUBLICATION TABLE (ID %d OID %u)",
1732 obj->dumpId, obj->catId.oid);
1736 "PUBLICATION TABLES IN SCHEMA (ID %d OID %u)",
1737 obj->dumpId, obj->catId.oid);
1741 "SUBSCRIPTION (ID %d OID %u)",
1742 obj->dumpId, obj->catId.oid);
1746 "SUBSCRIPTION TABLE (ID %d OID %u)",
1747 obj->dumpId, obj->catId.oid);
1751 "PRE-DATA BOUNDARY (ID %d)",
1756 "POST-DATA BOUNDARY (ID %d)",
1761 "RELATION STATISTICS FOR %s (ID %d OID %u)",
1762 obj->name, obj->dumpId, obj->catId.oid);
1767 "object type %d (ID %d OID %u)",
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)
#define Assert(condition)
#define StaticAssertDecl(condition, errmessage)
static int * beforeConstraints
void * pg_malloc(size_t size)
void * pg_malloc0(size_t size)
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)
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
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define pg_log_warning(...)
#define qsort(a, b, c, d)
DumpableObjectType objType