@@ -1982,118 +1982,97 @@ free_object_addresses(ObjectAddresses *addrs)
1982
1982
ObjectClass
1983
1983
getObjectClass (const ObjectAddress * object )
1984
1984
{
1985
+ /* only pg_class entries can have nonzero objectSubId */
1986
+ if (object -> classId != RelationRelationId &&
1987
+ object -> objectSubId != 0 )
1988
+ elog (ERROR , "invalid objectSubId 0 for object class %u" ,
1989
+ object -> classId );
1990
+
1985
1991
switch (object -> classId )
1986
1992
{
1987
1993
case RelationRelationId :
1988
1994
/* caller must check objectSubId */
1989
1995
return OCLASS_CLASS ;
1990
1996
1991
1997
case ProcedureRelationId :
1992
- Assert (object -> objectSubId == 0 );
1993
1998
return OCLASS_PROC ;
1994
1999
1995
2000
case TypeRelationId :
1996
- Assert (object -> objectSubId == 0 );
1997
2001
return OCLASS_TYPE ;
1998
2002
1999
2003
case CastRelationId :
2000
- Assert (object -> objectSubId == 0 );
2001
2004
return OCLASS_CAST ;
2002
2005
2003
2006
case ConstraintRelationId :
2004
- Assert (object -> objectSubId == 0 );
2005
2007
return OCLASS_CONSTRAINT ;
2006
2008
2007
2009
case ConversionRelationId :
2008
- Assert (object -> objectSubId == 0 );
2009
2010
return OCLASS_CONVERSION ;
2010
2011
2011
2012
case AttrDefaultRelationId :
2012
- Assert (object -> objectSubId == 0 );
2013
2013
return OCLASS_DEFAULT ;
2014
2014
2015
2015
case LanguageRelationId :
2016
- Assert (object -> objectSubId == 0 );
2017
2016
return OCLASS_LANGUAGE ;
2018
2017
2019
2018
case LargeObjectRelationId :
2020
- Assert (object -> objectSubId == 0 );
2021
2019
return OCLASS_LARGEOBJECT ;
2022
2020
2023
2021
case OperatorRelationId :
2024
- Assert (object -> objectSubId == 0 );
2025
2022
return OCLASS_OPERATOR ;
2026
2023
2027
2024
case OperatorClassRelationId :
2028
- Assert (object -> objectSubId == 0 );
2029
2025
return OCLASS_OPCLASS ;
2030
2026
2031
2027
case OperatorFamilyRelationId :
2032
- Assert (object -> objectSubId == 0 );
2033
2028
return OCLASS_OPFAMILY ;
2034
2029
2035
2030
case AccessMethodOperatorRelationId :
2036
- Assert (object -> objectSubId == 0 );
2037
2031
return OCLASS_AMOP ;
2038
2032
2039
2033
case AccessMethodProcedureRelationId :
2040
- Assert (object -> objectSubId == 0 );
2041
2034
return OCLASS_AMPROC ;
2042
2035
2043
2036
case RewriteRelationId :
2044
- Assert (object -> objectSubId == 0 );
2045
2037
return OCLASS_REWRITE ;
2046
2038
2047
2039
case TriggerRelationId :
2048
- Assert (object -> objectSubId == 0 );
2049
2040
return OCLASS_TRIGGER ;
2050
2041
2051
2042
case NamespaceRelationId :
2052
- Assert (object -> objectSubId == 0 );
2053
2043
return OCLASS_SCHEMA ;
2054
2044
2055
2045
case TSParserRelationId :
2056
- Assert (object -> objectSubId == 0 );
2057
2046
return OCLASS_TSPARSER ;
2058
2047
2059
2048
case TSDictionaryRelationId :
2060
- Assert (object -> objectSubId == 0 );
2061
2049
return OCLASS_TSDICT ;
2062
2050
2063
2051
case TSTemplateRelationId :
2064
- Assert (object -> objectSubId == 0 );
2065
2052
return OCLASS_TSTEMPLATE ;
2066
2053
2067
2054
case TSConfigRelationId :
2068
- Assert (object -> objectSubId == 0 );
2069
2055
return OCLASS_TSCONFIG ;
2070
2056
2071
2057
case AuthIdRelationId :
2072
- Assert (object -> objectSubId == 0 );
2073
2058
return OCLASS_ROLE ;
2074
2059
2075
2060
case DatabaseRelationId :
2076
- Assert (object -> objectSubId == 0 );
2077
2061
return OCLASS_DATABASE ;
2078
2062
2079
2063
case TableSpaceRelationId :
2080
- Assert (object -> objectSubId == 0 );
2081
2064
return OCLASS_TBLSPACE ;
2082
2065
2083
2066
case ForeignDataWrapperRelationId :
2084
- Assert (object -> objectSubId == 0 );
2085
2067
return OCLASS_FDW ;
2086
2068
2087
2069
case ForeignServerRelationId :
2088
- Assert (object -> objectSubId == 0 );
2089
2070
return OCLASS_FOREIGN_SERVER ;
2090
2071
2091
2072
case UserMappingRelationId :
2092
- Assert (object -> objectSubId == 0 );
2093
2073
return OCLASS_USER_MAPPING ;
2094
2074
2095
2075
case DefaultAclRelationId :
2096
- Assert (object -> objectSubId == 0 );
2097
2076
return OCLASS_DEFACL ;
2098
2077
}
2099
2078
@@ -2807,3 +2786,27 @@ getOpFamilyDescription(StringInfo buffer, Oid opfid)
2807
2786
ReleaseSysCache (amTup );
2808
2787
ReleaseSysCache (opfTup );
2809
2788
}
2789
+
2790
+ /*
2791
+ * SQL-level callable version of getObjectDescription
2792
+ */
2793
+ Datum
2794
+ pg_describe_object (PG_FUNCTION_ARGS )
2795
+ {
2796
+ Oid classid = PG_GETARG_OID (0 );
2797
+ Oid objid = PG_GETARG_OID (1 );
2798
+ int32 subobjid = PG_GETARG_INT32 (2 );
2799
+ char * description = NULL ;
2800
+ ObjectAddress address ;
2801
+
2802
+ /* for "pinned" items in pg_depend, return null */
2803
+ if (!OidIsValid (classid ) && !OidIsValid (objid ))
2804
+ PG_RETURN_NULL ();
2805
+
2806
+ address .classId = classid ;
2807
+ address .objectId = objid ;
2808
+ address .objectSubId = subobjid ;
2809
+
2810
+ description = getObjectDescription (& address );
2811
+ PG_RETURN_TEXT_P (cstring_to_text (description ));
2812
+ }
0 commit comments