📄 pg_dump_sort.c
字号:
/* mark attrdef as needing its own dump */ ((AttrDefInfo *) attrdefobj)->separate = true; /* put back attrdef's dependency on table */ addObjectDependency(attrdefobj, tableobj->dumpId);}/* * CHECK constraints on domains work just like those on tables ... */static voidrepairDomainConstraintLoop(DumpableObject *domainobj, DumpableObject *constraintobj){ /* remove constraint's dependency on domain */ removeObjectDependency(constraintobj, domainobj->dumpId);}static voidrepairDomainConstraintMultiLoop(DumpableObject *domainobj, DumpableObject *constraintobj){ /* remove domain's dependency on constraint */ removeObjectDependency(domainobj, constraintobj->dumpId); /* mark constraint as needing its own dump */ ((ConstraintInfo *) constraintobj)->separate = true; /* put back constraint's dependency on domain */ addObjectDependency(constraintobj, domainobj->dumpId);}/* * Fix a dependency loop, or die trying ... * * This routine is mainly concerned with reducing the multiple ways that * a loop might appear to common cases, which it passes off to the * "fixer" routines above. */static voidrepairDependencyLoop(DumpableObject **loop, int nLoop){ int i, j; /* Datatype and one of its I/O functions */ if (nLoop == 2 && loop[0]->objType == DO_TYPE && loop[1]->objType == DO_FUNC) { repairTypeFuncLoop(loop[0], loop[1]); return; } if (nLoop == 2 && loop[1]->objType == DO_TYPE && loop[0]->objType == DO_FUNC) { repairTypeFuncLoop(loop[1], loop[0]); return; } /* View and its ON SELECT rule */ if (nLoop == 2 && loop[0]->objType == DO_TABLE && loop[1]->objType == DO_RULE && ((RuleInfo *) loop[1])->ev_type == '1' && ((RuleInfo *) loop[1])->is_instead && ((RuleInfo *) loop[1])->ruletable == (TableInfo *) loop[0]) { repairViewRuleLoop(loop[0], loop[1]); return; } if (nLoop == 2 && loop[1]->objType == DO_TABLE && loop[0]->objType == DO_RULE && ((RuleInfo *) loop[0])->ev_type == '1' && ((RuleInfo *) loop[0])->is_instead && ((RuleInfo *) loop[0])->ruletable == (TableInfo *) loop[1]) { repairViewRuleLoop(loop[1], loop[0]); return; } /* Indirect loop involving view and ON SELECT rule */ if (nLoop > 2) { for (i = 0; i < nLoop; i++) { if (loop[i]->objType == DO_TABLE) { for (j = 0; j < nLoop; j++) { if (loop[j]->objType == DO_RULE && ((RuleInfo *) loop[j])->ev_type == '1' && ((RuleInfo *) loop[j])->is_instead && ((RuleInfo *) loop[j])->ruletable == (TableInfo *) loop[i]) { repairViewRuleMultiLoop(loop[i], loop[j]); return; } } } } } /* Table and CHECK constraint */ if (nLoop == 2 && loop[0]->objType == DO_TABLE && loop[1]->objType == DO_CONSTRAINT && ((ConstraintInfo *) loop[1])->contype == 'c' && ((ConstraintInfo *) loop[1])->contable == (TableInfo *) loop[0]) { repairTableConstraintLoop(loop[0], loop[1]); return; } if (nLoop == 2 && loop[1]->objType == DO_TABLE && loop[0]->objType == DO_CONSTRAINT && ((ConstraintInfo *) loop[0])->contype == 'c' && ((ConstraintInfo *) loop[0])->contable == (TableInfo *) loop[1]) { repairTableConstraintLoop(loop[1], loop[0]); return; } /* Indirect loop involving table and CHECK constraint */ if (nLoop > 2) { for (i = 0; i < nLoop; i++) { if (loop[i]->objType == DO_TABLE) { for (j = 0; j < nLoop; j++) { if (loop[j]->objType == DO_CONSTRAINT && ((ConstraintInfo *) loop[j])->contype == 'c' && ((ConstraintInfo *) loop[j])->contable == (TableInfo *) loop[i]) { repairTableConstraintMultiLoop(loop[i], loop[j]); return; } } } } } /* Table and attribute default */ if (nLoop == 2 && loop[0]->objType == DO_TABLE && loop[1]->objType == DO_ATTRDEF && ((AttrDefInfo *) loop[1])->adtable == (TableInfo *) loop[0]) { repairTableAttrDefLoop(loop[0], loop[1]); return; } if (nLoop == 2 && loop[1]->objType == DO_TABLE && loop[0]->objType == DO_ATTRDEF && ((AttrDefInfo *) loop[0])->adtable == (TableInfo *) loop[1]) { repairTableAttrDefLoop(loop[1], loop[0]); return; } /* Indirect loop involving table and attribute default */ if (nLoop > 2) { for (i = 0; i < nLoop; i++) { if (loop[i]->objType == DO_TABLE) { for (j = 0; j < nLoop; j++) { if (loop[j]->objType == DO_ATTRDEF && ((AttrDefInfo *) loop[j])->adtable == (TableInfo *) loop[i]) { repairTableAttrDefMultiLoop(loop[i], loop[j]); return; } } } } } /* Domain and CHECK constraint */ if (nLoop == 2 && loop[0]->objType == DO_TYPE && loop[1]->objType == DO_CONSTRAINT && ((ConstraintInfo *) loop[1])->contype == 'c' && ((ConstraintInfo *) loop[1])->condomain == (TypeInfo *) loop[0]) { repairDomainConstraintLoop(loop[0], loop[1]); return; } if (nLoop == 2 && loop[1]->objType == DO_TYPE && loop[0]->objType == DO_CONSTRAINT && ((ConstraintInfo *) loop[0])->contype == 'c' && ((ConstraintInfo *) loop[0])->condomain == (TypeInfo *) loop[1]) { repairDomainConstraintLoop(loop[1], loop[0]); return; } /* Indirect loop involving domain and CHECK constraint */ if (nLoop > 2) { for (i = 0; i < nLoop; i++) { if (loop[i]->objType == DO_TYPE) { for (j = 0; j < nLoop; j++) { if (loop[j]->objType == DO_CONSTRAINT && ((ConstraintInfo *) loop[j])->contype == 'c' && ((ConstraintInfo *) loop[j])->condomain == (TypeInfo *) loop[i]) { repairDomainConstraintMultiLoop(loop[i], loop[j]); return; } } } } } /* * If we can't find a principled way to break the loop, complain and break * it in an arbitrary fashion. */ write_msg(modulename, "WARNING: could not resolve dependency loop among these items:\n"); for (i = 0; i < nLoop; i++) { char buf[1024]; describeDumpableObject(loop[i], buf, sizeof(buf)); write_msg(modulename, " %s\n", buf); } removeObjectDependency(loop[0], loop[1]->dumpId);}/* * Describe a dumpable object usefully for errors * * This should probably go somewhere else... */static voiddescribeDumpableObject(DumpableObject *obj, char *buf, int bufsize){ switch (obj->objType) { case DO_NAMESPACE: snprintf(buf, bufsize, "SCHEMA %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_TYPE: snprintf(buf, bufsize, "TYPE %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_FUNC: snprintf(buf, bufsize, "FUNCTION %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_AGG: snprintf(buf, bufsize, "AGGREGATE %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_OPERATOR: snprintf(buf, bufsize, "OPERATOR %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_OPCLASS: snprintf(buf, bufsize, "OPERATOR CLASS %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_CONVERSION: snprintf(buf, bufsize, "CONVERSION %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_TABLE: snprintf(buf, bufsize, "TABLE %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_ATTRDEF: snprintf(buf, bufsize, "ATTRDEF %s.%s (ID %d OID %u)", ((AttrDefInfo *) obj)->adtable->dobj.name, ((AttrDefInfo *) obj)->adtable->attnames[((AttrDefInfo *) obj)->adnum - 1], obj->dumpId, obj->catId.oid); return; case DO_INDEX: snprintf(buf, bufsize, "INDEX %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_RULE: snprintf(buf, bufsize, "RULE %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_TRIGGER: snprintf(buf, bufsize, "TRIGGER %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_CONSTRAINT: snprintf(buf, bufsize, "CONSTRAINT %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_FK_CONSTRAINT: snprintf(buf, bufsize, "FK CONSTRAINT %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_PROCLANG: snprintf(buf, bufsize, "PROCEDURAL LANGUAGE %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_CAST: snprintf(buf, bufsize, "CAST %u to %u (ID %d OID %u)", ((CastInfo *) obj)->castsource, ((CastInfo *) obj)->casttarget, obj->dumpId, obj->catId.oid); return; case DO_TABLE_DATA: snprintf(buf, bufsize, "TABLE DATA %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_TABLE_TYPE: snprintf(buf, bufsize, "TABLE TYPE %s (ID %d OID %u)", obj->name, obj->dumpId, obj->catId.oid); return; case DO_BLOBS: snprintf(buf, bufsize, "BLOBS (ID %d)", obj->dumpId); return; case DO_BLOB_COMMENTS: snprintf(buf, bufsize, "BLOB COMMENTS (ID %d)", obj->dumpId); return; } /* shouldn't get here */ snprintf(buf, bufsize, "object type %d (ID %d OID %u)", (int) obj->objType, obj->dumpId, obj->catId.oid);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -