diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2010-11-18 16:33:48 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2010-11-18 17:06:19 -0300 |
commit | 6cc2deb86e9183262493a6537700ee305fb3e096 (patch) | |
tree | 26c512acccf84e9e7e6ec71594a427c42b83f388 /src | |
parent | 48c348f86ce09c668af7cf271757c3f156f28344 (diff) | |
download | postgresql-6cc2deb86e9183262493a6537700ee305fb3e096.tar.gz postgresql-6cc2deb86e9183262493a6537700ee305fb3e096.zip |
Add pg_describe_object function
This function is useful to obtain textual descriptions of objects as
stored in pg_depend.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/dependency.c | 57 | ||||
-rw-r--r-- | src/include/catalog/catversion.h | 2 | ||||
-rw-r--r-- | src/include/catalog/pg_proc.h | 2 | ||||
-rw-r--r-- | src/include/utils/builtins.h | 3 |
4 files changed, 36 insertions, 28 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)); +} diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index d6b6c71ba5d..e168805ffdd 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 201011151 +#define CATALOG_VERSION_NO 201011181 #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 8e5f50293fe..3e17eff0bf4 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -3333,6 +3333,8 @@ DESCR("view system lock information"); DATA(insert OID = 1065 ( pg_prepared_xact PGNSP PGUID 12 1 1000 0 f f f t t v 0 0 2249 "" "{28,25,1184,26,26}" "{o,o,o,o,o}" "{transaction,gid,prepared,ownerid,dbid}" _null_ pg_prepared_xact _null_ _null_ _null_ )); DESCR("view two-phase transactions"); +DATA(insert OID = 3537 ( pg_describe_object PGNSP PGUID 12 1 0 0 f f f t f s 3 0 25 "26 26 23" _null_ _null_ _null_ _null_ pg_describe_object _null_ _null_ _null_ )); + DATA(insert OID = 2079 ( pg_table_is_visible PGNSP PGUID 12 1 0 0 f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ pg_table_is_visible _null_ _null_ _null_ )); DESCR("is table visible in search path?"); DATA(insert OID = 2080 ( pg_type_is_visible PGNSP PGUID 12 1 0 0 f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ pg_type_is_visible _null_ _null_ _null_ )); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index f4b2a962c81..020ce3ce2ed 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -1045,6 +1045,9 @@ extern Datum window_nth_value(PG_FUNCTION_ARGS); /* access/transam/twophase.c */ extern Datum pg_prepared_xact(PG_FUNCTION_ARGS); +/* catalogs/dependency.c */ +extern Datum pg_describe_object(PG_FUNCTION_ARGS); + /* commands/constraint.c */ extern Datum unique_key_recheck(PG_FUNCTION_ARGS); |