18 #include "catalog/pg_class_d.h"
153 "array length mismatch");
216 cmpval = strcmp(obj1->namespace->dobj.
name,
217 obj2->namespace->dobj.
name);
224 else if (obj2->namespace)
228 cmpval = strcmp(obj1->
name, obj2->
name);
248 if (argtype1 && argtype2)
250 if (argtype1->
dobj.namespace && argtype2->
dobj.namespace)
252 cmpval = strcmp(argtype1->
dobj.namespace->dobj.
name,
253 argtype2->
dobj.namespace->dobj.
name);
336 while (!
TopoSort(objs, numObjs, ordering, &nOrdering))
399 *nOrdering = numObjs;
406 pendingHeap = (
int *)
pg_malloc(numObjs *
sizeof(
int));
416 idMap = (
int *)
pg_malloc((maxDumpId + 1) *
sizeof(int));
417 for (
i = 0;
i < numObjs;
i++)
421 if (j <= 0 || j > maxDumpId)
427 if (k <= 0 || k > maxDumpId)
428 pg_fatal(
"invalid dependency %d", k);
445 for (
i = numObjs; --
i >= 0;)
448 pendingHeap[heapLength++] =
i;
467 while (heapLength > 0)
475 for (k = 0; k < obj->
nDeps; k++)
491 for (
j = 1;
j <= maxDumpId;
j++)
494 ordering[k++] = objs[idMap[
j]];
525 int i = (
j - 1) >> 1;
547 int result = heap[0];
551 if (--heapLength <= 0)
553 val = heap[heapLength];
561 if (
j + 1 < heapLength &&
562 heap[
j] < heap[
j + 1])
625 for (
i = 0;
i < nObjs;
i++)
644 for (
j = 0;
j < looplen;
j++)
645 processed[workspace[
j]->dumpId] =
true;
655 processed[obj->
dumpId] =
true;
661 pg_fatal(
"could not identify dependency loop");
699 if (processed[obj->
dumpId])
706 if (searchFailed[obj->
dumpId] == startPoint)
715 for (
i = 0;
i < depth;
i++)
717 if (workspace[
i] == obj)
724 workspace[depth++] = obj;
758 searchFailed[obj->
dumpId] = startPoint;
866 if (nextinfo->
relkind == RELKIND_MATVIEW)
997 (((
TableInfo *) loop[0])->relkind == RELKIND_VIEW ||
998 ((
TableInfo *) loop[0])->relkind == RELKIND_MATVIEW) &&
999 ((
RuleInfo *) loop[1])->ev_type ==
'1' &&
1000 ((
RuleInfo *) loop[1])->is_instead &&
1008 loop[0]->objType ==
DO_RULE &&
1009 (((
TableInfo *) loop[1])->relkind == RELKIND_VIEW ||
1010 ((
TableInfo *) loop[1])->relkind == RELKIND_MATVIEW) &&
1011 ((
RuleInfo *) loop[0])->ev_type ==
'1' &&
1012 ((
RuleInfo *) loop[0])->is_instead &&
1022 for (
i = 0;
i < nLoop;
i++)
1025 ((
TableInfo *) loop[
i])->relkind == RELKIND_VIEW)
1027 for (
j = 0;
j < nLoop;
j++)
1030 ((
RuleInfo *) loop[
j])->ev_type ==
'1' &&
1045 for (
i = 0;
i < nLoop;
i++)
1048 ((
TableInfo *) loop[
i])->relkind == RELKIND_MATVIEW)
1050 for (
j = 0;
j < nLoop;
j++)
1056 nextobj = (
j < nLoop - 1) ? loop[
j + 1] : loop[0];
1088 for (
i = 0;
i < nLoop;
i++)
1092 for (
j = 0;
j < nLoop;
j++)
1129 if (((
IndxInfo *) loop[0])->parentidx == loop[1]->catId.oid)
1134 else if (((
IndxInfo *) loop[1])->parentidx == loop[0]->catId.oid)
1144 for (
i = 0;
i < nLoop;
i++)
1148 for (
j = 0;
j < nLoop;
j++)
1163 loop[0]->objType ==
DO_TYPE &&
1172 loop[1]->objType ==
DO_TYPE &&
1184 for (
i = 0;
i < nLoop;
i++)
1188 for (
j = 0;
j < nLoop;
j++)
1225 for (
i = 0;
i < nLoop;
i++)
1233 "there are circular foreign-key constraints among these tables:",
1235 for (
i = 0;
i < nLoop;
i++)
1237 pg_log_info(
"You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.");
1238 pg_log_info(
"Consider using a full dump instead of a --data-only dump to avoid this problem.");
1250 pg_log_warning(
"could not resolve dependency loop among these items:");
1251 for (
i = 0;
i < nLoop;
i++)
1277 "SCHEMA %s (ID %d OID %u)",
1282 "EXTENSION %s (ID %d OID %u)",
1287 "TYPE %s (ID %d OID %u)",
1292 "SHELL TYPE %s (ID %d OID %u)",
1297 "FUNCTION %s (ID %d OID %u)",
1302 "AGGREGATE %s (ID %d OID %u)",
1307 "OPERATOR %s (ID %d OID %u)",
1312 "ACCESS METHOD %s (ID %d OID %u)",
1317 "OPERATOR CLASS %s (ID %d OID %u)",
1322 "OPERATOR FAMILY %s (ID %d OID %u)",
1327 "COLLATION %s (ID %d OID %u)",
1332 "CONVERSION %s (ID %d OID %u)",
1337 "TABLE %s (ID %d OID %u)",
1342 "TABLE ATTACH %s (ID %d)",
1347 "ATTRDEF %s.%s (ID %d OID %u)",
1350 obj->dumpId, obj->catId.oid);
1354 "INDEX %s (ID %d OID %u)",
1355 obj->name, obj->dumpId, obj->catId.oid);
1359 "INDEX ATTACH %s (ID %d)",
1360 obj->name, obj->dumpId);
1364 "STATISTICS %s (ID %d OID %u)",
1365 obj->name, obj->dumpId, obj->catId.oid);
1369 "REFRESH MATERIALIZED VIEW %s (ID %d OID %u)",
1370 obj->name, obj->dumpId, obj->catId.oid);
1374 "RULE %s (ID %d OID %u)",
1375 obj->name, obj->dumpId, obj->catId.oid);
1379 "TRIGGER %s (ID %d OID %u)",
1380 obj->name, obj->dumpId, obj->catId.oid);
1384 "EVENT TRIGGER %s (ID %d OID %u)",
1385 obj->name, obj->dumpId, obj->catId.oid);
1389 "CONSTRAINT %s (ID %d OID %u)",
1390 obj->name, obj->dumpId, obj->catId.oid);
1394 "FK CONSTRAINT %s (ID %d OID %u)",
1395 obj->name, obj->dumpId, obj->catId.oid);
1399 "PROCEDURAL LANGUAGE %s (ID %d OID %u)",
1400 obj->name, obj->dumpId, obj->catId.oid);
1404 "CAST %u to %u (ID %d OID %u)",
1407 obj->dumpId, obj->catId.oid);
1411 "TRANSFORM %u lang %u (ID %d OID %u)",
1414 obj->dumpId, obj->catId.oid);
1418 "TABLE DATA %s (ID %d OID %u)",
1419 obj->name, obj->dumpId, obj->catId.oid);
1423 "SEQUENCE SET %s (ID %d OID %u)",
1424 obj->name, obj->dumpId, obj->catId.oid);
1428 "DUMMY TYPE %s (ID %d OID %u)",
1429 obj->name, obj->dumpId, obj->catId.oid);
1433 "TEXT SEARCH PARSER %s (ID %d OID %u)",
1434 obj->name, obj->dumpId, obj->catId.oid);
1438 "TEXT SEARCH DICTIONARY %s (ID %d OID %u)",
1439 obj->name, obj->dumpId, obj->catId.oid);
1443 "TEXT SEARCH TEMPLATE %s (ID %d OID %u)",
1444 obj->name, obj->dumpId, obj->catId.oid);
1448 "TEXT SEARCH CONFIGURATION %s (ID %d OID %u)",
1449 obj->name, obj->dumpId, obj->catId.oid);
1453 "FOREIGN DATA WRAPPER %s (ID %d OID %u)",
1454 obj->name, obj->dumpId, obj->catId.oid);
1458 "FOREIGN SERVER %s (ID %d OID %u)",
1459 obj->name, obj->dumpId, obj->catId.oid);
1463 "DEFAULT ACL %s (ID %d OID %u)",
1464 obj->name, obj->dumpId, obj->catId.oid);
1468 "LARGE OBJECT (ID %d OID %u)",
1469 obj->dumpId, obj->catId.oid);
1473 "LARGE OBJECT DATA (ID %d)",
1478 "POLICY (ID %d OID %u)",
1479 obj->dumpId, obj->catId.oid);
1483 "PUBLICATION (ID %d OID %u)",
1484 obj->dumpId, obj->catId.oid);
1488 "PUBLICATION TABLE (ID %d OID %u)",
1489 obj->dumpId, obj->catId.oid);
1493 "PUBLICATION TABLES IN SCHEMA (ID %d OID %u)",
1494 obj->dumpId, obj->catId.oid);
1498 "SUBSCRIPTION (ID %d OID %u)",
1499 obj->dumpId, obj->catId.oid);
1503 "PRE-DATA BOUNDARY (ID %d)",
1508 "POST-DATA BOUNDARY (ID %d)",
1514 "object type %d (ID %d OID %u)",
void addObjectDependency(DumpableObject *dobj, DumpId refId)
DumpableObject * findObjectByDumpId(DumpId dumpId)
DumpId getMaxDumpId(void)
TypeInfo * findTypeByOid(Oid oid)
void removeObjectDependency(DumpableObject *dobj, DumpId refId)
#define ngettext(s, p, n)
static void PGresult const char * p2
static int * beforeConstraints
void * pg_malloc0(size_t size)
void * pg_malloc(size_t size)
#define DUMP_COMPONENT_DEFINITION
@ DO_PUBLICATION_TABLE_IN_SCHEMA
static int removeHeapElement(int *heap, int heapLength)
static void repairMatViewBoundaryMultiLoop(DumpableObject *boundaryobj, DumpableObject *nextobj)
static void addHeapElement(int val, int *heap, int heapLength)
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)
StaticAssertDecl(lengthof(dbObjectTypePriority)==(DO_SUBSCRIPTION+1), "array length mismatch")
static void repairTableConstraintLoop(DumpableObject *tableobj, DumpableObject *constraintobj)
static void repairTableAttrDefMultiLoop(DumpableObject *tableobj, DumpableObject *attrdefobj)
static const int dbObjectTypePriority[]
@ 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 void repairIndexLoop(DumpableObject *partedindex, DumpableObject *partindex)
void sortDumpableObjectsByTypeName(DumpableObject **objs, int numObjs)
static void repairViewRuleLoop(DumpableObject *viewobj, DumpableObject *ruleobj)
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)
DumpableObjectType objType
struct _shellTypeInfo * shellType