diff options
Diffstat (limited to 'src/backend/catalog/dependency.c')
-rw-r--r-- | src/backend/catalog/dependency.c | 816 |
1 files changed, 1 insertions, 815 deletions
diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index 7b8e0246339..ddf199049ef 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -15,12 +15,10 @@ #include "postgres.h" #include "access/htup_details.h" -#include "access/sysattr.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/heap.h" #include "catalog/index.h" -#include "catalog/namespace.h" #include "catalog/objectaccess.h" #include "catalog/pg_amop.h" #include "catalog/pg_amproc.h" @@ -56,24 +54,18 @@ #include "catalog/pg_type.h" #include "catalog/pg_user_mapping.h" #include "commands/comment.h" -#include "commands/dbcommands.h" #include "commands/defrem.h" #include "commands/event_trigger.h" #include "commands/extension.h" #include "commands/proclang.h" #include "commands/schemacmds.h" #include "commands/seclabel.h" -#include "commands/tablespace.h" #include "commands/trigger.h" #include "commands/typecmds.h" -#include "foreign/foreign.h" -#include "miscadmin.h" #include "nodes/nodeFuncs.h" #include "parser/parsetree.h" #include "rewrite/rewriteRemove.h" #include "storage/lmgr.h" -#include "utils/acl.h" -#include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/guc.h" #include "utils/lsyscache.h" @@ -196,8 +188,6 @@ static bool object_address_present_add_flags(const ObjectAddress *object, static bool stack_address_present_add_flags(const ObjectAddress *object, int flags, ObjectAddressStack *stack); -static void getRelationDescription(StringInfo buffer, Oid relid); -static void getOpFamilyDescription(StringInfo buffer, Oid opfid); /* @@ -2193,7 +2183,7 @@ 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", + elog(ERROR, "invalid non-zero objectSubId for object class %u", object->classId); switch (object->classId) @@ -2297,807 +2287,3 @@ getObjectClass(const ObjectAddress *object) elog(ERROR, "unrecognized object class: %u", object->classId); return OCLASS_CLASS; /* keep compiler quiet */ } - -/* - * getObjectDescription: build an object description for messages - * - * The result is a palloc'd string. - */ -char * -getObjectDescription(const ObjectAddress *object) -{ - StringInfoData buffer; - - initStringInfo(&buffer); - - switch (getObjectClass(object)) - { - case OCLASS_CLASS: - getRelationDescription(&buffer, object->objectId); - if (object->objectSubId != 0) - appendStringInfo(&buffer, _(" column %s"), - get_relid_attribute_name(object->objectId, - object->objectSubId)); - break; - - case OCLASS_PROC: - appendStringInfo(&buffer, _("function %s"), - format_procedure(object->objectId)); - break; - - case OCLASS_TYPE: - appendStringInfo(&buffer, _("type %s"), - format_type_be(object->objectId)); - break; - - case OCLASS_CAST: - { - Relation castDesc; - ScanKeyData skey[1]; - SysScanDesc rcscan; - HeapTuple tup; - Form_pg_cast castForm; - - castDesc = heap_open(CastRelationId, AccessShareLock); - - ScanKeyInit(&skey[0], - ObjectIdAttributeNumber, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - rcscan = systable_beginscan(castDesc, CastOidIndexId, true, - SnapshotNow, 1, skey); - - tup = systable_getnext(rcscan); - - if (!HeapTupleIsValid(tup)) - elog(ERROR, "could not find tuple for cast %u", - object->objectId); - - castForm = (Form_pg_cast) GETSTRUCT(tup); - - appendStringInfo(&buffer, _("cast from %s to %s"), - format_type_be(castForm->castsource), - format_type_be(castForm->casttarget)); - - systable_endscan(rcscan); - heap_close(castDesc, AccessShareLock); - break; - } - - case OCLASS_COLLATION: - { - HeapTuple collTup; - Form_pg_collation coll; - - collTup = SearchSysCache1(COLLOID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(collTup)) - elog(ERROR, "cache lookup failed for collation %u", - object->objectId); - coll = (Form_pg_collation) GETSTRUCT(collTup); - appendStringInfo(&buffer, _("collation %s"), - NameStr(coll->collname)); - ReleaseSysCache(collTup); - break; - } - - case OCLASS_CONSTRAINT: - { - HeapTuple conTup; - Form_pg_constraint con; - - conTup = SearchSysCache1(CONSTROID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(conTup)) - elog(ERROR, "cache lookup failed for constraint %u", - object->objectId); - con = (Form_pg_constraint) GETSTRUCT(conTup); - - if (OidIsValid(con->conrelid)) - { - StringInfoData rel; - - initStringInfo(&rel); - getRelationDescription(&rel, con->conrelid); - appendStringInfo(&buffer, _("constraint %s on %s"), - NameStr(con->conname), rel.data); - pfree(rel.data); - } - else - { - appendStringInfo(&buffer, _("constraint %s"), - NameStr(con->conname)); - } - - ReleaseSysCache(conTup); - break; - } - - case OCLASS_CONVERSION: - { - HeapTuple conTup; - - conTup = SearchSysCache1(CONVOID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(conTup)) - elog(ERROR, "cache lookup failed for conversion %u", - object->objectId); - appendStringInfo(&buffer, _("conversion %s"), - NameStr(((Form_pg_conversion) GETSTRUCT(conTup))->conname)); - ReleaseSysCache(conTup); - break; - } - - case OCLASS_DEFAULT: - { - Relation attrdefDesc; - ScanKeyData skey[1]; - SysScanDesc adscan; - HeapTuple tup; - Form_pg_attrdef attrdef; - ObjectAddress colobject; - - attrdefDesc = heap_open(AttrDefaultRelationId, AccessShareLock); - - ScanKeyInit(&skey[0], - ObjectIdAttributeNumber, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndexId, - true, SnapshotNow, 1, skey); - - tup = systable_getnext(adscan); - - if (!HeapTupleIsValid(tup)) - elog(ERROR, "could not find tuple for attrdef %u", - object->objectId); - - attrdef = (Form_pg_attrdef) GETSTRUCT(tup); - - colobject.classId = RelationRelationId; - colobject.objectId = attrdef->adrelid; - colobject.objectSubId = attrdef->adnum; - - appendStringInfo(&buffer, _("default for %s"), - getObjectDescription(&colobject)); - - systable_endscan(adscan); - heap_close(attrdefDesc, AccessShareLock); - break; - } - - case OCLASS_LANGUAGE: - { - HeapTuple langTup; - - langTup = SearchSysCache1(LANGOID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(langTup)) - elog(ERROR, "cache lookup failed for language %u", - object->objectId); - appendStringInfo(&buffer, _("language %s"), - NameStr(((Form_pg_language) GETSTRUCT(langTup))->lanname)); - ReleaseSysCache(langTup); - break; - } - case OCLASS_LARGEOBJECT: - appendStringInfo(&buffer, _("large object %u"), - object->objectId); - break; - - case OCLASS_OPERATOR: - appendStringInfo(&buffer, _("operator %s"), - format_operator(object->objectId)); - break; - - case OCLASS_OPCLASS: - { - HeapTuple opcTup; - Form_pg_opclass opcForm; - HeapTuple amTup; - Form_pg_am amForm; - char *nspname; - - opcTup = SearchSysCache1(CLAOID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(opcTup)) - elog(ERROR, "cache lookup failed for opclass %u", - object->objectId); - opcForm = (Form_pg_opclass) GETSTRUCT(opcTup); - - amTup = SearchSysCache1(AMOID, - ObjectIdGetDatum(opcForm->opcmethod)); - if (!HeapTupleIsValid(amTup)) - elog(ERROR, "cache lookup failed for access method %u", - opcForm->opcmethod); - amForm = (Form_pg_am) GETSTRUCT(amTup); - - /* Qualify the name if not visible in search path */ - if (OpclassIsVisible(object->objectId)) - nspname = NULL; - else - nspname = get_namespace_name(opcForm->opcnamespace); - - appendStringInfo(&buffer, _("operator class %s for access method %s"), - quote_qualified_identifier(nspname, - NameStr(opcForm->opcname)), - NameStr(amForm->amname)); - - ReleaseSysCache(amTup); - ReleaseSysCache(opcTup); - break; - } - - case OCLASS_OPFAMILY: - getOpFamilyDescription(&buffer, object->objectId); - break; - - case OCLASS_AMOP: - { - Relation amopDesc; - ScanKeyData skey[1]; - SysScanDesc amscan; - HeapTuple tup; - Form_pg_amop amopForm; - StringInfoData opfam; - - amopDesc = heap_open(AccessMethodOperatorRelationId, - AccessShareLock); - - ScanKeyInit(&skey[0], - ObjectIdAttributeNumber, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - amscan = systable_beginscan(amopDesc, AccessMethodOperatorOidIndexId, true, - SnapshotNow, 1, skey); - - tup = systable_getnext(amscan); - - if (!HeapTupleIsValid(tup)) - elog(ERROR, "could not find tuple for amop entry %u", - object->objectId); - - amopForm = (Form_pg_amop) GETSTRUCT(tup); - - initStringInfo(&opfam); - getOpFamilyDescription(&opfam, amopForm->amopfamily); - - /*------ - translator: %d is the operator strategy (a number), the - first two %s's are data type names, the third %s is the - description of the operator family, and the last %s is the - textual form of the operator with arguments. */ - appendStringInfo(&buffer, _("operator %d (%s, %s) of %s: %s"), - amopForm->amopstrategy, - format_type_be(amopForm->amoplefttype), - format_type_be(amopForm->amoprighttype), - opfam.data, - format_operator(amopForm->amopopr)); - - pfree(opfam.data); - - systable_endscan(amscan); - heap_close(amopDesc, AccessShareLock); - break; - } - - case OCLASS_AMPROC: - { - Relation amprocDesc; - ScanKeyData skey[1]; - SysScanDesc amscan; - HeapTuple tup; - Form_pg_amproc amprocForm; - StringInfoData opfam; - - amprocDesc = heap_open(AccessMethodProcedureRelationId, - AccessShareLock); - - ScanKeyInit(&skey[0], - ObjectIdAttributeNumber, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - amscan = systable_beginscan(amprocDesc, AccessMethodProcedureOidIndexId, true, - SnapshotNow, 1, skey); - - tup = systable_getnext(amscan); - - if (!HeapTupleIsValid(tup)) - elog(ERROR, "could not find tuple for amproc entry %u", - object->objectId); - - amprocForm = (Form_pg_amproc) GETSTRUCT(tup); - - initStringInfo(&opfam); - getOpFamilyDescription(&opfam, amprocForm->amprocfamily); - - /*------ - translator: %d is the function number, the first two %s's - are data type names, the third %s is the description of the - operator family, and the last %s is the textual form of the - function with arguments. */ - appendStringInfo(&buffer, _("function %d (%s, %s) of %s: %s"), - amprocForm->amprocnum, - format_type_be(amprocForm->amproclefttype), - format_type_be(amprocForm->amprocrighttype), - opfam.data, - format_procedure(amprocForm->amproc)); - - pfree(opfam.data); - - systable_endscan(amscan); - heap_close(amprocDesc, AccessShareLock); - break; - } - - case OCLASS_REWRITE: - { - Relation ruleDesc; - ScanKeyData skey[1]; - SysScanDesc rcscan; - HeapTuple tup; - Form_pg_rewrite rule; - - ruleDesc = heap_open(RewriteRelationId, AccessShareLock); - - ScanKeyInit(&skey[0], - ObjectIdAttributeNumber, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - rcscan = systable_beginscan(ruleDesc, RewriteOidIndexId, true, - SnapshotNow, 1, skey); - - tup = systable_getnext(rcscan); - - if (!HeapTupleIsValid(tup)) - elog(ERROR, "could not find tuple for rule %u", - object->objectId); - - rule = (Form_pg_rewrite) GETSTRUCT(tup); - - appendStringInfo(&buffer, _("rule %s on "), - NameStr(rule->rulename)); - getRelationDescription(&buffer, rule->ev_class); - - systable_endscan(rcscan); - heap_close(ruleDesc, AccessShareLock); - break; - } - - case OCLASS_TRIGGER: - { - Relation trigDesc; - ScanKeyData skey[1]; - SysScanDesc tgscan; - HeapTuple tup; - Form_pg_trigger trig; - - trigDesc = heap_open(TriggerRelationId, AccessShareLock); - - ScanKeyInit(&skey[0], - ObjectIdAttributeNumber, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - tgscan = systable_beginscan(trigDesc, TriggerOidIndexId, true, - SnapshotNow, 1, skey); - - tup = systable_getnext(tgscan); - - if (!HeapTupleIsValid(tup)) - elog(ERROR, "could not find tuple for trigger %u", - object->objectId); - - trig = (Form_pg_trigger) GETSTRUCT(tup); - - appendStringInfo(&buffer, _("trigger %s on "), - NameStr(trig->tgname)); - getRelationDescription(&buffer, trig->tgrelid); - - systable_endscan(tgscan); - heap_close(trigDesc, AccessShareLock); - break; - } - - case OCLASS_SCHEMA: - { - char *nspname; - - nspname = get_namespace_name(object->objectId); - if (!nspname) - elog(ERROR, "cache lookup failed for namespace %u", - object->objectId); - appendStringInfo(&buffer, _("schema %s"), nspname); - break; - } - - case OCLASS_TSPARSER: - { - HeapTuple tup; - - tup = SearchSysCache1(TSPARSEROID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for text search parser %u", - object->objectId); - appendStringInfo(&buffer, _("text search parser %s"), - NameStr(((Form_pg_ts_parser) GETSTRUCT(tup))->prsname)); - ReleaseSysCache(tup); - break; - } - - case OCLASS_TSDICT: - { - HeapTuple tup; - - tup = SearchSysCache1(TSDICTOID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for text search dictionary %u", - object->objectId); - appendStringInfo(&buffer, _("text search dictionary %s"), - NameStr(((Form_pg_ts_dict) GETSTRUCT(tup))->dictname)); - ReleaseSysCache(tup); - break; - } - - case OCLASS_TSTEMPLATE: - { - HeapTuple tup; - - tup = SearchSysCache1(TSTEMPLATEOID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for text search template %u", - object->objectId); - appendStringInfo(&buffer, _("text search template %s"), - NameStr(((Form_pg_ts_template) GETSTRUCT(tup))->tmplname)); - ReleaseSysCache(tup); - break; - } - - case OCLASS_TSCONFIG: - { - HeapTuple tup; - - tup = SearchSysCache1(TSCONFIGOID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for text search configuration %u", - object->objectId); - appendStringInfo(&buffer, _("text search configuration %s"), - NameStr(((Form_pg_ts_config) GETSTRUCT(tup))->cfgname)); - ReleaseSysCache(tup); - break; - } - - case OCLASS_ROLE: - { - appendStringInfo(&buffer, _("role %s"), - GetUserNameFromId(object->objectId)); - break; - } - - case OCLASS_DATABASE: - { - char *datname; - - datname = get_database_name(object->objectId); - if (!datname) - elog(ERROR, "cache lookup failed for database %u", - object->objectId); - appendStringInfo(&buffer, _("database %s"), datname); - break; - } - - case OCLASS_TBLSPACE: - { - char *tblspace; - - tblspace = get_tablespace_name(object->objectId); - if (!tblspace) - elog(ERROR, "cache lookup failed for tablespace %u", - object->objectId); - appendStringInfo(&buffer, _("tablespace %s"), tblspace); - break; - } - - case OCLASS_FDW: - { - ForeignDataWrapper *fdw; - - fdw = GetForeignDataWrapper(object->objectId); - appendStringInfo(&buffer, _("foreign-data wrapper %s"), fdw->fdwname); - break; - } - - case OCLASS_FOREIGN_SERVER: - { - ForeignServer *srv; - - srv = GetForeignServer(object->objectId); - appendStringInfo(&buffer, _("server %s"), srv->servername); - break; - } - - case OCLASS_USER_MAPPING: - { - HeapTuple tup; - Oid useid; - char *usename; - - tup = SearchSysCache1(USERMAPPINGOID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for user mapping %u", - object->objectId); - - useid = ((Form_pg_user_mapping) GETSTRUCT(tup))->umuser; - - ReleaseSysCache(tup); - - if (OidIsValid(useid)) - usename = GetUserNameFromId(useid); - else - usename = "public"; - - appendStringInfo(&buffer, _("user mapping for %s"), usename); - break; - } - - case OCLASS_DEFACL: - { - Relation defaclrel; - ScanKeyData skey[1]; - SysScanDesc rcscan; - HeapTuple tup; - Form_pg_default_acl defacl; - - defaclrel = heap_open(DefaultAclRelationId, AccessShareLock); - - ScanKeyInit(&skey[0], - ObjectIdAttributeNumber, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(object->objectId)); - - rcscan = systable_beginscan(defaclrel, DefaultAclOidIndexId, - true, SnapshotNow, 1, skey); - - tup = systable_getnext(rcscan); - - if (!HeapTupleIsValid(tup)) - elog(ERROR, "could not find tuple for default ACL %u", - object->objectId); - - defacl = (Form_pg_default_acl) GETSTRUCT(tup); - - switch (defacl->defaclobjtype) - { - case DEFACLOBJ_RELATION: - appendStringInfo(&buffer, - _("default privileges on new relations belonging to role %s"), - GetUserNameFromId(defacl->defaclrole)); - break; - case DEFACLOBJ_SEQUENCE: - appendStringInfo(&buffer, - _("default privileges on new sequences belonging to role %s"), - GetUserNameFromId(defacl->defaclrole)); - break; - case DEFACLOBJ_FUNCTION: - appendStringInfo(&buffer, - _("default privileges on new functions belonging to role %s"), - GetUserNameFromId(defacl->defaclrole)); - break; - case DEFACLOBJ_TYPE: - appendStringInfo(&buffer, - _("default privileges on new types belonging to role %s"), - GetUserNameFromId(defacl->defaclrole)); - break; - default: - /* shouldn't get here */ - appendStringInfo(&buffer, - _("default privileges belonging to role %s"), - GetUserNameFromId(defacl->defaclrole)); - break; - } - - if (OidIsValid(defacl->defaclnamespace)) - { - appendStringInfo(&buffer, - _(" in schema %s"), - get_namespace_name(defacl->defaclnamespace)); - } - - systable_endscan(rcscan); - heap_close(defaclrel, AccessShareLock); - break; - } - - case OCLASS_EXTENSION: - { - char *extname; - - extname = get_extension_name(object->objectId); - if (!extname) - elog(ERROR, "cache lookup failed for extension %u", - object->objectId); - appendStringInfo(&buffer, _("extension %s"), extname); - break; - } - - case OCLASS_EVENT_TRIGGER: - { - HeapTuple tup; - - tup = SearchSysCache1(EVENTTRIGGEROID, - ObjectIdGetDatum(object->objectId)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for event trigger %u", - object->objectId); - appendStringInfo(&buffer, _("event trigger %s"), - NameStr(((Form_pg_event_trigger) GETSTRUCT(tup))->evtname)); - ReleaseSysCache(tup); - break; - } - - default: - appendStringInfo(&buffer, "unrecognized object %u %u %d", - object->classId, - object->objectId, - object->objectSubId); - break; - } - - return buffer.data; -} - -/* - * getObjectDescriptionOids: as above, except the object is specified by Oids - */ -char * -getObjectDescriptionOids(Oid classid, Oid objid) -{ - ObjectAddress address; - - address.classId = classid; - address.objectId = objid; - address.objectSubId = 0; - - return getObjectDescription(&address); -} - -/* - * subroutine for getObjectDescription: describe a relation - */ -static void -getRelationDescription(StringInfo buffer, Oid relid) -{ - HeapTuple relTup; - Form_pg_class relForm; - char *nspname; - char *relname; - - relTup = SearchSysCache1(RELOID, - ObjectIdGetDatum(relid)); - if (!HeapTupleIsValid(relTup)) - elog(ERROR, "cache lookup failed for relation %u", relid); - relForm = (Form_pg_class) GETSTRUCT(relTup); - - /* Qualify the name if not visible in search path */ - if (RelationIsVisible(relid)) - nspname = NULL; - else - nspname = get_namespace_name(relForm->relnamespace); - - relname = quote_qualified_identifier(nspname, NameStr(relForm->relname)); - - switch (relForm->relkind) - { - case RELKIND_RELATION: - appendStringInfo(buffer, _("table %s"), - relname); - break; - case RELKIND_INDEX: - appendStringInfo(buffer, _("index %s"), - relname); - break; - case RELKIND_SEQUENCE: - appendStringInfo(buffer, _("sequence %s"), - relname); - break; - case RELKIND_TOASTVALUE: - appendStringInfo(buffer, _("toast table %s"), - relname); - break; - case RELKIND_VIEW: - appendStringInfo(buffer, _("view %s"), - relname); - break; - case RELKIND_MATVIEW: - appendStringInfo(buffer, _("materialized view %s"), - relname); - break; - case RELKIND_COMPOSITE_TYPE: - appendStringInfo(buffer, _("composite type %s"), - relname); - break; - case RELKIND_FOREIGN_TABLE: - appendStringInfo(buffer, _("foreign table %s"), - relname); - break; - default: - /* shouldn't get here */ - appendStringInfo(buffer, _("relation %s"), - relname); - break; - } - - ReleaseSysCache(relTup); -} - -/* - * subroutine for getObjectDescription: describe an operator family - */ -static void -getOpFamilyDescription(StringInfo buffer, Oid opfid) -{ - HeapTuple opfTup; - Form_pg_opfamily opfForm; - HeapTuple amTup; - Form_pg_am amForm; - char *nspname; - - opfTup = SearchSysCache1(OPFAMILYOID, ObjectIdGetDatum(opfid)); - if (!HeapTupleIsValid(opfTup)) - elog(ERROR, "cache lookup failed for opfamily %u", opfid); - opfForm = (Form_pg_opfamily) GETSTRUCT(opfTup); - - amTup = SearchSysCache1(AMOID, ObjectIdGetDatum(opfForm->opfmethod)); - if (!HeapTupleIsValid(amTup)) - elog(ERROR, "cache lookup failed for access method %u", - opfForm->opfmethod); - amForm = (Form_pg_am) GETSTRUCT(amTup); - - /* Qualify the name if not visible in search path */ - if (OpfamilyIsVisible(opfid)) - nspname = NULL; - else - nspname = get_namespace_name(opfForm->opfnamespace); - - appendStringInfo(buffer, _("operator family %s for access method %s"), - quote_qualified_identifier(nspname, - NameStr(opfForm->opfname)), - NameStr(amForm->amname)); - - 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)); -} |