diff options
Diffstat (limited to 'src/backend/catalog/dependency.c')
-rw-r--r-- | src/backend/catalog/dependency.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index bb14a438b0a..c4ccb5fb2aa 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -1982,6 +1982,12 @@ free_object_addresses(ObjectAddresses *addrs) ObjectClass getObjectClass(const ObjectAddress *object) { + /* only pg_class entries can have nonzero objectSubId */ + if (object->classId != RelationRelationId && + object->objectSubId != 0) + elog(ERROR, "invalid objectSubId 0 for object class %u", + object->classId); + switch (object->classId) { case RelationRelationId: @@ -1989,111 +1995,84 @@ getObjectClass(const ObjectAddress *object) return OCLASS_CLASS; case ProcedureRelationId: - Assert(object->objectSubId == 0); return OCLASS_PROC; case TypeRelationId: - Assert(object->objectSubId == 0); return OCLASS_TYPE; case CastRelationId: - Assert(object->objectSubId == 0); return OCLASS_CAST; case ConstraintRelationId: - Assert(object->objectSubId == 0); return OCLASS_CONSTRAINT; case ConversionRelationId: - Assert(object->objectSubId == 0); return OCLASS_CONVERSION; case AttrDefaultRelationId: - Assert(object->objectSubId == 0); return OCLASS_DEFAULT; case LanguageRelationId: - Assert(object->objectSubId == 0); return OCLASS_LANGUAGE; case LargeObjectRelationId: - Assert(object->objectSubId == 0); return OCLASS_LARGEOBJECT; case OperatorRelationId: - Assert(object->objectSubId == 0); return OCLASS_OPERATOR; case OperatorClassRelationId: - Assert(object->objectSubId == 0); return OCLASS_OPCLASS; case OperatorFamilyRelationId: - Assert(object->objectSubId == 0); return OCLASS_OPFAMILY; case AccessMethodOperatorRelationId: - Assert(object->objectSubId == 0); return OCLASS_AMOP; case AccessMethodProcedureRelationId: - Assert(object->objectSubId == 0); return OCLASS_AMPROC; case RewriteRelationId: - Assert(object->objectSubId == 0); return OCLASS_REWRITE; case TriggerRelationId: - Assert(object->objectSubId == 0); return OCLASS_TRIGGER; case NamespaceRelationId: - Assert(object->objectSubId == 0); return OCLASS_SCHEMA; case TSParserRelationId: - Assert(object->objectSubId == 0); return OCLASS_TSPARSER; case TSDictionaryRelationId: - Assert(object->objectSubId == 0); return OCLASS_TSDICT; case TSTemplateRelationId: - Assert(object->objectSubId == 0); return OCLASS_TSTEMPLATE; case TSConfigRelationId: - Assert(object->objectSubId == 0); return OCLASS_TSCONFIG; case AuthIdRelationId: - Assert(object->objectSubId == 0); return OCLASS_ROLE; case DatabaseRelationId: - Assert(object->objectSubId == 0); return OCLASS_DATABASE; case TableSpaceRelationId: - Assert(object->objectSubId == 0); return OCLASS_TBLSPACE; case ForeignDataWrapperRelationId: - Assert(object->objectSubId == 0); return OCLASS_FDW; case ForeignServerRelationId: - Assert(object->objectSubId == 0); return OCLASS_FOREIGN_SERVER; case UserMappingRelationId: - Assert(object->objectSubId == 0); return OCLASS_USER_MAPPING; case DefaultAclRelationId: - Assert(object->objectSubId == 0); return OCLASS_DEFACL; } @@ -2807,3 +2786,27 @@ getOpFamilyDescription(StringInfo buffer, Oid opfid) ReleaseSysCache(amTup); ReleaseSysCache(opfTup); } + +/* + * SQL-level callable version of getObjectDescription + */ +Datum +pg_describe_object(PG_FUNCTION_ARGS) +{ + Oid classid = PG_GETARG_OID(0); + Oid objid = PG_GETARG_OID(1); + int32 subobjid = PG_GETARG_INT32(2); + char *description = NULL; + ObjectAddress address; + + /* for "pinned" items in pg_depend, return null */ + if (!OidIsValid(classid) && !OidIsValid(objid)) + PG_RETURN_NULL(); + + address.classId = classid; + address.objectId = objid; + address.objectSubId = subobjid; + + description = getObjectDescription(&address); + PG_RETURN_TEXT_P(cstring_to_text(description)); +} |