aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2010-11-18 16:33:48 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2010-11-18 17:06:19 -0300
commit6cc2deb86e9183262493a6537700ee305fb3e096 (patch)
tree26c512acccf84e9e7e6ec71594a427c42b83f388 /src
parent48c348f86ce09c668af7cf271757c3f156f28344 (diff)
downloadpostgresql-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.c57
-rw-r--r--src/include/catalog/catversion.h2
-rw-r--r--src/include/catalog/pg_proc.h2
-rw-r--r--src/include/utils/builtins.h3
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);