Thanks to visit codestin.com
Credit goes to doxygen.postgresql.org

PostgreSQL Source Code git master
objectaddress.h File Reference
#include "access/htup.h"
#include "nodes/parsenodes.h"
#include "storage/lockdefs.h"
#include "utils/relcache.h"
Include dependency graph for objectaddress.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ObjectAddress
 

Macros

#define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id)
 
#define ObjectAddressSet(addr, class_id, object_id)    ObjectAddressSubSet(addr, class_id, object_id, 0)
 

Typedefs

typedef struct ObjectAddress ObjectAddress
 

Functions

ObjectAddress get_object_address (ObjectType objtype, Node *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
 
ObjectAddress get_object_address_rv (ObjectType objtype, RangeVar *rel, List *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
 
void check_object_ownership (Oid roleid, ObjectType objtype, ObjectAddress address, Node *object, Relation relation)
 
Oid get_object_namespace (const ObjectAddress *address)
 
bool is_objectclass_supported (Oid class_id)
 
const char * get_object_class_descr (Oid class_id)
 
Oid get_object_oid_index (Oid class_id)
 
int get_object_catcache_oid (Oid class_id)
 
int get_object_catcache_name (Oid class_id)
 
AttrNumber get_object_attnum_oid (Oid class_id)
 
AttrNumber get_object_attnum_name (Oid class_id)
 
AttrNumber get_object_attnum_namespace (Oid class_id)
 
AttrNumber get_object_attnum_owner (Oid class_id)
 
AttrNumber get_object_attnum_acl (Oid class_id)
 
ObjectType get_object_type (Oid class_id, Oid object_id)
 
bool get_object_namensp_unique (Oid class_id)
 
HeapTuple get_catalog_object_by_oid (Relation catalog, AttrNumber oidcol, Oid objectId)
 
HeapTuple get_catalog_object_by_oid_extended (Relation catalog, AttrNumber oidcol, Oid objectId, bool locktup)
 
char * getObjectDescription (const ObjectAddress *object, bool missing_ok)
 
char * getObjectDescriptionOids (Oid classid, Oid objid)
 
int read_objtype_from_string (const char *objtype)
 
char * getObjectTypeDescription (const ObjectAddress *object, bool missing_ok)
 
char * getObjectIdentity (const ObjectAddress *object, bool missing_ok)
 
char * getObjectIdentityParts (const ObjectAddress *object, List **objname, List **objargs, bool missing_ok)
 
struct ArrayTypestrlist_to_textarray (List *list)
 
ObjectType get_relkind_objtype (char relkind)
 

Variables

PGDLLIMPORT const ObjectAddress InvalidObjectAddress
 

Macro Definition Documentation

◆ ObjectAddressSet

#define ObjectAddressSet (   addr,
  class_id,
  object_id 
)     ObjectAddressSubSet(addr, class_id, object_id, 0)

Definition at line 40 of file objectaddress.h.

◆ ObjectAddressSubSet

#define ObjectAddressSubSet (   addr,
  class_id,
  object_id,
  object_sub_id 
)
Value:
do { \
(addr).classId = (class_id); \
(addr).objectId = (object_id); \
(addr).objectSubId = (object_sub_id); \
} while (0)

Definition at line 33 of file objectaddress.h.

Typedef Documentation

◆ ObjectAddress

typedef struct ObjectAddress ObjectAddress

Function Documentation

◆ check_object_ownership()

void check_object_ownership ( Oid  roleid,
ObjectType  objtype,
ObjectAddress  address,
Node object,
Relation  relation 
)

Definition at line 2390 of file objectaddress.c.

2392{
2393 switch (objtype)
2394 {
2395 case OBJECT_INDEX:
2396 case OBJECT_SEQUENCE:
2397 case OBJECT_TABLE:
2398 case OBJECT_VIEW:
2399 case OBJECT_MATVIEW:
2401 case OBJECT_COLUMN:
2402 case OBJECT_RULE:
2403 case OBJECT_TRIGGER:
2404 case OBJECT_POLICY:
2406 if (!object_ownercheck(RelationRelationId, RelationGetRelid(relation), roleid))
2408 RelationGetRelationName(relation));
2409 break;
2410 case OBJECT_TYPE:
2411 case OBJECT_DOMAIN:
2412 case OBJECT_ATTRIBUTE:
2413 if (!object_ownercheck(address.classId, address.objectId, roleid))
2415 break;
2417 {
2418 HeapTuple tuple;
2419 Oid contypid;
2420
2421 tuple = SearchSysCache1(CONSTROID,
2422 ObjectIdGetDatum(address.objectId));
2423 if (!HeapTupleIsValid(tuple))
2424 elog(ERROR, "constraint with OID %u does not exist",
2425 address.objectId);
2426
2427 contypid = ((Form_pg_constraint) GETSTRUCT(tuple))->contypid;
2428
2429 ReleaseSysCache(tuple);
2430
2431 /*
2432 * Fallback to type ownership check in this case as this is
2433 * what domain constraints rely on.
2434 */
2435 if (!object_ownercheck(TypeRelationId, contypid, roleid))
2437 }
2438 break;
2439 case OBJECT_AGGREGATE:
2440 case OBJECT_FUNCTION:
2441 case OBJECT_PROCEDURE:
2442 case OBJECT_ROUTINE:
2443 case OBJECT_OPERATOR:
2444 if (!object_ownercheck(address.classId, address.objectId, roleid))
2446 NameListToString((castNode(ObjectWithArgs, object))->objname));
2447 break;
2448 case OBJECT_DATABASE:
2450 case OBJECT_EXTENSION:
2451 case OBJECT_FDW:
2453 case OBJECT_LANGUAGE:
2454 case OBJECT_PUBLICATION:
2455 case OBJECT_SCHEMA:
2457 case OBJECT_TABLESPACE:
2458 if (!object_ownercheck(address.classId, address.objectId, roleid))
2460 strVal(object));
2461 break;
2462 case OBJECT_COLLATION:
2463 case OBJECT_CONVERSION:
2464 case OBJECT_OPCLASS:
2465 case OBJECT_OPFAMILY:
2469 if (!object_ownercheck(address.classId, address.objectId, roleid))
2471 NameListToString(castNode(List, object)));
2472 break;
2473 case OBJECT_LARGEOBJECT:
2474 if (!lo_compat_privileges &&
2475 !object_ownercheck(address.classId, address.objectId, roleid))
2476 ereport(ERROR,
2477 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2478 errmsg("must be owner of large object %u",
2479 address.objectId)));
2480 break;
2481 case OBJECT_CAST:
2482 {
2483 /* We can only check permissions on the source/target types */
2484 TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
2485 TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
2486 Oid sourcetypeid = typenameTypeId(NULL, sourcetype);
2487 Oid targettypeid = typenameTypeId(NULL, targettype);
2488
2489 if (!object_ownercheck(TypeRelationId, sourcetypeid, roleid)
2490 && !object_ownercheck(TypeRelationId, targettypeid, roleid))
2491 ereport(ERROR,
2492 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2493 errmsg("must be owner of type %s or type %s",
2494 format_type_be(sourcetypeid),
2495 format_type_be(targettypeid))));
2496 }
2497 break;
2498 case OBJECT_TRANSFORM:
2499 {
2500 TypeName *typename = linitial_node(TypeName, castNode(List, object));
2501 Oid typeid = typenameTypeId(NULL, typename);
2502
2503 if (!object_ownercheck(TypeRelationId, typeid, roleid))
2505 }
2506 break;
2507 case OBJECT_ROLE:
2508
2509 /*
2510 * We treat roles as being "owned" by those with CREATEROLE priv,
2511 * provided that they also have admin option on the role.
2512 *
2513 * However, superusers are only owned by superusers.
2514 */
2515 if (superuser_arg(address.objectId))
2516 {
2517 if (!superuser_arg(roleid))
2518 ereport(ERROR,
2519 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2520 errmsg("permission denied"),
2521 errdetail("The current user must have the %s attribute.",
2522 "SUPERUSER")));
2523 }
2524 else
2525 {
2526 if (!has_createrole_privilege(roleid))
2527 ereport(ERROR,
2528 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2529 errmsg("permission denied"),
2530 errdetail("The current user must have the %s attribute.",
2531 "CREATEROLE")));
2532 if (!is_admin_of_role(roleid, address.objectId))
2533 ereport(ERROR,
2534 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2535 errmsg("permission denied"),
2536 errdetail("The current user must have the %s option on role \"%s\".",
2537 "ADMIN",
2539 true))));
2540 }
2541 break;
2542 case OBJECT_TSPARSER:
2543 case OBJECT_TSTEMPLATE:
2546 /* We treat these object types as being owned by superusers */
2547 if (!superuser_arg(roleid))
2548 ereport(ERROR,
2549 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2550 errmsg("must be superuser")));
2551 break;
2552 case OBJECT_AMOP:
2553 case OBJECT_AMPROC:
2554 case OBJECT_DEFAULT:
2555 case OBJECT_DEFACL:
2559 /* These are currently not supported or don't make sense here. */
2560 elog(ERROR, "unsupported object type: %d", (int) objtype);
2561 break;
2562 }
2563}
bool is_admin_of_role(Oid member, Oid role)
Definition: acl.c:5414
@ ACLCHECK_NOT_OWNER
Definition: acl.h:185
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
Definition: aclchk.c:2652
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
Definition: aclchk.c:4088
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
Definition: aclchk.c:2971
bool has_createrole_privilege(Oid roleid)
Definition: aclchk.c:4167
int errdetail(const char *fmt,...)
Definition: elog.c:1207
int errcode(int sqlerrcode)
Definition: elog.c:854
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
#define ereport(elevel,...)
Definition: elog.h:150
char * format_type_be(Oid type_oid)
Definition: format_type.c:343
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
static void * GETSTRUCT(const HeapTupleData *tuple)
Definition: htup_details.h:728
bool lo_compat_privileges
Definition: inv_api.c:56
char * GetUserNameFromId(Oid roleid, bool noerr)
Definition: miscinit.c:988
char * NameListToString(const List *names)
Definition: namespace.c:3664
#define castNode(_type_, nodeptr)
Definition: nodes.h:182
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
Definition: parse_type.c:291
@ OBJECT_EVENT_TRIGGER
Definition: parsenodes.h:2338
@ OBJECT_FDW
Definition: parsenodes.h:2340
@ OBJECT_TSPARSER
Definition: parsenodes.h:2371
@ OBJECT_COLLATION
Definition: parsenodes.h:2331
@ OBJECT_USER_MAPPING
Definition: parsenodes.h:2374
@ OBJECT_ACCESS_METHOD
Definition: parsenodes.h:2324
@ OBJECT_OPCLASS
Definition: parsenodes.h:2348
@ OBJECT_DEFACL
Definition: parsenodes.h:2335
@ OBJECT_AGGREGATE
Definition: parsenodes.h:2325
@ OBJECT_MATVIEW
Definition: parsenodes.h:2347
@ OBJECT_SCHEMA
Definition: parsenodes.h:2360
@ OBJECT_POLICY
Definition: parsenodes.h:2352
@ OBJECT_OPERATOR
Definition: parsenodes.h:2349
@ OBJECT_FOREIGN_TABLE
Definition: parsenodes.h:2342
@ OBJECT_TSCONFIGURATION
Definition: parsenodes.h:2369
@ OBJECT_OPFAMILY
Definition: parsenodes.h:2350
@ OBJECT_DOMAIN
Definition: parsenodes.h:2336
@ OBJECT_COLUMN
Definition: parsenodes.h:2330
@ OBJECT_TABLESPACE
Definition: parsenodes.h:2366
@ OBJECT_ROLE
Definition: parsenodes.h:2357
@ OBJECT_ROUTINE
Definition: parsenodes.h:2358
@ OBJECT_LARGEOBJECT
Definition: parsenodes.h:2346
@ OBJECT_PUBLICATION_NAMESPACE
Definition: parsenodes.h:2355
@ OBJECT_PROCEDURE
Definition: parsenodes.h:2353
@ OBJECT_EXTENSION
Definition: parsenodes.h:2339
@ OBJECT_INDEX
Definition: parsenodes.h:2344
@ OBJECT_DEFAULT
Definition: parsenodes.h:2334
@ OBJECT_DATABASE
Definition: parsenodes.h:2333
@ OBJECT_SEQUENCE
Definition: parsenodes.h:2361
@ OBJECT_TSTEMPLATE
Definition: parsenodes.h:2372
@ OBJECT_LANGUAGE
Definition: parsenodes.h:2345
@ OBJECT_AMOP
Definition: parsenodes.h:2326
@ OBJECT_PUBLICATION_REL
Definition: parsenodes.h:2356
@ OBJECT_FOREIGN_SERVER
Definition: parsenodes.h:2341
@ OBJECT_TSDICTIONARY
Definition: parsenodes.h:2370
@ OBJECT_ATTRIBUTE
Definition: parsenodes.h:2328
@ OBJECT_PUBLICATION
Definition: parsenodes.h:2354
@ OBJECT_RULE
Definition: parsenodes.h:2359
@ OBJECT_CONVERSION
Definition: parsenodes.h:2332
@ OBJECT_AMPROC
Definition: parsenodes.h:2327
@ OBJECT_TABLE
Definition: parsenodes.h:2365
@ OBJECT_VIEW
Definition: parsenodes.h:2375
@ OBJECT_PARAMETER_ACL
Definition: parsenodes.h:2351
@ OBJECT_TYPE
Definition: parsenodes.h:2373
@ OBJECT_FUNCTION
Definition: parsenodes.h:2343
@ OBJECT_TABCONSTRAINT
Definition: parsenodes.h:2364
@ OBJECT_DOMCONSTRAINT
Definition: parsenodes.h:2337
@ OBJECT_SUBSCRIPTION
Definition: parsenodes.h:2362
@ OBJECT_STATISTIC_EXT
Definition: parsenodes.h:2363
@ OBJECT_CAST
Definition: parsenodes.h:2329
@ OBJECT_TRIGGER
Definition: parsenodes.h:2368
@ OBJECT_TRANSFORM
Definition: parsenodes.h:2367
FormData_pg_constraint * Form_pg_constraint
#define linitial_node(type, l)
Definition: pg_list.h:181
#define lsecond_node(type, l)
Definition: pg_list.h:186
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:262
unsigned int Oid
Definition: postgres_ext.h:32
#define RelationGetRelid(relation)
Definition: rel.h:514
#define RelationGetRelationName(relation)
Definition: rel.h:548
Definition: pg_list.h:54
bool superuser_arg(Oid roleid)
Definition: superuser.c:56
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:264
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:220
#define strVal(v)
Definition: value.h:82

References aclcheck_error(), aclcheck_error_type(), ACLCHECK_NOT_OWNER, castNode, ObjectAddress::classId, elog, ereport, errcode(), errdetail(), errmsg(), ERROR, format_type_be(), GETSTRUCT(), GetUserNameFromId(), has_createrole_privilege(), HeapTupleIsValid, is_admin_of_role(), linitial_node, lo_compat_privileges, lsecond_node, NameListToString(), OBJECT_ACCESS_METHOD, OBJECT_AGGREGATE, OBJECT_AMOP, OBJECT_AMPROC, OBJECT_ATTRIBUTE, OBJECT_CAST, OBJECT_COLLATION, OBJECT_COLUMN, OBJECT_CONVERSION, OBJECT_DATABASE, OBJECT_DEFACL, OBJECT_DEFAULT, OBJECT_DOMAIN, OBJECT_DOMCONSTRAINT, OBJECT_EVENT_TRIGGER, OBJECT_EXTENSION, OBJECT_FDW, OBJECT_FOREIGN_SERVER, OBJECT_FOREIGN_TABLE, OBJECT_FUNCTION, OBJECT_INDEX, OBJECT_LANGUAGE, OBJECT_LARGEOBJECT, OBJECT_MATVIEW, OBJECT_OPCLASS, OBJECT_OPERATOR, OBJECT_OPFAMILY, object_ownercheck(), OBJECT_PARAMETER_ACL, OBJECT_POLICY, OBJECT_PROCEDURE, OBJECT_PUBLICATION, OBJECT_PUBLICATION_NAMESPACE, OBJECT_PUBLICATION_REL, OBJECT_ROLE, OBJECT_ROUTINE, OBJECT_RULE, OBJECT_SCHEMA, OBJECT_SEQUENCE, OBJECT_STATISTIC_EXT, OBJECT_SUBSCRIPTION, OBJECT_TABCONSTRAINT, OBJECT_TABLE, OBJECT_TABLESPACE, OBJECT_TRANSFORM, OBJECT_TRIGGER, OBJECT_TSCONFIGURATION, OBJECT_TSDICTIONARY, OBJECT_TSPARSER, OBJECT_TSTEMPLATE, OBJECT_TYPE, OBJECT_USER_MAPPING, OBJECT_VIEW, ObjectAddress::objectId, ObjectIdGetDatum(), RelationGetRelationName, RelationGetRelid, ReleaseSysCache(), SearchSysCache1(), strVal, superuser_arg(), and typenameTypeId().

Referenced by CommentObject(), ExecAlterExtensionContentsStmt(), ExecAlterObjectDependsStmt(), ExecSecLabelStmt(), and RemoveObjects().

◆ get_catalog_object_by_oid()

HeapTuple get_catalog_object_by_oid ( Relation  catalog,
AttrNumber  oidcol,
Oid  objectId 
)

Definition at line 2789 of file objectaddress.c.

2790{
2791 return
2792 get_catalog_object_by_oid_extended(catalog, oidcol, objectId, false);
2793}
HeapTuple get_catalog_object_by_oid_extended(Relation catalog, AttrNumber oidcol, Oid objectId, bool locktup)

References get_catalog_object_by_oid_extended().

Referenced by getConstraintTypeDescription(), getObjectIdentityParts(), obtain_object_name_namespace(), pg_event_trigger_ddl_commands(), pg_get_acl(), and pg_identify_object().

◆ get_catalog_object_by_oid_extended()

HeapTuple get_catalog_object_by_oid_extended ( Relation  catalog,
AttrNumber  oidcol,
Oid  objectId,
bool  locktup 
)

Definition at line 2802 of file objectaddress.c.

2806{
2807 HeapTuple tuple;
2808 Oid classId = RelationGetRelid(catalog);
2809 int oidCacheId = get_object_catcache_oid(classId);
2810
2811 if (oidCacheId > 0)
2812 {
2813 if (locktup)
2814 tuple = SearchSysCacheLockedCopy1(oidCacheId,
2815 ObjectIdGetDatum(objectId));
2816 else
2817 tuple = SearchSysCacheCopy1(oidCacheId,
2818 ObjectIdGetDatum(objectId));
2819 if (!HeapTupleIsValid(tuple)) /* should not happen */
2820 return NULL;
2821 }
2822 else
2823 {
2824 Oid oidIndexId = get_object_oid_index(classId);
2825 SysScanDesc scan;
2826 ScanKeyData skey;
2827
2828 Assert(OidIsValid(oidIndexId));
2829
2830 ScanKeyInit(&skey,
2831 oidcol,
2832 BTEqualStrategyNumber, F_OIDEQ,
2833 ObjectIdGetDatum(objectId));
2834
2835 scan = systable_beginscan(catalog, oidIndexId, true,
2836 NULL, 1, &skey);
2837 tuple = systable_getnext(scan);
2838 if (!HeapTupleIsValid(tuple))
2839 {
2840 systable_endscan(scan);
2841 return NULL;
2842 }
2843
2844 if (locktup)
2845 LockTuple(catalog, &tuple->t_self, InplaceUpdateTupleLock);
2846
2847 tuple = heap_copytuple(tuple);
2848
2849 systable_endscan(scan);
2850 }
2851
2852 return tuple;
2853}
#define OidIsValid(objectId)
Definition: c.h:775
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:603
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:514
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition: genam.c:388
Assert(PointerIsAligned(start, uint64))
HeapTuple heap_copytuple(HeapTuple tuple)
Definition: heaptuple.c:778
void LockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
Definition: lmgr.c:562
#define InplaceUpdateTupleLock
Definition: lockdefs.h:48
int get_object_catcache_oid(Oid class_id)
Oid get_object_oid_index(Oid class_id)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
#define BTEqualStrategyNumber
Definition: stratnum.h:31
ItemPointerData t_self
Definition: htup.h:65
HeapTuple SearchSysCacheLockedCopy1(int cacheId, Datum key1)
Definition: syscache.c:399
#define SearchSysCacheCopy1(cacheId, key1)
Definition: syscache.h:91

References Assert(), BTEqualStrategyNumber, get_object_catcache_oid(), get_object_oid_index(), heap_copytuple(), HeapTupleIsValid, InplaceUpdateTupleLock, LockTuple(), ObjectIdGetDatum(), OidIsValid, RelationGetRelid, ScanKeyInit(), SearchSysCacheCopy1, SearchSysCacheLockedCopy1(), systable_beginscan(), systable_endscan(), systable_getnext(), and HeapTupleData::t_self.

Referenced by AlterObjectOwner_internal(), and get_catalog_object_by_oid().

◆ get_object_address()

ObjectAddress get_object_address ( ObjectType  objtype,
Node object,
Relation relp,
LOCKMODE  lockmode,
bool  missing_ok 
)

Definition at line 922 of file objectaddress.c.

924{
925 ObjectAddress address = {InvalidOid, InvalidOid, 0};
926 ObjectAddress old_address = {InvalidOid, InvalidOid, 0};
927 Relation relation = NULL;
928 uint64 inval_count;
929
930 /* Some kind of lock must be taken. */
931 Assert(lockmode != NoLock);
932
933 for (;;)
934 {
935 /*
936 * Remember this value, so that, after looking up the object name and
937 * locking it, we can check whether any invalidation messages have
938 * been processed that might require a do-over.
939 */
940 inval_count = SharedInvalidMessageCounter;
941
942 /* Look up object address. */
943 switch (objtype)
944 {
945 case OBJECT_INDEX:
946 case OBJECT_SEQUENCE:
947 case OBJECT_TABLE:
948 case OBJECT_VIEW:
949 case OBJECT_MATVIEW:
951 address =
953 &relation, lockmode,
954 missing_ok);
955 break;
956 case OBJECT_ATTRIBUTE:
957 case OBJECT_COLUMN:
958 address =
960 &relation, lockmode,
961 missing_ok);
962 break;
963 case OBJECT_DEFAULT:
964 address =
965 get_object_address_attrdef(objtype, castNode(List, object),
966 &relation, lockmode,
967 missing_ok);
968 break;
969 case OBJECT_RULE:
970 case OBJECT_TRIGGER:
972 case OBJECT_POLICY:
973 address = get_object_address_relobject(objtype, castNode(List, object),
974 &relation, missing_ok);
975 break;
977 {
978 List *objlist;
979 ObjectAddress domaddr;
980 char *constrname;
981
982 objlist = castNode(List, object);
984 linitial_node(TypeName, objlist),
985 missing_ok);
986 constrname = strVal(lsecond(objlist));
987
988 address.classId = ConstraintRelationId;
990 constrname, missing_ok);
991 address.objectSubId = 0;
992 }
993 break;
994 case OBJECT_DATABASE:
995 case OBJECT_EXTENSION:
997 case OBJECT_ROLE:
998 case OBJECT_SCHEMA:
999 case OBJECT_LANGUAGE:
1000 case OBJECT_FDW:
1005 case OBJECT_PUBLICATION:
1007 address = get_object_address_unqualified(objtype,
1008 castNode(String, object), missing_ok);
1009 break;
1010 case OBJECT_TYPE:
1011 case OBJECT_DOMAIN:
1012 address = get_object_address_type(objtype, castNode(TypeName, object), missing_ok);
1013 break;
1014 case OBJECT_AGGREGATE:
1015 case OBJECT_FUNCTION:
1016 case OBJECT_PROCEDURE:
1017 case OBJECT_ROUTINE:
1018 address.classId = ProcedureRelationId;
1019 address.objectId = LookupFuncWithArgs(objtype, castNode(ObjectWithArgs, object), missing_ok);
1020 address.objectSubId = 0;
1021 break;
1022 case OBJECT_OPERATOR:
1023 address.classId = OperatorRelationId;
1024 address.objectId = LookupOperWithArgs(castNode(ObjectWithArgs, object), missing_ok);
1025 address.objectSubId = 0;
1026 break;
1027 case OBJECT_COLLATION:
1028 address.classId = CollationRelationId;
1029 address.objectId = get_collation_oid(castNode(List, object), missing_ok);
1030 address.objectSubId = 0;
1031 break;
1032 case OBJECT_CONVERSION:
1033 address.classId = ConversionRelationId;
1034 address.objectId = get_conversion_oid(castNode(List, object), missing_ok);
1035 address.objectSubId = 0;
1036 break;
1037 case OBJECT_OPCLASS:
1038 case OBJECT_OPFAMILY:
1039 address = get_object_address_opcf(objtype, castNode(List, object), missing_ok);
1040 break;
1041 case OBJECT_AMOP:
1042 case OBJECT_AMPROC:
1043 address = get_object_address_opf_member(objtype, castNode(List, object), missing_ok);
1044 break;
1045 case OBJECT_LARGEOBJECT:
1046 address.classId = LargeObjectRelationId;
1047 address.objectId = oidparse(object);
1048 address.objectSubId = 0;
1049 if (!LargeObjectExists(address.objectId))
1050 {
1051 if (!missing_ok)
1052 ereport(ERROR,
1053 (errcode(ERRCODE_UNDEFINED_OBJECT),
1054 errmsg("large object %u does not exist",
1055 address.objectId)));
1056 }
1057 break;
1058 case OBJECT_CAST:
1059 {
1060 TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
1061 TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
1062 Oid sourcetypeid;
1063 Oid targettypeid;
1064
1065 sourcetypeid = LookupTypeNameOid(NULL, sourcetype, missing_ok);
1066 targettypeid = LookupTypeNameOid(NULL, targettype, missing_ok);
1067 address.classId = CastRelationId;
1068 address.objectId =
1069 get_cast_oid(sourcetypeid, targettypeid, missing_ok);
1070 address.objectSubId = 0;
1071 }
1072 break;
1073 case OBJECT_TRANSFORM:
1074 {
1075 TypeName *typename = linitial_node(TypeName, castNode(List, object));
1076 char *langname = strVal(lsecond(castNode(List, object)));
1077 Oid type_id = LookupTypeNameOid(NULL, typename, missing_ok);
1078 Oid lang_id = get_language_oid(langname, missing_ok);
1079
1080 address.classId = TransformRelationId;
1081 address.objectId =
1082 get_transform_oid(type_id, lang_id, missing_ok);
1083 address.objectSubId = 0;
1084 }
1085 break;
1086 case OBJECT_TSPARSER:
1087 address.classId = TSParserRelationId;
1088 address.objectId = get_ts_parser_oid(castNode(List, object), missing_ok);
1089 address.objectSubId = 0;
1090 break;
1092 address.classId = TSDictionaryRelationId;
1093 address.objectId = get_ts_dict_oid(castNode(List, object), missing_ok);
1094 address.objectSubId = 0;
1095 break;
1096 case OBJECT_TSTEMPLATE:
1097 address.classId = TSTemplateRelationId;
1098 address.objectId = get_ts_template_oid(castNode(List, object), missing_ok);
1099 address.objectSubId = 0;
1100 break;
1102 address.classId = TSConfigRelationId;
1103 address.objectId = get_ts_config_oid(castNode(List, object), missing_ok);
1104 address.objectSubId = 0;
1105 break;
1107 address = get_object_address_usermapping(castNode(List, object),
1108 missing_ok);
1109 break;
1112 missing_ok);
1113 break;
1116 &relation,
1117 missing_ok);
1118 break;
1119 case OBJECT_DEFACL:
1120 address = get_object_address_defacl(castNode(List, object),
1121 missing_ok);
1122 break;
1124 address.classId = StatisticExtRelationId;
1126 missing_ok);
1127 address.objectSubId = 0;
1128 break;
1129 /* no default, to let compiler warn about missing case */
1130 }
1131
1132 if (!address.classId)
1133 elog(ERROR, "unrecognized object type: %d", (int) objtype);
1134
1135 /*
1136 * If we could not find the supplied object, return without locking.
1137 */
1138 if (!OidIsValid(address.objectId))
1139 {
1140 Assert(missing_ok);
1141 return address;
1142 }
1143
1144 /*
1145 * If we're retrying, see if we got the same answer as last time. If
1146 * so, we're done; if not, we locked the wrong thing, so give up our
1147 * lock.
1148 */
1149 if (OidIsValid(old_address.classId))
1150 {
1151 if (old_address.classId == address.classId
1152 && old_address.objectId == address.objectId
1153 && old_address.objectSubId == address.objectSubId)
1154 break;
1155 if (old_address.classId != RelationRelationId)
1156 {
1157 if (IsSharedRelation(old_address.classId))
1158 UnlockSharedObject(old_address.classId,
1159 old_address.objectId,
1160 0, lockmode);
1161 else
1162 UnlockDatabaseObject(old_address.classId,
1163 old_address.objectId,
1164 0, lockmode);
1165 }
1166 }
1167
1168 /*
1169 * If we're dealing with a relation or attribute, then the relation is
1170 * already locked. Otherwise, we lock it now.
1171 */
1172 if (address.classId != RelationRelationId)
1173 {
1174 if (IsSharedRelation(address.classId))
1175 LockSharedObject(address.classId, address.objectId, 0,
1176 lockmode);
1177 else
1178 LockDatabaseObject(address.classId, address.objectId, 0,
1179 lockmode);
1180 }
1181
1182 /*
1183 * At this point, we've resolved the name to an OID and locked the
1184 * corresponding database object. However, it's possible that by the
1185 * time we acquire the lock on the object, concurrent DDL has modified
1186 * the database in such a way that the name we originally looked up no
1187 * longer resolves to that OID.
1188 *
1189 * We can be certain that this isn't an issue if (a) no shared
1190 * invalidation messages have been processed or (b) we've locked a
1191 * relation somewhere along the line. All the relation name lookups
1192 * in this module ultimately use RangeVarGetRelid() to acquire a
1193 * relation lock, and that function protects against the same kinds of
1194 * races we're worried about here. Even when operating on a
1195 * constraint, rule, or trigger, we still acquire AccessShareLock on
1196 * the relation, which is enough to freeze out any concurrent DDL.
1197 *
1198 * In all other cases, however, it's possible that the name we looked
1199 * up no longer refers to the object we locked, so we retry the lookup
1200 * and see whether we get the same answer.
1201 */
1202 if (inval_count == SharedInvalidMessageCounter || relation != NULL)
1203 break;
1204 old_address = address;
1205 }
1206
1207 /* relp must be given if it's a relation */
1208 Assert(!relation || relp);
1209
1210 /* Return the object address and the relation. */
1211 if (relp)
1212 *relp = relation;
1213 return address;
1214}
uint64_t uint64
Definition: c.h:540
bool IsSharedRelation(Oid relationId)
Definition: catalog.c:304
Oid get_transform_oid(Oid type_id, Oid lang_id, bool missing_ok)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:1088
void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:1008
void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:1148
void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:1068
#define NoLock
Definition: lockdefs.h:34
Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok)
Definition: lsyscache.c:1100
Oid get_statistics_object_oid(List *names, bool missing_ok)
Definition: namespace.c:2642
Oid get_collation_oid(List *collname, bool missing_ok)
Definition: namespace.c:4041
Oid get_conversion_oid(List *conname, bool missing_ok)
Definition: namespace.c:4095
Oid get_ts_dict_oid(List *names, bool missing_ok)
Definition: namespace.c:2931
Oid get_ts_parser_oid(List *names, bool missing_ok)
Definition: namespace.c:2786
Oid get_ts_config_oid(List *names, bool missing_ok)
Definition: namespace.c:3222
Oid get_ts_template_oid(List *names, bool missing_ok)
Definition: namespace.c:3077
static ObjectAddress get_object_address_publication_schema(List *object, bool missing_ok)
static ObjectAddress get_object_address_relobject(ObjectType objtype, List *object, Relation *relp, bool missing_ok)
static ObjectAddress get_object_address_defacl(List *object, bool missing_ok)
static ObjectAddress get_object_address_unqualified(ObjectType objtype, String *strval, bool missing_ok)
static ObjectAddress get_object_address_publication_rel(List *object, Relation *relp, bool missing_ok)
static ObjectAddress get_object_address_opf_member(ObjectType objtype, List *object, bool missing_ok)
static ObjectAddress get_object_address_type(ObjectType objtype, TypeName *typename, bool missing_ok)
static ObjectAddress get_object_address_usermapping(List *object, bool missing_ok)
static ObjectAddress get_object_address_opcf(ObjectType objtype, List *object, bool missing_ok)
static ObjectAddress get_object_address_attribute(ObjectType objtype, List *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
static ObjectAddress get_relation_by_qualified_name(ObjectType objtype, List *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
static ObjectAddress get_object_address_attrdef(ObjectType objtype, List *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
Oid oidparse(Node *node)
Definition: oid.c:235
Oid LookupFuncWithArgs(ObjectType objtype, ObjectWithArgs *func, bool missing_ok)
Definition: parse_func.c:2322
Oid LookupOperWithArgs(ObjectWithArgs *oper, bool noError)
Definition: parse_oper.c:134
Oid LookupTypeNameOid(ParseState *pstate, const TypeName *typeName, bool missing_ok)
Definition: parse_type.c:232
Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok)
bool LargeObjectExists(Oid loid)
#define lsecond(l)
Definition: pg_list.h:183
#define InvalidOid
Definition: postgres_ext.h:37
Oid get_language_oid(const char *langname, bool missing_ok)
Definition: proclang.c:226
uint64 SharedInvalidMessageCounter
Definition: sinval.c:24
Definition: value.h:64

References Assert(), castNode, ObjectAddress::classId, elog, ereport, errcode(), errmsg(), ERROR, get_cast_oid(), get_collation_oid(), get_conversion_oid(), get_domain_constraint_oid(), get_language_oid(), get_object_address_attrdef(), get_object_address_attribute(), get_object_address_defacl(), get_object_address_opcf(), get_object_address_opf_member(), get_object_address_publication_rel(), get_object_address_publication_schema(), get_object_address_relobject(), get_object_address_type(), get_object_address_unqualified(), get_object_address_usermapping(), get_relation_by_qualified_name(), get_statistics_object_oid(), get_transform_oid(), get_ts_config_oid(), get_ts_dict_oid(), get_ts_parser_oid(), get_ts_template_oid(), InvalidOid, IsSharedRelation(), LargeObjectExists(), linitial_node, LockDatabaseObject(), LockSharedObject(), LookupFuncWithArgs(), LookupOperWithArgs(), LookupTypeNameOid(), lsecond, lsecond_node, NoLock, OBJECT_ACCESS_METHOD, OBJECT_AGGREGATE, OBJECT_AMOP, OBJECT_AMPROC, OBJECT_ATTRIBUTE, OBJECT_CAST, OBJECT_COLLATION, OBJECT_COLUMN, OBJECT_CONVERSION, OBJECT_DATABASE, OBJECT_DEFACL, OBJECT_DEFAULT, OBJECT_DOMAIN, OBJECT_DOMCONSTRAINT, OBJECT_EVENT_TRIGGER, OBJECT_EXTENSION, OBJECT_FDW, OBJECT_FOREIGN_SERVER, OBJECT_FOREIGN_TABLE, OBJECT_FUNCTION, OBJECT_INDEX, OBJECT_LANGUAGE, OBJECT_LARGEOBJECT, OBJECT_MATVIEW, OBJECT_OPCLASS, OBJECT_OPERATOR, OBJECT_OPFAMILY, OBJECT_PARAMETER_ACL, OBJECT_POLICY, OBJECT_PROCEDURE, OBJECT_PUBLICATION, OBJECT_PUBLICATION_NAMESPACE, OBJECT_PUBLICATION_REL, OBJECT_ROLE, OBJECT_ROUTINE, OBJECT_RULE, OBJECT_SCHEMA, OBJECT_SEQUENCE, OBJECT_STATISTIC_EXT, OBJECT_SUBSCRIPTION, OBJECT_TABCONSTRAINT, OBJECT_TABLE, OBJECT_TABLESPACE, OBJECT_TRANSFORM, OBJECT_TRIGGER, OBJECT_TSCONFIGURATION, OBJECT_TSDICTIONARY, OBJECT_TSPARSER, OBJECT_TSTEMPLATE, OBJECT_TYPE, OBJECT_USER_MAPPING, OBJECT_VIEW, ObjectAddress::objectId, ObjectAddress::objectSubId, OidIsValid, oidparse(), SharedInvalidMessageCounter, strVal, UnlockDatabaseObject(), and UnlockSharedObject().

Referenced by CommentObject(), ExecAlterExtensionContentsStmt(), ExecAlterObjectDependsStmt(), ExecAlterObjectSchemaStmt(), ExecAlterOwnerStmt(), ExecRenameStmt(), ExecSecLabelStmt(), get_object_address_rv(), objectNamesToOids(), pg_get_object_address(), and RemoveObjects().

◆ get_object_address_rv()

ObjectAddress get_object_address_rv ( ObjectType  objtype,
RangeVar rel,
List object,
Relation relp,
LOCKMODE  lockmode,
bool  missing_ok 
)

Definition at line 1224 of file objectaddress.c.

1227{
1228 if (rel)
1229 {
1230 object = lcons(makeString(rel->relname), object);
1231 if (rel->schemaname)
1232 object = lcons(makeString(rel->schemaname), object);
1233 if (rel->catalogname)
1234 object = lcons(makeString(rel->catalogname), object);
1235 }
1236
1237 return get_object_address(objtype, (Node *) object,
1238 relp, lockmode, missing_ok);
1239}
List * lcons(void *datum, List *list)
Definition: list.c:495
ObjectAddress get_object_address(ObjectType objtype, Node *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
Definition: nodes.h:135
char * relname
Definition: primnodes.h:83
char * catalogname
Definition: primnodes.h:77
char * schemaname
Definition: primnodes.h:80
String * makeString(char *str)
Definition: value.c:63

References RangeVar::catalogname, get_object_address(), lcons(), makeString(), RangeVar::relname, and RangeVar::schemaname.

Referenced by ExecAlterObjectDependsStmt().

◆ get_object_attnum_acl()

AttrNumber get_object_attnum_acl ( Oid  class_id)

Definition at line 2692 of file objectaddress.c.

2693{
2694 const ObjectPropertyType *prop = get_object_property_data(class_id);
2695
2696 return prop->attnum_acl;
2697}
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AttrNumber attnum_acl

References ObjectPropertyType::attnum_acl, and get_object_property_data().

Referenced by AlterObjectOwner_internal(), ExecGrant_common(), object_aclmask_ext(), pg_get_acl(), and recordExtObjInitPriv().

◆ get_object_attnum_name()

◆ get_object_attnum_namespace()

◆ get_object_attnum_oid()

◆ get_object_attnum_owner()

◆ get_object_catcache_name()

int get_object_catcache_name ( Oid  class_id)

Definition at line 2652 of file objectaddress.c.

2653{
2654 const ObjectPropertyType *prop = get_object_property_data(class_id);
2655
2656 return prop->name_catcache_id;
2657}

References get_object_property_data(), and ObjectPropertyType::name_catcache_id.

Referenced by AlterObjectNamespace_internal(), and AlterObjectRename_internal().

◆ get_object_catcache_oid()

◆ get_object_class_descr()

const char * get_object_class_descr ( Oid  class_id)

◆ get_object_namensp_unique()

bool get_object_namensp_unique ( Oid  class_id)

Definition at line 2725 of file objectaddress.c.

2726{
2727 const ObjectPropertyType *prop = get_object_property_data(class_id);
2728
2729 return prop->is_nsp_name_unique;
2730}

References get_object_property_data(), and ObjectPropertyType::is_nsp_name_unique.

Referenced by obtain_object_name_namespace(), and pg_identify_object().

◆ get_object_namespace()

Oid get_object_namespace ( const ObjectAddress address)

Definition at line 2572 of file objectaddress.c.

2573{
2574 int cache;
2575 HeapTuple tuple;
2576 Oid oid;
2577 const ObjectPropertyType *property;
2578
2579 /* If not owned by a namespace, just return InvalidOid. */
2580 property = get_object_property_data(address->classId);
2581 if (property->attnum_namespace == InvalidAttrNumber)
2582 return InvalidOid;
2583
2584 /* Currently, we can only handle object types with system caches. */
2585 cache = property->oid_catcache_id;
2586 Assert(cache != -1);
2587
2588 /* Fetch tuple from syscache and extract namespace attribute. */
2589 tuple = SearchSysCache1(cache, ObjectIdGetDatum(address->objectId));
2590 if (!HeapTupleIsValid(tuple))
2591 elog(ERROR, "cache lookup failed for cache %d oid %u",
2592 cache, address->objectId);
2594 tuple,
2595 property->attnum_namespace));
2596 ReleaseSysCache(tuple);
2597
2598 return oid;
2599}
#define InvalidAttrNumber
Definition: attnum.h:23
static Oid DatumGetObjectId(Datum X)
Definition: postgres.h:252
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
Definition: syscache.c:625

References Assert(), ObjectPropertyType::attnum_namespace, ObjectAddress::classId, DatumGetObjectId(), elog, ERROR, get_object_property_data(), HeapTupleIsValid, InvalidAttrNumber, InvalidOid, ObjectAddress::objectId, ObjectIdGetDatum(), ReleaseSysCache(), SearchSysCache1(), and SysCacheGetAttrNotNull().

Referenced by RemoveObjects().

◆ get_object_oid_index()

Oid get_object_oid_index ( Oid  class_id)

Definition at line 2636 of file objectaddress.c.

2637{
2638 const ObjectPropertyType *prop = get_object_property_data(class_id);
2639
2640 return prop->oid_index_oid;
2641}

References get_object_property_data(), and ObjectPropertyType::oid_index_oid.

Referenced by DropObjectById(), get_catalog_object_by_oid_extended(), and object_ownercheck().

◆ get_object_type()

ObjectType get_object_type ( Oid  class_id,
Oid  object_id 
)

Definition at line 2707 of file objectaddress.c.

2708{
2709 const ObjectPropertyType *prop = get_object_property_data(class_id);
2710
2711 if (prop->objtype == OBJECT_TABLE)
2712 {
2713 /*
2714 * If the property data says it's a table, dig a little deeper to get
2715 * the real relation kind, so that callers can produce more precise
2716 * error messages.
2717 */
2718 return get_relkind_objtype(get_rel_relkind(object_id));
2719 }
2720 else
2721 return prop->objtype;
2722}
char get_rel_relkind(Oid relid)
Definition: lsyscache.c:2170
ObjectType get_relkind_objtype(char relkind)

References get_object_property_data(), get_rel_relkind(), get_relkind_objtype(), OBJECT_TABLE, and ObjectPropertyType::objtype.

Referenced by AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), ExecGrant_common(), and object_aclmask_ext().

◆ get_relkind_objtype()

ObjectType get_relkind_objtype ( char  relkind)

Definition at line 6185 of file objectaddress.c.

6186{
6187 switch (relkind)
6188 {
6189 case RELKIND_RELATION:
6190 case RELKIND_PARTITIONED_TABLE:
6191 return OBJECT_TABLE;
6192 case RELKIND_INDEX:
6193 case RELKIND_PARTITIONED_INDEX:
6194 return OBJECT_INDEX;
6195 case RELKIND_SEQUENCE:
6196 return OBJECT_SEQUENCE;
6197 case RELKIND_VIEW:
6198 return OBJECT_VIEW;
6199 case RELKIND_MATVIEW:
6200 return OBJECT_MATVIEW;
6201 case RELKIND_FOREIGN_TABLE:
6202 return OBJECT_FOREIGN_TABLE;
6203 case RELKIND_TOASTVALUE:
6204 return OBJECT_TABLE;
6205 default:
6206 /* Per above, don't raise an error */
6207 return OBJECT_TABLE;
6208 }
6209}

References OBJECT_FOREIGN_TABLE, OBJECT_INDEX, OBJECT_MATVIEW, OBJECT_SEQUENCE, OBJECT_TABLE, and OBJECT_VIEW.

Referenced by AlterTableMoveAll(), ATExecChangeOwner(), ATSimplePermissions(), checkFkeyPermissions(), CreateStatistics(), CreateTriggerFiringOn(), currtid_internal(), DefineQueryRewrite(), EnableDisableRule(), ExecCheckPermissions(), get_object_type(), get_rel_from_relname(), heap_force_common(), LockViewRecurse_walker(), LogicalRepSyncTableStart(), MergeAttributes(), pg_prewarm(), pgrowlocks(), PublicationAddTables(), RangeVarCallbackForAlterRelation(), RangeVarCallbackForDropRelation(), RangeVarCallbackForLockTable(), RangeVarCallbackForPolicy(), RangeVarCallbackForRenameRule(), RangeVarCallbackForRenameTrigger(), RangeVarCallbackMaintainsTable(), RangeVarCallbackOwnsRelation(), RangeVarGetAndCheckCreationNamespace(), renameatt_check(), stats_lock_check_privileges(), TargetPrivilegesCheck(), transformTableLikeClause(), and truncate_check_perms().

◆ getObjectDescription()

char * getObjectDescription ( const ObjectAddress object,
bool  missing_ok 
)

Definition at line 2911 of file objectaddress.c.

2912{
2913 StringInfoData buffer;
2914
2915 initStringInfo(&buffer);
2916
2917 switch (object->classId)
2918 {
2919 case RelationRelationId:
2920 if (object->objectSubId == 0)
2921 getRelationDescription(&buffer, object->objectId, missing_ok);
2922 else
2923 {
2924 /* column, not whole relation */
2925 StringInfoData rel;
2926 char *attname = get_attname(object->objectId,
2927 object->objectSubId,
2928 missing_ok);
2929
2930 if (!attname)
2931 break;
2932
2933 initStringInfo(&rel);
2934 getRelationDescription(&rel, object->objectId, missing_ok);
2935 /* translator: second %s is, e.g., "table %s" */
2936 appendStringInfo(&buffer, _("column %s of %s"),
2937 attname, rel.data);
2938 pfree(rel.data);
2939 }
2940 break;
2941
2942 case ProcedureRelationId:
2943 {
2946 flags);
2947
2948 if (proname == NULL)
2949 break;
2950
2951 appendStringInfo(&buffer, _("function %s"), proname);
2952 break;
2953 }
2954
2955 case TypeRelationId:
2956 {
2958 char *typname = format_type_extended(object->objectId, -1,
2959 flags);
2960
2961 if (typname == NULL)
2962 break;
2963
2964 appendStringInfo(&buffer, _("type %s"), typname);
2965 break;
2966 }
2967
2968 case CastRelationId:
2969 {
2970 Relation castDesc;
2971 ScanKeyData skey[1];
2972 SysScanDesc rcscan;
2973 HeapTuple tup;
2974 Form_pg_cast castForm;
2975
2976 castDesc = table_open(CastRelationId, AccessShareLock);
2977
2978 ScanKeyInit(&skey[0],
2979 Anum_pg_cast_oid,
2980 BTEqualStrategyNumber, F_OIDEQ,
2981 ObjectIdGetDatum(object->objectId));
2982
2983 rcscan = systable_beginscan(castDesc, CastOidIndexId, true,
2984 NULL, 1, skey);
2985
2986 tup = systable_getnext(rcscan);
2987
2988 if (!HeapTupleIsValid(tup))
2989 {
2990 if (!missing_ok)
2991 elog(ERROR, "could not find tuple for cast %u",
2992 object->objectId);
2993
2994 systable_endscan(rcscan);
2995 table_close(castDesc, AccessShareLock);
2996 break;
2997 }
2998
2999 castForm = (Form_pg_cast) GETSTRUCT(tup);
3000
3001 appendStringInfo(&buffer, _("cast from %s to %s"),
3002 format_type_be(castForm->castsource),
3003 format_type_be(castForm->casttarget));
3004
3005 systable_endscan(rcscan);
3006 table_close(castDesc, AccessShareLock);
3007 break;
3008 }
3009
3010 case CollationRelationId:
3011 {
3012 HeapTuple collTup;
3013 Form_pg_collation coll;
3014 char *nspname;
3015
3016 collTup = SearchSysCache1(COLLOID,
3017 ObjectIdGetDatum(object->objectId));
3018 if (!HeapTupleIsValid(collTup))
3019 {
3020 if (!missing_ok)
3021 elog(ERROR, "cache lookup failed for collation %u",
3022 object->objectId);
3023 break;
3024 }
3025
3026 coll = (Form_pg_collation) GETSTRUCT(collTup);
3027
3028 /* Qualify the name if not visible in search path */
3029 if (CollationIsVisible(object->objectId))
3030 nspname = NULL;
3031 else
3032 nspname = get_namespace_name(coll->collnamespace);
3033
3034 appendStringInfo(&buffer, _("collation %s"),
3036 NameStr(coll->collname)));
3037 ReleaseSysCache(collTup);
3038 break;
3039 }
3040
3041 case ConstraintRelationId:
3042 {
3043 HeapTuple conTup;
3045
3046 conTup = SearchSysCache1(CONSTROID,
3047 ObjectIdGetDatum(object->objectId));
3048 if (!HeapTupleIsValid(conTup))
3049 {
3050 if (!missing_ok)
3051 elog(ERROR, "cache lookup failed for constraint %u",
3052 object->objectId);
3053 break;
3054 }
3055
3056 con = (Form_pg_constraint) GETSTRUCT(conTup);
3057
3058 if (OidIsValid(con->conrelid))
3059 {
3060 StringInfoData rel;
3061
3062 initStringInfo(&rel);
3063 getRelationDescription(&rel, con->conrelid, false);
3064 /* translator: second %s is, e.g., "table %s" */
3065 appendStringInfo(&buffer, _("constraint %s on %s"),
3066 NameStr(con->conname), rel.data);
3067 pfree(rel.data);
3068 }
3069 else
3070 {
3071 appendStringInfo(&buffer, _("constraint %s"),
3072 NameStr(con->conname));
3073 }
3074
3075 ReleaseSysCache(conTup);
3076 break;
3077 }
3078
3079 case ConversionRelationId:
3080 {
3081 HeapTuple conTup;
3082 Form_pg_conversion conv;
3083 char *nspname;
3084
3085 conTup = SearchSysCache1(CONVOID,
3086 ObjectIdGetDatum(object->objectId));
3087 if (!HeapTupleIsValid(conTup))
3088 {
3089 if (!missing_ok)
3090 elog(ERROR, "cache lookup failed for conversion %u",
3091 object->objectId);
3092 break;
3093 }
3094
3095 conv = (Form_pg_conversion) GETSTRUCT(conTup);
3096
3097 /* Qualify the name if not visible in search path */
3098 if (ConversionIsVisible(object->objectId))
3099 nspname = NULL;
3100 else
3101 nspname = get_namespace_name(conv->connamespace);
3102
3103 appendStringInfo(&buffer, _("conversion %s"),
3105 NameStr(conv->conname)));
3106 ReleaseSysCache(conTup);
3107 break;
3108 }
3109
3110 case AttrDefaultRelationId:
3111 {
3112 ObjectAddress colobject;
3113
3114 colobject = GetAttrDefaultColumnAddress(object->objectId);
3115
3116 if (!OidIsValid(colobject.objectId))
3117 {
3118 if (!missing_ok)
3119 elog(ERROR, "could not find tuple for attrdef %u",
3120 object->objectId);
3121 break;
3122 }
3123
3124 /* translator: %s is typically "column %s of table %s" */
3125 appendStringInfo(&buffer, _("default value for %s"),
3126 getObjectDescription(&colobject, false));
3127 break;
3128 }
3129
3130 case LanguageRelationId:
3131 {
3132 char *langname = get_language_name(object->objectId,
3133 missing_ok);
3134
3135 if (langname)
3136 appendStringInfo(&buffer, _("language %s"),
3137 get_language_name(object->objectId, false));
3138 break;
3139 }
3140
3141 case LargeObjectRelationId:
3142 if (!LargeObjectExists(object->objectId))
3143 break;
3144 appendStringInfo(&buffer, _("large object %u"),
3145 object->objectId);
3146 break;
3147
3148 case OperatorRelationId:
3149 {
3151 char *oprname = format_operator_extended(object->objectId,
3152 flags);
3153
3154 if (oprname == NULL)
3155 break;
3156
3157 appendStringInfo(&buffer, _("operator %s"), oprname);
3158 break;
3159 }
3160
3161 case OperatorClassRelationId:
3162 {
3163 HeapTuple opcTup;
3164 Form_pg_opclass opcForm;
3165 HeapTuple amTup;
3166 Form_pg_am amForm;
3167 char *nspname;
3168
3169 opcTup = SearchSysCache1(CLAOID,
3170 ObjectIdGetDatum(object->objectId));
3171 if (!HeapTupleIsValid(opcTup))
3172 {
3173 if (!missing_ok)
3174 elog(ERROR, "cache lookup failed for opclass %u",
3175 object->objectId);
3176 break;
3177 }
3178
3179 opcForm = (Form_pg_opclass) GETSTRUCT(opcTup);
3180
3181 amTup = SearchSysCache1(AMOID,
3182 ObjectIdGetDatum(opcForm->opcmethod));
3183 if (!HeapTupleIsValid(amTup))
3184 elog(ERROR, "cache lookup failed for access method %u",
3185 opcForm->opcmethod);
3186 amForm = (Form_pg_am) GETSTRUCT(amTup);
3187
3188 /* Qualify the name if not visible in search path */
3189 if (OpclassIsVisible(object->objectId))
3190 nspname = NULL;
3191 else
3192 nspname = get_namespace_name(opcForm->opcnamespace);
3193
3194 appendStringInfo(&buffer, _("operator class %s for access method %s"),
3196 NameStr(opcForm->opcname)),
3197 NameStr(amForm->amname));
3198
3199 ReleaseSysCache(amTup);
3200 ReleaseSysCache(opcTup);
3201 break;
3202 }
3203
3204 case OperatorFamilyRelationId:
3205 getOpFamilyDescription(&buffer, object->objectId, missing_ok);
3206 break;
3207
3208 case AccessMethodRelationId:
3209 {
3210 HeapTuple tup;
3211
3212 tup = SearchSysCache1(AMOID,
3213 ObjectIdGetDatum(object->objectId));
3214 if (!HeapTupleIsValid(tup))
3215 {
3216 if (!missing_ok)
3217 elog(ERROR, "cache lookup failed for access method %u",
3218 object->objectId);
3219 break;
3220 }
3221
3222 appendStringInfo(&buffer, _("access method %s"),
3223 NameStr(((Form_pg_am) GETSTRUCT(tup))->amname));
3224 ReleaseSysCache(tup);
3225 break;
3226 }
3227
3228 case AccessMethodOperatorRelationId:
3229 {
3230 Relation amopDesc;
3231 HeapTuple tup;
3232 ScanKeyData skey[1];
3233 SysScanDesc amscan;
3234 Form_pg_amop amopForm;
3235 StringInfoData opfam;
3236
3237 amopDesc = table_open(AccessMethodOperatorRelationId,
3239
3240 ScanKeyInit(&skey[0],
3241 Anum_pg_amop_oid,
3242 BTEqualStrategyNumber, F_OIDEQ,
3243 ObjectIdGetDatum(object->objectId));
3244
3245 amscan = systable_beginscan(amopDesc, AccessMethodOperatorOidIndexId, true,
3246 NULL, 1, skey);
3247
3248 tup = systable_getnext(amscan);
3249
3250 if (!HeapTupleIsValid(tup))
3251 {
3252 if (!missing_ok)
3253 elog(ERROR, "could not find tuple for amop entry %u",
3254 object->objectId);
3255
3256 systable_endscan(amscan);
3257 table_close(amopDesc, AccessShareLock);
3258 break;
3259 }
3260
3261 amopForm = (Form_pg_amop) GETSTRUCT(tup);
3262
3263 initStringInfo(&opfam);
3264 getOpFamilyDescription(&opfam, amopForm->amopfamily, false);
3265
3266 /*
3267 * We use FORMAT_TYPE_ALLOW_INVALID here so as not to fail
3268 * completely if the type links are dangling, which is a form
3269 * of catalog corruption that could occur due to old bugs.
3270 */
3271
3272 /*------
3273 translator: %d is the operator strategy (a number), the
3274 first two %s's are data type names, the third %s is the
3275 description of the operator family, and the last %s is the
3276 textual form of the operator with arguments. */
3277 appendStringInfo(&buffer, _("operator %d (%s, %s) of %s: %s"),
3278 amopForm->amopstrategy,
3279 format_type_extended(amopForm->amoplefttype,
3281 format_type_extended(amopForm->amoprighttype,
3283 opfam.data,
3284 format_operator(amopForm->amopopr));
3285
3286 pfree(opfam.data);
3287
3288 systable_endscan(amscan);
3289 table_close(amopDesc, AccessShareLock);
3290 break;
3291 }
3292
3293 case AccessMethodProcedureRelationId:
3294 {
3295 Relation amprocDesc;
3296 ScanKeyData skey[1];
3297 SysScanDesc amscan;
3298 HeapTuple tup;
3299 Form_pg_amproc amprocForm;
3300 StringInfoData opfam;
3301
3302 amprocDesc = table_open(AccessMethodProcedureRelationId,
3304
3305 ScanKeyInit(&skey[0],
3306 Anum_pg_amproc_oid,
3307 BTEqualStrategyNumber, F_OIDEQ,
3308 ObjectIdGetDatum(object->objectId));
3309
3310 amscan = systable_beginscan(amprocDesc, AccessMethodProcedureOidIndexId, true,
3311 NULL, 1, skey);
3312
3313 tup = systable_getnext(amscan);
3314
3315 if (!HeapTupleIsValid(tup))
3316 {
3317 if (!missing_ok)
3318 elog(ERROR, "could not find tuple for amproc entry %u",
3319 object->objectId);
3320
3321 systable_endscan(amscan);
3322 table_close(amprocDesc, AccessShareLock);
3323 break;
3324 }
3325
3326 amprocForm = (Form_pg_amproc) GETSTRUCT(tup);
3327
3328 initStringInfo(&opfam);
3329 getOpFamilyDescription(&opfam, amprocForm->amprocfamily, false);
3330
3331 /*
3332 * We use FORMAT_TYPE_ALLOW_INVALID here so as not to fail
3333 * completely if the type links are dangling, which is a form
3334 * of catalog corruption that could occur due to old bugs.
3335 */
3336
3337 /*------
3338 translator: %d is the function number, the first two %s's
3339 are data type names, the third %s is the description of the
3340 operator family, and the last %s is the textual form of the
3341 function with arguments. */
3342 appendStringInfo(&buffer, _("function %d (%s, %s) of %s: %s"),
3343 amprocForm->amprocnum,
3344 format_type_extended(amprocForm->amproclefttype,
3346 format_type_extended(amprocForm->amprocrighttype,
3348 opfam.data,
3349 format_procedure(amprocForm->amproc));
3350
3351 pfree(opfam.data);
3352
3353 systable_endscan(amscan);
3354 table_close(amprocDesc, AccessShareLock);
3355 break;
3356 }
3357
3358 case RewriteRelationId:
3359 {
3360 Relation ruleDesc;
3361 ScanKeyData skey[1];
3362 SysScanDesc rcscan;
3363 HeapTuple tup;
3365 StringInfoData rel;
3366
3367 ruleDesc = table_open(RewriteRelationId, AccessShareLock);
3368
3369 ScanKeyInit(&skey[0],
3370 Anum_pg_rewrite_oid,
3371 BTEqualStrategyNumber, F_OIDEQ,
3372 ObjectIdGetDatum(object->objectId));
3373
3374 rcscan = systable_beginscan(ruleDesc, RewriteOidIndexId, true,
3375 NULL, 1, skey);
3376
3377 tup = systable_getnext(rcscan);
3378
3379 if (!HeapTupleIsValid(tup))
3380 {
3381 if (!missing_ok)
3382 elog(ERROR, "could not find tuple for rule %u",
3383 object->objectId);
3384
3385 systable_endscan(rcscan);
3386 table_close(ruleDesc, AccessShareLock);
3387 break;
3388 }
3389
3391
3392 initStringInfo(&rel);
3393 getRelationDescription(&rel, rule->ev_class, false);
3394
3395 /* translator: second %s is, e.g., "table %s" */
3396 appendStringInfo(&buffer, _("rule %s on %s"),
3397 NameStr(rule->rulename), rel.data);
3398 pfree(rel.data);
3399 systable_endscan(rcscan);
3400 table_close(ruleDesc, AccessShareLock);
3401 break;
3402 }
3403
3404 case TriggerRelationId:
3405 {
3406 Relation trigDesc;
3407 ScanKeyData skey[1];
3408 SysScanDesc tgscan;
3409 HeapTuple tup;
3410 Form_pg_trigger trig;
3411 StringInfoData rel;
3412
3413 trigDesc = table_open(TriggerRelationId, AccessShareLock);
3414
3415 ScanKeyInit(&skey[0],
3416 Anum_pg_trigger_oid,
3417 BTEqualStrategyNumber, F_OIDEQ,
3418 ObjectIdGetDatum(object->objectId));
3419
3420 tgscan = systable_beginscan(trigDesc, TriggerOidIndexId, true,
3421 NULL, 1, skey);
3422
3423 tup = systable_getnext(tgscan);
3424
3425 if (!HeapTupleIsValid(tup))
3426 {
3427 if (!missing_ok)
3428 elog(ERROR, "could not find tuple for trigger %u",
3429 object->objectId);
3430
3431 systable_endscan(tgscan);
3432 table_close(trigDesc, AccessShareLock);
3433 break;
3434 }
3435
3436 trig = (Form_pg_trigger) GETSTRUCT(tup);
3437
3438 initStringInfo(&rel);
3439 getRelationDescription(&rel, trig->tgrelid, false);
3440
3441 /* translator: second %s is, e.g., "table %s" */
3442 appendStringInfo(&buffer, _("trigger %s on %s"),
3443 NameStr(trig->tgname), rel.data);
3444 pfree(rel.data);
3445 systable_endscan(tgscan);
3446 table_close(trigDesc, AccessShareLock);
3447 break;
3448 }
3449
3450 case NamespaceRelationId:
3451 {
3452 char *nspname;
3453
3454 nspname = get_namespace_name(object->objectId);
3455 if (!nspname)
3456 {
3457 if (!missing_ok)
3458 elog(ERROR, "cache lookup failed for namespace %u",
3459 object->objectId);
3460 break;
3461 }
3462 appendStringInfo(&buffer, _("schema %s"), nspname);
3463 break;
3464 }
3465
3466 case StatisticExtRelationId:
3467 {
3468 HeapTuple stxTup;
3469 Form_pg_statistic_ext stxForm;
3470 char *nspname;
3471
3472 stxTup = SearchSysCache1(STATEXTOID,
3473 ObjectIdGetDatum(object->objectId));
3474 if (!HeapTupleIsValid(stxTup))
3475 {
3476 if (!missing_ok)
3477 elog(ERROR, "could not find tuple for statistics object %u",
3478 object->objectId);
3479 break;
3480 }
3481
3482 stxForm = (Form_pg_statistic_ext) GETSTRUCT(stxTup);
3483
3484 /* Qualify the name if not visible in search path */
3485 if (StatisticsObjIsVisible(object->objectId))
3486 nspname = NULL;
3487 else
3488 nspname = get_namespace_name(stxForm->stxnamespace);
3489
3490 appendStringInfo(&buffer, _("statistics object %s"),
3492 NameStr(stxForm->stxname)));
3493
3494 ReleaseSysCache(stxTup);
3495 break;
3496 }
3497
3498 case TSParserRelationId:
3499 {
3500 HeapTuple tup;
3501 Form_pg_ts_parser prsForm;
3502 char *nspname;
3503
3504 tup = SearchSysCache1(TSPARSEROID,
3505 ObjectIdGetDatum(object->objectId));
3506 if (!HeapTupleIsValid(tup))
3507 {
3508 if (!missing_ok)
3509 elog(ERROR, "cache lookup failed for text search parser %u",
3510 object->objectId);
3511 break;
3512 }
3513 prsForm = (Form_pg_ts_parser) GETSTRUCT(tup);
3514
3515 /* Qualify the name if not visible in search path */
3516 if (TSParserIsVisible(object->objectId))
3517 nspname = NULL;
3518 else
3519 nspname = get_namespace_name(prsForm->prsnamespace);
3520
3521 appendStringInfo(&buffer, _("text search parser %s"),
3523 NameStr(prsForm->prsname)));
3524 ReleaseSysCache(tup);
3525 break;
3526 }
3527
3528 case TSDictionaryRelationId:
3529 {
3530 HeapTuple tup;
3531 Form_pg_ts_dict dictForm;
3532 char *nspname;
3533
3534 tup = SearchSysCache1(TSDICTOID,
3535 ObjectIdGetDatum(object->objectId));
3536 if (!HeapTupleIsValid(tup))
3537 {
3538 if (!missing_ok)
3539 elog(ERROR, "cache lookup failed for text search dictionary %u",
3540 object->objectId);
3541 break;
3542 }
3543
3544 dictForm = (Form_pg_ts_dict) GETSTRUCT(tup);
3545
3546 /* Qualify the name if not visible in search path */
3547 if (TSDictionaryIsVisible(object->objectId))
3548 nspname = NULL;
3549 else
3550 nspname = get_namespace_name(dictForm->dictnamespace);
3551
3552 appendStringInfo(&buffer, _("text search dictionary %s"),
3554 NameStr(dictForm->dictname)));
3555 ReleaseSysCache(tup);
3556 break;
3557 }
3558
3559 case TSTemplateRelationId:
3560 {
3561 HeapTuple tup;
3562 Form_pg_ts_template tmplForm;
3563 char *nspname;
3564
3565 tup = SearchSysCache1(TSTEMPLATEOID,
3566 ObjectIdGetDatum(object->objectId));
3567 if (!HeapTupleIsValid(tup))
3568 {
3569 if (!missing_ok)
3570 elog(ERROR, "cache lookup failed for text search template %u",
3571 object->objectId);
3572 break;
3573 }
3574
3575 tmplForm = (Form_pg_ts_template) GETSTRUCT(tup);
3576
3577 /* Qualify the name if not visible in search path */
3578 if (TSTemplateIsVisible(object->objectId))
3579 nspname = NULL;
3580 else
3581 nspname = get_namespace_name(tmplForm->tmplnamespace);
3582
3583 appendStringInfo(&buffer, _("text search template %s"),
3585 NameStr(tmplForm->tmplname)));
3586 ReleaseSysCache(tup);
3587 break;
3588 }
3589
3590 case TSConfigRelationId:
3591 {
3592 HeapTuple tup;
3593 Form_pg_ts_config cfgForm;
3594 char *nspname;
3595
3596 tup = SearchSysCache1(TSCONFIGOID,
3597 ObjectIdGetDatum(object->objectId));
3598 if (!HeapTupleIsValid(tup))
3599 {
3600 if (!missing_ok)
3601 elog(ERROR, "cache lookup failed for text search configuration %u",
3602 object->objectId);
3603 break;
3604 }
3605
3606 cfgForm = (Form_pg_ts_config) GETSTRUCT(tup);
3607
3608 /* Qualify the name if not visible in search path */
3609 if (TSConfigIsVisible(object->objectId))
3610 nspname = NULL;
3611 else
3612 nspname = get_namespace_name(cfgForm->cfgnamespace);
3613
3614 appendStringInfo(&buffer, _("text search configuration %s"),
3616 NameStr(cfgForm->cfgname)));
3617 ReleaseSysCache(tup);
3618 break;
3619 }
3620
3621 case AuthIdRelationId:
3622 {
3623 char *username = GetUserNameFromId(object->objectId,
3624 missing_ok);
3625
3626 if (username)
3627 appendStringInfo(&buffer, _("role %s"), username);
3628 break;
3629 }
3630
3631 case AuthMemRelationId:
3632 {
3633 Relation amDesc;
3634 ScanKeyData skey[1];
3635 SysScanDesc rcscan;
3636 HeapTuple tup;
3637 Form_pg_auth_members amForm;
3638
3639 amDesc = table_open(AuthMemRelationId, AccessShareLock);
3640
3641 ScanKeyInit(&skey[0],
3642 Anum_pg_auth_members_oid,
3643 BTEqualStrategyNumber, F_OIDEQ,
3644 ObjectIdGetDatum(object->objectId));
3645
3646 rcscan = systable_beginscan(amDesc, AuthMemOidIndexId, true,
3647 NULL, 1, skey);
3648
3649 tup = systable_getnext(rcscan);
3650
3651 if (!HeapTupleIsValid(tup))
3652 {
3653 if (!missing_ok)
3654 elog(ERROR, "could not find tuple for role membership %u",
3655 object->objectId);
3656
3657 systable_endscan(rcscan);
3659 break;
3660 }
3661
3662 amForm = (Form_pg_auth_members) GETSTRUCT(tup);
3663
3664 appendStringInfo(&buffer, _("membership of role %s in role %s"),
3665 GetUserNameFromId(amForm->member, false),
3666 GetUserNameFromId(amForm->roleid, false));
3667
3668 systable_endscan(rcscan);
3670 break;
3671 }
3672
3673 case DatabaseRelationId:
3674 {
3675 char *datname;
3676
3678 if (!datname)
3679 {
3680 if (!missing_ok)
3681 elog(ERROR, "cache lookup failed for database %u",
3682 object->objectId);
3683 break;
3684 }
3685 appendStringInfo(&buffer, _("database %s"), datname);
3686 break;
3687 }
3688
3689 case TableSpaceRelationId:
3690 {
3691 char *tblspace;
3692
3693 tblspace = get_tablespace_name(object->objectId);
3694 if (!tblspace)
3695 {
3696 if (!missing_ok)
3697 elog(ERROR, "cache lookup failed for tablespace %u",
3698 object->objectId);
3699 break;
3700 }
3701 appendStringInfo(&buffer, _("tablespace %s"), tblspace);
3702 break;
3703 }
3704
3705 case ForeignDataWrapperRelationId:
3706 {
3707 ForeignDataWrapper *fdw;
3708
3710 missing_ok);
3711 if (fdw)
3712 appendStringInfo(&buffer, _("foreign-data wrapper %s"), fdw->fdwname);
3713 break;
3714 }
3715
3716 case ForeignServerRelationId:
3717 {
3718 ForeignServer *srv;
3719
3720 srv = GetForeignServerExtended(object->objectId, missing_ok);
3721 if (srv)
3722 appendStringInfo(&buffer, _("server %s"), srv->servername);
3723 break;
3724 }
3725
3726 case UserMappingRelationId:
3727 {
3728 HeapTuple tup;
3729 Oid useid;
3730 char *usename;
3731 Form_pg_user_mapping umform;
3732 ForeignServer *srv;
3733
3734 tup = SearchSysCache1(USERMAPPINGOID,
3735 ObjectIdGetDatum(object->objectId));
3736 if (!HeapTupleIsValid(tup))
3737 {
3738 if (!missing_ok)
3739 elog(ERROR, "cache lookup failed for user mapping %u",
3740 object->objectId);
3741 break;
3742 }
3743
3744 umform = (Form_pg_user_mapping) GETSTRUCT(tup);
3745 useid = umform->umuser;
3746 srv = GetForeignServer(umform->umserver);
3747
3748 ReleaseSysCache(tup);
3749
3750 if (OidIsValid(useid))
3751 usename = GetUserNameFromId(useid, false);
3752 else
3753 usename = "public";
3754
3755 appendStringInfo(&buffer, _("user mapping for %s on server %s"), usename,
3756 srv->servername);
3757 break;
3758 }
3759
3760 case DefaultAclRelationId:
3761 {
3762 Relation defaclrel;
3763 ScanKeyData skey[1];
3764 SysScanDesc rcscan;
3765 HeapTuple tup;
3766 Form_pg_default_acl defacl;
3767 char *rolename;
3768 char *nspname;
3769
3770 defaclrel = table_open(DefaultAclRelationId, AccessShareLock);
3771
3772 ScanKeyInit(&skey[0],
3773 Anum_pg_default_acl_oid,
3774 BTEqualStrategyNumber, F_OIDEQ,
3775 ObjectIdGetDatum(object->objectId));
3776
3777 rcscan = systable_beginscan(defaclrel, DefaultAclOidIndexId,
3778 true, NULL, 1, skey);
3779
3780 tup = systable_getnext(rcscan);
3781
3782 if (!HeapTupleIsValid(tup))
3783 {
3784 if (!missing_ok)
3785 elog(ERROR, "could not find tuple for default ACL %u",
3786 object->objectId);
3787
3788 systable_endscan(rcscan);
3789 table_close(defaclrel, AccessShareLock);
3790 break;
3791 }
3792
3793 defacl = (Form_pg_default_acl) GETSTRUCT(tup);
3794
3795 rolename = GetUserNameFromId(defacl->defaclrole, false);
3796
3797 if (OidIsValid(defacl->defaclnamespace))
3798 nspname = get_namespace_name(defacl->defaclnamespace);
3799 else
3800 nspname = NULL;
3801
3802 switch (defacl->defaclobjtype)
3803 {
3804 case DEFACLOBJ_RELATION:
3805 if (nspname)
3806 appendStringInfo(&buffer,
3807 _("default privileges on new relations belonging to role %s in schema %s"),
3808 rolename, nspname);
3809 else
3810 appendStringInfo(&buffer,
3811 _("default privileges on new relations belonging to role %s"),
3812 rolename);
3813 break;
3814 case DEFACLOBJ_SEQUENCE:
3815 if (nspname)
3816 appendStringInfo(&buffer,
3817 _("default privileges on new sequences belonging to role %s in schema %s"),
3818 rolename, nspname);
3819 else
3820 appendStringInfo(&buffer,
3821 _("default privileges on new sequences belonging to role %s"),
3822 rolename);
3823 break;
3824 case DEFACLOBJ_FUNCTION:
3825 if (nspname)
3826 appendStringInfo(&buffer,
3827 _("default privileges on new functions belonging to role %s in schema %s"),
3828 rolename, nspname);
3829 else
3830 appendStringInfo(&buffer,
3831 _("default privileges on new functions belonging to role %s"),
3832 rolename);
3833 break;
3834 case DEFACLOBJ_TYPE:
3835 if (nspname)
3836 appendStringInfo(&buffer,
3837 _("default privileges on new types belonging to role %s in schema %s"),
3838 rolename, nspname);
3839 else
3840 appendStringInfo(&buffer,
3841 _("default privileges on new types belonging to role %s"),
3842 rolename);
3843 break;
3844 case DEFACLOBJ_NAMESPACE:
3845 Assert(!nspname);
3846 appendStringInfo(&buffer,
3847 _("default privileges on new schemas belonging to role %s"),
3848 rolename);
3849 break;
3850 case DEFACLOBJ_LARGEOBJECT:
3851 Assert(!nspname);
3852 appendStringInfo(&buffer,
3853 _("default privileges on new large objects belonging to role %s"),
3854 rolename);
3855 break;
3856 default:
3857 /* shouldn't get here */
3858 if (nspname)
3859 appendStringInfo(&buffer,
3860 _("default privileges belonging to role %s in schema %s"),
3861 rolename, nspname);
3862 else
3863 appendStringInfo(&buffer,
3864 _("default privileges belonging to role %s"),
3865 rolename);
3866 break;
3867 }
3868
3869 systable_endscan(rcscan);
3870 table_close(defaclrel, AccessShareLock);
3871 break;
3872 }
3873
3874 case ExtensionRelationId:
3875 {
3876 char *extname;
3877
3878 extname = get_extension_name(object->objectId);
3879 if (!extname)
3880 {
3881 if (!missing_ok)
3882 elog(ERROR, "cache lookup failed for extension %u",
3883 object->objectId);
3884 break;
3885 }
3886 appendStringInfo(&buffer, _("extension %s"), extname);
3887 break;
3888 }
3889
3890 case EventTriggerRelationId:
3891 {
3892 HeapTuple tup;
3893
3894 tup = SearchSysCache1(EVENTTRIGGEROID,
3895 ObjectIdGetDatum(object->objectId));
3896 if (!HeapTupleIsValid(tup))
3897 {
3898 if (!missing_ok)
3899 elog(ERROR, "cache lookup failed for event trigger %u",
3900 object->objectId);
3901 break;
3902 }
3903 appendStringInfo(&buffer, _("event trigger %s"),
3904 NameStr(((Form_pg_event_trigger) GETSTRUCT(tup))->evtname));
3905 ReleaseSysCache(tup);
3906 break;
3907 }
3908
3909 case ParameterAclRelationId:
3910 {
3911 HeapTuple tup;
3912 Datum nameDatum;
3913 char *parname;
3914
3915 tup = SearchSysCache1(PARAMETERACLOID,
3916 ObjectIdGetDatum(object->objectId));
3917 if (!HeapTupleIsValid(tup))
3918 {
3919 if (!missing_ok)
3920 elog(ERROR, "cache lookup failed for parameter ACL %u",
3921 object->objectId);
3922 break;
3923 }
3924 nameDatum = SysCacheGetAttrNotNull(PARAMETERACLOID, tup,
3925 Anum_pg_parameter_acl_parname);
3926 parname = TextDatumGetCString(nameDatum);
3927 appendStringInfo(&buffer, _("parameter %s"), parname);
3928 ReleaseSysCache(tup);
3929 break;
3930 }
3931
3932 case PolicyRelationId:
3933 {
3934 Relation policy_rel;
3935 ScanKeyData skey[1];
3936 SysScanDesc sscan;
3937 HeapTuple tuple;
3938 Form_pg_policy form_policy;
3939 StringInfoData rel;
3940
3941 policy_rel = table_open(PolicyRelationId, AccessShareLock);
3942
3943 ScanKeyInit(&skey[0],
3944 Anum_pg_policy_oid,
3945 BTEqualStrategyNumber, F_OIDEQ,
3946 ObjectIdGetDatum(object->objectId));
3947
3948 sscan = systable_beginscan(policy_rel, PolicyOidIndexId,
3949 true, NULL, 1, skey);
3950
3951 tuple = systable_getnext(sscan);
3952
3953 if (!HeapTupleIsValid(tuple))
3954 {
3955 if (!missing_ok)
3956 elog(ERROR, "could not find tuple for policy %u",
3957 object->objectId);
3958
3959 systable_endscan(sscan);
3960 table_close(policy_rel, AccessShareLock);
3961 break;
3962 }
3963
3964 form_policy = (Form_pg_policy) GETSTRUCT(tuple);
3965
3966 initStringInfo(&rel);
3967 getRelationDescription(&rel, form_policy->polrelid, false);
3968
3969 /* translator: second %s is, e.g., "table %s" */
3970 appendStringInfo(&buffer, _("policy %s on %s"),
3971 NameStr(form_policy->polname), rel.data);
3972 pfree(rel.data);
3973 systable_endscan(sscan);
3974 table_close(policy_rel, AccessShareLock);
3975 break;
3976 }
3977
3978 case PublicationRelationId:
3979 {
3980 char *pubname = get_publication_name(object->objectId,
3981 missing_ok);
3982
3983 if (pubname)
3984 appendStringInfo(&buffer, _("publication %s"), pubname);
3985 break;
3986 }
3987
3988 case PublicationNamespaceRelationId:
3989 {
3990 char *pubname;
3991 char *nspname;
3992
3993 if (!getPublicationSchemaInfo(object, missing_ok,
3994 &pubname, &nspname))
3995 break;
3996
3997 appendStringInfo(&buffer, _("publication of schema %s in publication %s"),
3998 nspname, pubname);
3999 pfree(pubname);
4000 pfree(nspname);
4001 break;
4002 }
4003
4004 case PublicationRelRelationId:
4005 {
4006 HeapTuple tup;
4007 char *pubname;
4009 StringInfoData rel;
4010
4011 tup = SearchSysCache1(PUBLICATIONREL,
4012 ObjectIdGetDatum(object->objectId));
4013 if (!HeapTupleIsValid(tup))
4014 {
4015 if (!missing_ok)
4016 elog(ERROR, "cache lookup failed for publication table %u",
4017 object->objectId);
4018 break;
4019 }
4020
4021 prform = (Form_pg_publication_rel) GETSTRUCT(tup);
4022 pubname = get_publication_name(prform->prpubid, false);
4023
4024 initStringInfo(&rel);
4025 getRelationDescription(&rel, prform->prrelid, false);
4026
4027 /* translator: first %s is, e.g., "table %s" */
4028 appendStringInfo(&buffer, _("publication of %s in publication %s"),
4029 rel.data, pubname);
4030 pfree(rel.data);
4031 ReleaseSysCache(tup);
4032 break;
4033 }
4034
4035 case SubscriptionRelationId:
4036 {
4037 char *subname = get_subscription_name(object->objectId,
4038 missing_ok);
4039
4040 if (subname)
4041 appendStringInfo(&buffer, _("subscription %s"), subname);
4042 break;
4043 }
4044
4045 case TransformRelationId:
4046 {
4047 HeapTuple trfTup;
4048 Form_pg_transform trfForm;
4049
4050 trfTup = SearchSysCache1(TRFOID,
4051 ObjectIdGetDatum(object->objectId));
4052 if (!HeapTupleIsValid(trfTup))
4053 {
4054 if (!missing_ok)
4055 elog(ERROR, "could not find tuple for transform %u",
4056 object->objectId);
4057 break;
4058 }
4059
4060 trfForm = (Form_pg_transform) GETSTRUCT(trfTup);
4061
4062 appendStringInfo(&buffer, _("transform for %s language %s"),
4063 format_type_be(trfForm->trftype),
4064 get_language_name(trfForm->trflang, false));
4065
4066 ReleaseSysCache(trfTup);
4067 break;
4068 }
4069
4070 default:
4071 elog(ERROR, "unsupported object class: %u", object->classId);
4072 }
4073
4074 /* an empty buffer is equivalent to no object found */
4075 if (buffer.len == 0)
4076 return NULL;
4077
4078 return buffer.data;
4079}
char * get_tablespace_name(Oid spc_oid)
Definition: tablespace.c:1472
#define FORMAT_TYPE_ALLOW_INVALID
Definition: builtins.h:125
#define TextDatumGetCString(d)
Definition: builtins.h:98
#define FORMAT_TYPE_INVALID_AS_NULL
Definition: builtins.h:127
#define NameStr(name)
Definition: c.h:752
uint16 bits16
Definition: c.h:547
#define _(x)
Definition: elog.c:91
char * get_extension_name(Oid ext_oid)
Definition: extension.c:189
ForeignServer * GetForeignServer(Oid serverid)
Definition: foreign.c:112
ForeignDataWrapper * GetForeignDataWrapperExtended(Oid fdwid, bits16 flags)
Definition: foreign.c:50
ForeignServer * GetForeignServerExtended(Oid serverid, bits16 flags)
Definition: foreign.c:124
char * format_type_extended(Oid type_oid, int32 typemod, bits16 flags)
Definition: format_type.c:112
static char * username
Definition: initdb.c:153
#define AccessShareLock
Definition: lockdefs.h:36
char * get_database_name(Oid dbid)
Definition: lsyscache.c:1259
char * get_language_name(Oid langoid, bool missing_ok)
Definition: lsyscache.c:1280
char * get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
Definition: lsyscache.c:920
char * get_subscription_name(Oid subid, bool missing_ok)
Definition: lsyscache.c:3862
char * get_publication_name(Oid pubid, bool missing_ok)
Definition: lsyscache.c:3812
char * get_namespace_name(Oid nspid)
Definition: lsyscache.c:3533
void pfree(void *pointer)
Definition: mcxt.c:1594
bool TSTemplateIsVisible(Oid tmplId)
Definition: namespace.c:3135
bool CollationIsVisible(Oid collid)
Definition: namespace.c:2474
bool ConversionIsVisible(Oid conid)
Definition: namespace.c:2576
bool OpclassIsVisible(Oid opcid)
Definition: namespace.c:2221
bool TSParserIsVisible(Oid prsId)
Definition: namespace.c:2844
bool TSConfigIsVisible(Oid cfgid)
Definition: namespace.c:3280
bool StatisticsObjIsVisible(Oid stxid)
Definition: namespace.c:2699
bool TSDictionaryIsVisible(Oid dictId)
Definition: namespace.c:2989
static void getRelationDescription(StringInfo buffer, Oid relid, bool missing_ok)
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
static bool getPublicationSchemaInfo(const ObjectAddress *object, bool missing_ok, char **pubname, char **nspname)
static void getOpFamilyDescription(StringInfo buffer, Oid opfid, bool missing_ok)
FormData_pg_am * Form_pg_am
Definition: pg_am.h:48
FormData_pg_amop * Form_pg_amop
Definition: pg_amop.h:88
FormData_pg_amproc * Form_pg_amproc
Definition: pg_amproc.h:68
ObjectAddress GetAttrDefaultColumnAddress(Oid attrdefoid)
Definition: pg_attrdef.c:320
NameData attname
Definition: pg_attribute.h:41
FormData_pg_auth_members * Form_pg_auth_members
FormData_pg_cast * Form_pg_cast
Definition: pg_cast.h:57
FormData_pg_collation * Form_pg_collation
Definition: pg_collation.h:58
FormData_pg_conversion * Form_pg_conversion
Definition: pg_conversion.h:61
NameData datname
Definition: pg_database.h:35
FormData_pg_default_acl * Form_pg_default_acl
FormData_pg_event_trigger * Form_pg_event_trigger
FormData_pg_opclass * Form_pg_opclass
Definition: pg_opclass.h:83
FormData_pg_policy * Form_pg_policy
Definition: pg_policy.h:51
NameData proname
Definition: pg_proc.h:35
FormData_pg_publication_rel * Form_pg_publication_rel
FormData_pg_rewrite * Form_pg_rewrite
Definition: pg_rewrite.h:52
FormData_pg_statistic_ext * Form_pg_statistic_ext
NameData subname
FormData_pg_transform * Form_pg_transform
Definition: pg_transform.h:43
FormData_pg_trigger * Form_pg_trigger
Definition: pg_trigger.h:80
FormData_pg_ts_config * Form_pg_ts_config
Definition: pg_ts_config.h:48
FormData_pg_ts_dict * Form_pg_ts_dict
Definition: pg_ts_dict.h:52
FormData_pg_ts_parser * Form_pg_ts_parser
Definition: pg_ts_parser.h:55
FormData_pg_ts_template * Form_pg_ts_template
NameData typname
Definition: pg_type.h:41
FormData_pg_user_mapping * Form_pg_user_mapping
uint64_t Datum
Definition: postgres.h:70
char * format_procedure_extended(Oid procedure_oid, bits16 flags)
Definition: regproc.c:332
char * format_procedure(Oid procedure_oid)
Definition: regproc.c:305
char * format_operator_extended(Oid operator_oid, bits16 flags)
Definition: regproc.c:730
char * format_operator(Oid operator_oid)
Definition: regproc.c:801
#define FORMAT_OPERATOR_INVALID_AS_NULL
Definition: regproc.h:24
#define FORMAT_PROC_INVALID_AS_NULL
Definition: regproc.h:19
char * quote_qualified_identifier(const char *qualifier, const char *ident)
Definition: ruleutils.c:13114
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:145
void initStringInfo(StringInfo str)
Definition: stringinfo.c:97
char * fdwname
Definition: foreign.h:28
char * servername
Definition: foreign.h:39
Definition: localtime.c:73
void table_close(Relation relation, LOCKMODE lockmode)
Definition: table.c:126
Relation table_open(Oid relationId, LOCKMODE lockmode)
Definition: table.c:40

References _, AccessShareLock, appendStringInfo(), Assert(), attname, BTEqualStrategyNumber, ObjectAddress::classId, CollationIsVisible(), ConversionIsVisible(), StringInfoData::data, datname, elog, ERROR, ForeignDataWrapper::fdwname, format_operator(), format_operator_extended(), FORMAT_OPERATOR_INVALID_AS_NULL, FORMAT_PROC_INVALID_AS_NULL, format_procedure(), format_procedure_extended(), FORMAT_TYPE_ALLOW_INVALID, format_type_be(), format_type_extended(), FORMAT_TYPE_INVALID_AS_NULL, get_attname(), get_database_name(), get_extension_name(), get_language_name(), get_namespace_name(), get_publication_name(), get_subscription_name(), get_tablespace_name(), GetAttrDefaultColumnAddress(), GetForeignDataWrapperExtended(), GetForeignServer(), GetForeignServerExtended(), getObjectDescription(), getOpFamilyDescription(), getPublicationSchemaInfo(), getRelationDescription(), GETSTRUCT(), GetUserNameFromId(), HeapTupleIsValid, initStringInfo(), LargeObjectExists(), StringInfoData::len, NameStr, ObjectAddress::objectId, ObjectIdGetDatum(), ObjectAddress::objectSubId, OidIsValid, OpclassIsVisible(), pfree(), proname, quote_qualified_identifier(), ReleaseSysCache(), ScanKeyInit(), SearchSysCache1(), ForeignServer::servername, StatisticsObjIsVisible(), subname, SysCacheGetAttrNotNull(), systable_beginscan(), systable_endscan(), systable_getnext(), table_close(), table_open(), TextDatumGetCString, TSConfigIsVisible(), TSDictionaryIsVisible(), TSParserIsVisible(), TSTemplateIsVisible(), typname, and username.

Referenced by AlterExtensionNamespace(), ATExecAlterColumnType(), changeDependenciesOn(), check_relation_privileges(), checkMembershipInCurrentExtension(), checkSharedDependencies(), ExecAlterExtensionContentsRecurse(), findDependentObjects(), get_altertable_subcmdinfo(), get_object_address_opf_member(), getObjectDescription(), getObjectDescriptionOids(), pg_describe_object(), recordDependencyOnCurrentExtension(), RememberAllDependentForRebuilding(), reportDependentObjects(), sepgsql_fmgr_hook(), shdepDropOwned(), shdepReassignOwned(), and storeObjectDescription().

◆ getObjectDescriptionOids()

char * getObjectDescriptionOids ( Oid  classid,
Oid  objid 
)

Definition at line 4085 of file objectaddress.c.

4086{
4087 ObjectAddress address;
4088
4089 address.classId = classid;
4090 address.objectId = objid;
4091 address.objectSubId = 0;
4092
4093 return getObjectDescription(&address, false);
4094}

References ObjectAddress::classId, getObjectDescription(), ObjectAddress::objectId, and ObjectAddress::objectSubId.

Referenced by AlterObjectNamespace_internal(), and AlterObjectRename_internal().

◆ getObjectIdentity()

◆ getObjectIdentityParts()

char * getObjectIdentityParts ( const ObjectAddress object,
List **  objname,
List **  objargs,
bool  missing_ok 
)

Definition at line 4838 of file objectaddress.c.

4841{
4842 StringInfoData buffer;
4843
4844 initStringInfo(&buffer);
4845
4846 /*
4847 * Make sure that both objname and objargs were passed, or none was; and
4848 * initialize them to empty lists. For objname this is useless because it
4849 * will be initialized in all cases inside the switch; but we do it anyway
4850 * so that we can test below that no branch leaves it unset.
4851 */
4852 Assert((objname != NULL) == (objargs != NULL));
4853 if (objname)
4854 {
4855 *objname = NIL;
4856 *objargs = NIL;
4857 }
4858
4859 switch (object->classId)
4860 {
4861 case RelationRelationId:
4862 {
4863 char *attr = NULL;
4864
4865 /*
4866 * Check for the attribute first, so as if it is missing we
4867 * can skip the entire relation description.
4868 */
4869 if (object->objectSubId != 0)
4870 {
4871 attr = get_attname(object->objectId,
4872 object->objectSubId,
4873 missing_ok);
4874
4875 if (missing_ok && attr == NULL)
4876 break;
4877 }
4878
4879 getRelationIdentity(&buffer, object->objectId, objname,
4880 missing_ok);
4881 if (objname && *objname == NIL)
4882 break;
4883
4884 if (attr)
4885 {
4886 appendStringInfo(&buffer, ".%s",
4887 quote_identifier(attr));
4888 if (objname)
4889 *objname = lappend(*objname, attr);
4890 }
4891 }
4892 break;
4893
4894 case ProcedureRelationId:
4895 {
4898 flags);
4899
4900 if (proname == NULL)
4901 break;
4902
4904 if (objname)
4905 format_procedure_parts(object->objectId, objname, objargs,
4906 missing_ok);
4907 break;
4908 }
4909
4910 case TypeRelationId:
4911 {
4913 char *typeout;
4914
4915 typeout = format_type_extended(object->objectId, -1, flags);
4916
4917 if (typeout == NULL)
4918 break;
4919
4920 appendStringInfoString(&buffer, typeout);
4921 if (objname)
4922 *objname = list_make1(typeout);
4923 }
4924 break;
4925
4926 case CastRelationId:
4927 {
4928 Relation castRel;
4929 HeapTuple tup;
4930 Form_pg_cast castForm;
4931
4932 castRel = table_open(CastRelationId, AccessShareLock);
4933
4934 tup = get_catalog_object_by_oid(castRel, Anum_pg_cast_oid,
4935 object->objectId);
4936
4937 if (!HeapTupleIsValid(tup))
4938 {
4939 if (!missing_ok)
4940 elog(ERROR, "could not find tuple for cast %u",
4941 object->objectId);
4942
4943 table_close(castRel, AccessShareLock);
4944 break;
4945 }
4946
4947 castForm = (Form_pg_cast) GETSTRUCT(tup);
4948
4949 appendStringInfo(&buffer, "(%s AS %s)",
4950 format_type_be_qualified(castForm->castsource),
4951 format_type_be_qualified(castForm->casttarget));
4952
4953 if (objname)
4954 {
4955 *objname = list_make1(format_type_be_qualified(castForm->castsource));
4956 *objargs = list_make1(format_type_be_qualified(castForm->casttarget));
4957 }
4958
4959 table_close(castRel, AccessShareLock);
4960 break;
4961 }
4962
4963 case CollationRelationId:
4964 {
4965 HeapTuple collTup;
4966 Form_pg_collation coll;
4967 char *schema;
4968
4969 collTup = SearchSysCache1(COLLOID,
4970 ObjectIdGetDatum(object->objectId));
4971 if (!HeapTupleIsValid(collTup))
4972 {
4973 if (!missing_ok)
4974 elog(ERROR, "cache lookup failed for collation %u",
4975 object->objectId);
4976 break;
4977 }
4978 coll = (Form_pg_collation) GETSTRUCT(collTup);
4979 schema = get_namespace_name_or_temp(coll->collnamespace);
4980 appendStringInfoString(&buffer,
4982 NameStr(coll->collname)));
4983 if (objname)
4984 *objname = list_make2(schema,
4985 pstrdup(NameStr(coll->collname)));
4986 ReleaseSysCache(collTup);
4987 break;
4988 }
4989
4990 case ConstraintRelationId:
4991 {
4992 HeapTuple conTup;
4994
4995 conTup = SearchSysCache1(CONSTROID,
4996 ObjectIdGetDatum(object->objectId));
4997 if (!HeapTupleIsValid(conTup))
4998 {
4999 if (!missing_ok)
5000 elog(ERROR, "cache lookup failed for constraint %u",
5001 object->objectId);
5002 break;
5003 }
5004 con = (Form_pg_constraint) GETSTRUCT(conTup);
5005
5006 if (OidIsValid(con->conrelid))
5007 {
5008 appendStringInfo(&buffer, "%s on ",
5009 quote_identifier(NameStr(con->conname)));
5010 getRelationIdentity(&buffer, con->conrelid, objname,
5011 false);
5012 if (objname)
5013 *objname = lappend(*objname, pstrdup(NameStr(con->conname)));
5014 }
5015 else
5016 {
5017 ObjectAddress domain;
5018
5019 Assert(OidIsValid(con->contypid));
5020 domain.classId = TypeRelationId;
5021 domain.objectId = con->contypid;
5022 domain.objectSubId = 0;
5023
5024 appendStringInfo(&buffer, "%s on %s",
5025 quote_identifier(NameStr(con->conname)),
5026 getObjectIdentityParts(&domain, objname,
5027 objargs, false));
5028
5029 if (objname)
5030 *objargs = lappend(*objargs, pstrdup(NameStr(con->conname)));
5031 }
5032
5033 ReleaseSysCache(conTup);
5034 break;
5035 }
5036
5037 case ConversionRelationId:
5038 {
5039 HeapTuple conTup;
5040 Form_pg_conversion conForm;
5041 char *schema;
5042
5043 conTup = SearchSysCache1(CONVOID,
5044 ObjectIdGetDatum(object->objectId));
5045 if (!HeapTupleIsValid(conTup))
5046 {
5047 if (!missing_ok)
5048 elog(ERROR, "cache lookup failed for conversion %u",
5049 object->objectId);
5050 break;
5051 }
5052 conForm = (Form_pg_conversion) GETSTRUCT(conTup);
5053 schema = get_namespace_name_or_temp(conForm->connamespace);
5054 appendStringInfoString(&buffer,
5056 NameStr(conForm->conname)));
5057 if (objname)
5058 *objname = list_make2(schema,
5059 pstrdup(NameStr(conForm->conname)));
5060 ReleaseSysCache(conTup);
5061 break;
5062 }
5063
5064 case AttrDefaultRelationId:
5065 {
5066 ObjectAddress colobject;
5067
5068 colobject = GetAttrDefaultColumnAddress(object->objectId);
5069
5070 if (!OidIsValid(colobject.objectId))
5071 {
5072 if (!missing_ok)
5073 elog(ERROR, "could not find tuple for attrdef %u",
5074 object->objectId);
5075 break;
5076 }
5077
5078 appendStringInfo(&buffer, "for %s",
5079 getObjectIdentityParts(&colobject,
5080 objname, objargs,
5081 false));
5082 break;
5083 }
5084
5085 case LanguageRelationId:
5086 {
5087 HeapTuple langTup;
5088 Form_pg_language langForm;
5089
5090 langTup = SearchSysCache1(LANGOID,
5091 ObjectIdGetDatum(object->objectId));
5092 if (!HeapTupleIsValid(langTup))
5093 {
5094 if (!missing_ok)
5095 elog(ERROR, "cache lookup failed for language %u",
5096 object->objectId);
5097 break;
5098 }
5099 langForm = (Form_pg_language) GETSTRUCT(langTup);
5100 appendStringInfoString(&buffer,
5101 quote_identifier(NameStr(langForm->lanname)));
5102 if (objname)
5103 *objname = list_make1(pstrdup(NameStr(langForm->lanname)));
5104 ReleaseSysCache(langTup);
5105 break;
5106 }
5107
5108 case LargeObjectRelationId:
5109 if (!LargeObjectExists(object->objectId))
5110 break;
5111 appendStringInfo(&buffer, "%u",
5112 object->objectId);
5113 if (objname)
5114 *objname = list_make1(psprintf("%u", object->objectId));
5115 break;
5116
5117 case OperatorRelationId:
5118 {
5120 char *oprname = format_operator_extended(object->objectId,
5121 flags);
5122
5123 if (oprname == NULL)
5124 break;
5125
5126 appendStringInfoString(&buffer, oprname);
5127 if (objname)
5128 format_operator_parts(object->objectId, objname, objargs, missing_ok);
5129 break;
5130 }
5131
5132 case OperatorClassRelationId:
5133 {
5134 HeapTuple opcTup;
5135 Form_pg_opclass opcForm;
5136 HeapTuple amTup;
5137 Form_pg_am amForm;
5138 char *schema;
5139
5140 opcTup = SearchSysCache1(CLAOID,
5141 ObjectIdGetDatum(object->objectId));
5142 if (!HeapTupleIsValid(opcTup))
5143 {
5144 if (!missing_ok)
5145 elog(ERROR, "cache lookup failed for opclass %u",
5146 object->objectId);
5147 break;
5148 }
5149 opcForm = (Form_pg_opclass) GETSTRUCT(opcTup);
5150 schema = get_namespace_name_or_temp(opcForm->opcnamespace);
5151
5152 amTup = SearchSysCache1(AMOID,
5153 ObjectIdGetDatum(opcForm->opcmethod));
5154 if (!HeapTupleIsValid(amTup))
5155 elog(ERROR, "cache lookup failed for access method %u",
5156 opcForm->opcmethod);
5157 amForm = (Form_pg_am) GETSTRUCT(amTup);
5158
5159 appendStringInfo(&buffer, "%s USING %s",
5161 NameStr(opcForm->opcname)),
5162 quote_identifier(NameStr(amForm->amname)));
5163 if (objname)
5164 *objname = list_make3(pstrdup(NameStr(amForm->amname)),
5165 schema,
5166 pstrdup(NameStr(opcForm->opcname)));
5167
5168 ReleaseSysCache(amTup);
5169 ReleaseSysCache(opcTup);
5170 break;
5171 }
5172
5173 case OperatorFamilyRelationId:
5174 getOpFamilyIdentity(&buffer, object->objectId, objname,
5175 missing_ok);
5176 break;
5177
5178 case AccessMethodRelationId:
5179 {
5180 char *amname;
5181
5182 amname = get_am_name(object->objectId);
5183 if (!amname)
5184 {
5185 if (!missing_ok)
5186 elog(ERROR, "cache lookup failed for access method %u",
5187 object->objectId);
5188 break;
5189 }
5190 appendStringInfoString(&buffer, quote_identifier(amname));
5191 if (objname)
5192 *objname = list_make1(amname);
5193 }
5194 break;
5195
5196 case AccessMethodOperatorRelationId:
5197 {
5198 Relation amopDesc;
5199 HeapTuple tup;
5200 ScanKeyData skey[1];
5201 SysScanDesc amscan;
5202 Form_pg_amop amopForm;
5203 StringInfoData opfam;
5204 char *ltype;
5205 char *rtype;
5206
5207 amopDesc = table_open(AccessMethodOperatorRelationId,
5209
5210 ScanKeyInit(&skey[0],
5211 Anum_pg_amop_oid,
5212 BTEqualStrategyNumber, F_OIDEQ,
5213 ObjectIdGetDatum(object->objectId));
5214
5215 amscan = systable_beginscan(amopDesc, AccessMethodOperatorOidIndexId, true,
5216 NULL, 1, skey);
5217
5218 tup = systable_getnext(amscan);
5219
5220 if (!HeapTupleIsValid(tup))
5221 {
5222 if (!missing_ok)
5223 elog(ERROR, "could not find tuple for amop entry %u",
5224 object->objectId);
5225
5226 systable_endscan(amscan);
5227 table_close(amopDesc, AccessShareLock);
5228 break;
5229 }
5230
5231 amopForm = (Form_pg_amop) GETSTRUCT(tup);
5232
5233 initStringInfo(&opfam);
5234 getOpFamilyIdentity(&opfam, amopForm->amopfamily, objname,
5235 false);
5236
5237 ltype = format_type_be_qualified(amopForm->amoplefttype);
5238 rtype = format_type_be_qualified(amopForm->amoprighttype);
5239
5240 if (objname)
5241 {
5242 *objname = lappend(*objname,
5243 psprintf("%d", amopForm->amopstrategy));
5244 *objargs = list_make2(ltype, rtype);
5245 }
5246
5247 appendStringInfo(&buffer, "operator %d (%s, %s) of %s",
5248 amopForm->amopstrategy,
5249 ltype, rtype, opfam.data);
5250
5251 pfree(opfam.data);
5252
5253 systable_endscan(amscan);
5254 table_close(amopDesc, AccessShareLock);
5255 break;
5256 }
5257
5258 case AccessMethodProcedureRelationId:
5259 {
5260 Relation amprocDesc;
5261 ScanKeyData skey[1];
5262 SysScanDesc amscan;
5263 HeapTuple tup;
5264 Form_pg_amproc amprocForm;
5265 StringInfoData opfam;
5266 char *ltype;
5267 char *rtype;
5268
5269 amprocDesc = table_open(AccessMethodProcedureRelationId,
5271
5272 ScanKeyInit(&skey[0],
5273 Anum_pg_amproc_oid,
5274 BTEqualStrategyNumber, F_OIDEQ,
5275 ObjectIdGetDatum(object->objectId));
5276
5277 amscan = systable_beginscan(amprocDesc, AccessMethodProcedureOidIndexId, true,
5278 NULL, 1, skey);
5279
5280 tup = systable_getnext(amscan);
5281
5282 if (!HeapTupleIsValid(tup))
5283 {
5284 if (!missing_ok)
5285 elog(ERROR, "could not find tuple for amproc entry %u",
5286 object->objectId);
5287
5288 systable_endscan(amscan);
5289 table_close(amprocDesc, AccessShareLock);
5290 break;
5291 }
5292
5293 amprocForm = (Form_pg_amproc) GETSTRUCT(tup);
5294
5295 initStringInfo(&opfam);
5296 getOpFamilyIdentity(&opfam, amprocForm->amprocfamily, objname,
5297 false);
5298
5299 ltype = format_type_be_qualified(amprocForm->amproclefttype);
5300 rtype = format_type_be_qualified(amprocForm->amprocrighttype);
5301
5302 if (objname)
5303 {
5304 *objname = lappend(*objname,
5305 psprintf("%d", amprocForm->amprocnum));
5306 *objargs = list_make2(ltype, rtype);
5307 }
5308
5309 appendStringInfo(&buffer, "function %d (%s, %s) of %s",
5310 amprocForm->amprocnum,
5311 ltype, rtype, opfam.data);
5312
5313 pfree(opfam.data);
5314
5315 systable_endscan(amscan);
5316 table_close(amprocDesc, AccessShareLock);
5317 break;
5318 }
5319
5320 case RewriteRelationId:
5321 {
5322 Relation ruleDesc;
5323 HeapTuple tup;
5325
5326 ruleDesc = table_open(RewriteRelationId, AccessShareLock);
5327
5328 tup = get_catalog_object_by_oid(ruleDesc, Anum_pg_rewrite_oid,
5329 object->objectId);
5330
5331 if (!HeapTupleIsValid(tup))
5332 {
5333 if (!missing_ok)
5334 elog(ERROR, "could not find tuple for rule %u",
5335 object->objectId);
5336
5337 table_close(ruleDesc, AccessShareLock);
5338 break;
5339 }
5340
5342
5343 appendStringInfo(&buffer, "%s on ",
5344 quote_identifier(NameStr(rule->rulename)));
5345 getRelationIdentity(&buffer, rule->ev_class, objname, false);
5346 if (objname)
5347 *objname = lappend(*objname, pstrdup(NameStr(rule->rulename)));
5348
5349 table_close(ruleDesc, AccessShareLock);
5350 break;
5351 }
5352
5353 case TriggerRelationId:
5354 {
5355 Relation trigDesc;
5356 HeapTuple tup;
5357 Form_pg_trigger trig;
5358
5359 trigDesc = table_open(TriggerRelationId, AccessShareLock);
5360
5361 tup = get_catalog_object_by_oid(trigDesc, Anum_pg_trigger_oid,
5362 object->objectId);
5363
5364 if (!HeapTupleIsValid(tup))
5365 {
5366 if (!missing_ok)
5367 elog(ERROR, "could not find tuple for trigger %u",
5368 object->objectId);
5369
5370 table_close(trigDesc, AccessShareLock);
5371 break;
5372 }
5373
5374 trig = (Form_pg_trigger) GETSTRUCT(tup);
5375
5376 appendStringInfo(&buffer, "%s on ",
5377 quote_identifier(NameStr(trig->tgname)));
5378 getRelationIdentity(&buffer, trig->tgrelid, objname, false);
5379 if (objname)
5380 *objname = lappend(*objname, pstrdup(NameStr(trig->tgname)));
5381
5382 table_close(trigDesc, AccessShareLock);
5383 break;
5384 }
5385
5386 case NamespaceRelationId:
5387 {
5388 char *nspname;
5389
5390 nspname = get_namespace_name_or_temp(object->objectId);
5391 if (!nspname)
5392 {
5393 if (!missing_ok)
5394 elog(ERROR, "cache lookup failed for namespace %u",
5395 object->objectId);
5396 break;
5397 }
5398 appendStringInfoString(&buffer,
5399 quote_identifier(nspname));
5400 if (objname)
5401 *objname = list_make1(nspname);
5402 break;
5403 }
5404
5405 case StatisticExtRelationId:
5406 {
5407 HeapTuple tup;
5408 Form_pg_statistic_ext formStatistic;
5409 char *schema;
5410
5411 tup = SearchSysCache1(STATEXTOID,
5412 ObjectIdGetDatum(object->objectId));
5413 if (!HeapTupleIsValid(tup))
5414 {
5415 if (!missing_ok)
5416 elog(ERROR, "cache lookup failed for statistics object %u",
5417 object->objectId);
5418 break;
5419 }
5420 formStatistic = (Form_pg_statistic_ext) GETSTRUCT(tup);
5421 schema = get_namespace_name_or_temp(formStatistic->stxnamespace);
5422 appendStringInfoString(&buffer,
5424 NameStr(formStatistic->stxname)));
5425 if (objname)
5426 *objname = list_make2(schema,
5427 pstrdup(NameStr(formStatistic->stxname)));
5428 ReleaseSysCache(tup);
5429 }
5430 break;
5431
5432 case TSParserRelationId:
5433 {
5434 HeapTuple tup;
5435 Form_pg_ts_parser formParser;
5436 char *schema;
5437
5438 tup = SearchSysCache1(TSPARSEROID,
5439 ObjectIdGetDatum(object->objectId));
5440 if (!HeapTupleIsValid(tup))
5441 {
5442 if (!missing_ok)
5443 elog(ERROR, "cache lookup failed for text search parser %u",
5444 object->objectId);
5445 break;
5446 }
5447 formParser = (Form_pg_ts_parser) GETSTRUCT(tup);
5448 schema = get_namespace_name_or_temp(formParser->prsnamespace);
5449 appendStringInfoString(&buffer,
5451 NameStr(formParser->prsname)));
5452 if (objname)
5453 *objname = list_make2(schema,
5454 pstrdup(NameStr(formParser->prsname)));
5455 ReleaseSysCache(tup);
5456 break;
5457 }
5458
5459 case TSDictionaryRelationId:
5460 {
5461 HeapTuple tup;
5462 Form_pg_ts_dict formDict;
5463 char *schema;
5464
5465 tup = SearchSysCache1(TSDICTOID,
5466 ObjectIdGetDatum(object->objectId));
5467 if (!HeapTupleIsValid(tup))
5468 {
5469 if (!missing_ok)
5470 elog(ERROR, "cache lookup failed for text search dictionary %u",
5471 object->objectId);
5472 break;
5473 }
5474 formDict = (Form_pg_ts_dict) GETSTRUCT(tup);
5475 schema = get_namespace_name_or_temp(formDict->dictnamespace);
5476 appendStringInfoString(&buffer,
5478 NameStr(formDict->dictname)));
5479 if (objname)
5480 *objname = list_make2(schema,
5481 pstrdup(NameStr(formDict->dictname)));
5482 ReleaseSysCache(tup);
5483 break;
5484 }
5485
5486 case TSTemplateRelationId:
5487 {
5488 HeapTuple tup;
5489 Form_pg_ts_template formTmpl;
5490 char *schema;
5491
5492 tup = SearchSysCache1(TSTEMPLATEOID,
5493 ObjectIdGetDatum(object->objectId));
5494 if (!HeapTupleIsValid(tup))
5495 {
5496 if (!missing_ok)
5497 elog(ERROR, "cache lookup failed for text search template %u",
5498 object->objectId);
5499 break;
5500 }
5501 formTmpl = (Form_pg_ts_template) GETSTRUCT(tup);
5502 schema = get_namespace_name_or_temp(formTmpl->tmplnamespace);
5503 appendStringInfoString(&buffer,
5505 NameStr(formTmpl->tmplname)));
5506 if (objname)
5507 *objname = list_make2(schema,
5508 pstrdup(NameStr(formTmpl->tmplname)));
5509 ReleaseSysCache(tup);
5510 break;
5511 }
5512
5513 case TSConfigRelationId:
5514 {
5515 HeapTuple tup;
5516 Form_pg_ts_config formCfg;
5517 char *schema;
5518
5519 tup = SearchSysCache1(TSCONFIGOID,
5520 ObjectIdGetDatum(object->objectId));
5521 if (!HeapTupleIsValid(tup))
5522 {
5523 if (!missing_ok)
5524 elog(ERROR, "cache lookup failed for text search configuration %u",
5525 object->objectId);
5526 break;
5527 }
5528 formCfg = (Form_pg_ts_config) GETSTRUCT(tup);
5529 schema = get_namespace_name_or_temp(formCfg->cfgnamespace);
5530 appendStringInfoString(&buffer,
5532 NameStr(formCfg->cfgname)));
5533 if (objname)
5534 *objname = list_make2(schema,
5535 pstrdup(NameStr(formCfg->cfgname)));
5536 ReleaseSysCache(tup);
5537 break;
5538 }
5539
5540 case AuthIdRelationId:
5541 {
5542 char *username;
5543
5544 username = GetUserNameFromId(object->objectId, missing_ok);
5545 if (!username)
5546 break;
5547 if (objname)
5548 *objname = list_make1(username);
5549 appendStringInfoString(&buffer,
5551 break;
5552 }
5553
5554 case AuthMemRelationId:
5555 {
5556 Relation authMemDesc;
5557 ScanKeyData skey[1];
5558 SysScanDesc amscan;
5559 HeapTuple tup;
5560 Form_pg_auth_members amForm;
5561
5562 authMemDesc = table_open(AuthMemRelationId,
5564
5565 ScanKeyInit(&skey[0],
5566 Anum_pg_auth_members_oid,
5567 BTEqualStrategyNumber, F_OIDEQ,
5568 ObjectIdGetDatum(object->objectId));
5569
5570 amscan = systable_beginscan(authMemDesc, AuthMemOidIndexId, true,
5571 NULL, 1, skey);
5572
5573 tup = systable_getnext(amscan);
5574
5575 if (!HeapTupleIsValid(tup))
5576 {
5577 if (!missing_ok)
5578 elog(ERROR, "could not find tuple for pg_auth_members entry %u",
5579 object->objectId);
5580
5581 systable_endscan(amscan);
5582 table_close(authMemDesc, AccessShareLock);
5583 break;
5584 }
5585
5586 amForm = (Form_pg_auth_members) GETSTRUCT(tup);
5587
5588 appendStringInfo(&buffer, _("membership of role %s in role %s"),
5589 GetUserNameFromId(amForm->member, false),
5590 GetUserNameFromId(amForm->roleid, false));
5591
5592 systable_endscan(amscan);
5593 table_close(authMemDesc, AccessShareLock);
5594 break;
5595 }
5596
5597 case DatabaseRelationId:
5598 {
5599 char *datname;
5600
5602 if (!datname)
5603 {
5604 if (!missing_ok)
5605 elog(ERROR, "cache lookup failed for database %u",
5606 object->objectId);
5607 break;
5608 }
5609 if (objname)
5610 *objname = list_make1(datname);
5611 appendStringInfoString(&buffer,
5613 break;
5614 }
5615
5616 case TableSpaceRelationId:
5617 {
5618 char *tblspace;
5619
5620 tblspace = get_tablespace_name(object->objectId);
5621 if (!tblspace)
5622 {
5623 if (!missing_ok)
5624 elog(ERROR, "cache lookup failed for tablespace %u",
5625 object->objectId);
5626 break;
5627 }
5628 if (objname)
5629 *objname = list_make1(tblspace);
5630 appendStringInfoString(&buffer,
5631 quote_identifier(tblspace));
5632 break;
5633 }
5634
5635 case ForeignDataWrapperRelationId:
5636 {
5637 ForeignDataWrapper *fdw;
5638
5640 missing_ok);
5641 if (fdw)
5642 {
5644 if (objname)
5645 *objname = list_make1(pstrdup(fdw->fdwname));
5646 }
5647 break;
5648 }
5649
5650 case ForeignServerRelationId:
5651 {
5652 ForeignServer *srv;
5653
5654 srv = GetForeignServerExtended(object->objectId,
5655 missing_ok);
5656 if (srv)
5657 {
5658 appendStringInfoString(&buffer,
5660 if (objname)
5661 *objname = list_make1(pstrdup(srv->servername));
5662 }
5663 break;
5664 }
5665
5666 case UserMappingRelationId:
5667 {
5668 HeapTuple tup;
5669 Oid useid;
5670 Form_pg_user_mapping umform;
5671 ForeignServer *srv;
5672 const char *usename;
5673
5674 tup = SearchSysCache1(USERMAPPINGOID,
5675 ObjectIdGetDatum(object->objectId));
5676 if (!HeapTupleIsValid(tup))
5677 {
5678 if (!missing_ok)
5679 elog(ERROR, "cache lookup failed for user mapping %u",
5680 object->objectId);
5681 break;
5682 }
5683 umform = (Form_pg_user_mapping) GETSTRUCT(tup);
5684 useid = umform->umuser;
5685 srv = GetForeignServer(umform->umserver);
5686
5687 ReleaseSysCache(tup);
5688
5689 if (OidIsValid(useid))
5690 usename = GetUserNameFromId(useid, false);
5691 else
5692 usename = "public";
5693
5694 if (objname)
5695 {
5696 *objname = list_make1(pstrdup(usename));
5697 *objargs = list_make1(pstrdup(srv->servername));
5698 }
5699
5700 appendStringInfo(&buffer, "%s on server %s",
5701 quote_identifier(usename),
5702 srv->servername);
5703 break;
5704 }
5705
5706 case DefaultAclRelationId:
5707 {
5708 Relation defaclrel;
5709 ScanKeyData skey[1];
5710 SysScanDesc rcscan;
5711 HeapTuple tup;
5712 Form_pg_default_acl defacl;
5713 char *schema;
5714 char *username;
5715
5716 defaclrel = table_open(DefaultAclRelationId, AccessShareLock);
5717
5718 ScanKeyInit(&skey[0],
5719 Anum_pg_default_acl_oid,
5720 BTEqualStrategyNumber, F_OIDEQ,
5721 ObjectIdGetDatum(object->objectId));
5722
5723 rcscan = systable_beginscan(defaclrel, DefaultAclOidIndexId,
5724 true, NULL, 1, skey);
5725
5726 tup = systable_getnext(rcscan);
5727
5728 if (!HeapTupleIsValid(tup))
5729 {
5730 if (!missing_ok)
5731 elog(ERROR, "could not find tuple for default ACL %u",
5732 object->objectId);
5733
5734 systable_endscan(rcscan);
5735 table_close(defaclrel, AccessShareLock);
5736 break;
5737 }
5738
5739 defacl = (Form_pg_default_acl) GETSTRUCT(tup);
5740
5741 username = GetUserNameFromId(defacl->defaclrole, false);
5742 appendStringInfo(&buffer,
5743 "for role %s",
5745
5746 if (OidIsValid(defacl->defaclnamespace))
5747 {
5748 schema = get_namespace_name_or_temp(defacl->defaclnamespace);
5749 appendStringInfo(&buffer,
5750 " in schema %s",
5751 quote_identifier(schema));
5752 }
5753 else
5754 schema = NULL;
5755
5756 switch (defacl->defaclobjtype)
5757 {
5758 case DEFACLOBJ_RELATION:
5759 appendStringInfoString(&buffer,
5760 " on tables");
5761 break;
5762 case DEFACLOBJ_SEQUENCE:
5763 appendStringInfoString(&buffer,
5764 " on sequences");
5765 break;
5766 case DEFACLOBJ_FUNCTION:
5767 appendStringInfoString(&buffer,
5768 " on functions");
5769 break;
5770 case DEFACLOBJ_TYPE:
5771 appendStringInfoString(&buffer,
5772 " on types");
5773 break;
5774 case DEFACLOBJ_NAMESPACE:
5775 appendStringInfoString(&buffer,
5776 " on schemas");
5777 break;
5778 case DEFACLOBJ_LARGEOBJECT:
5779 appendStringInfoString(&buffer,
5780 " on large objects");
5781 break;
5782 }
5783
5784 if (objname)
5785 {
5786 *objname = list_make1(username);
5787 if (schema)
5788 *objname = lappend(*objname, schema);
5789 *objargs = list_make1(psprintf("%c", defacl->defaclobjtype));
5790 }
5791
5792 systable_endscan(rcscan);
5793 table_close(defaclrel, AccessShareLock);
5794 break;
5795 }
5796
5797 case ExtensionRelationId:
5798 {
5799 char *extname;
5800
5801 extname = get_extension_name(object->objectId);
5802 if (!extname)
5803 {
5804 if (!missing_ok)
5805 elog(ERROR, "cache lookup failed for extension %u",
5806 object->objectId);
5807 break;
5808 }
5809 appendStringInfoString(&buffer, quote_identifier(extname));
5810 if (objname)
5811 *objname = list_make1(extname);
5812 break;
5813 }
5814
5815 case EventTriggerRelationId:
5816 {
5817 HeapTuple tup;
5818 Form_pg_event_trigger trigForm;
5819 char *evtname;
5820
5821 tup = SearchSysCache1(EVENTTRIGGEROID,
5822 ObjectIdGetDatum(object->objectId));
5823 if (!HeapTupleIsValid(tup))
5824 {
5825 if (!missing_ok)
5826 elog(ERROR, "cache lookup failed for event trigger %u",
5827 object->objectId);
5828 break;
5829 }
5830 trigForm = (Form_pg_event_trigger) GETSTRUCT(tup);
5831 evtname = pstrdup(NameStr(trigForm->evtname));
5832 appendStringInfoString(&buffer, quote_identifier(evtname));
5833 if (objname)
5834 *objname = list_make1(evtname);
5835 ReleaseSysCache(tup);
5836 break;
5837 }
5838
5839 case ParameterAclRelationId:
5840 {
5841 HeapTuple tup;
5842 Datum nameDatum;
5843 char *parname;
5844
5845 tup = SearchSysCache1(PARAMETERACLOID,
5846 ObjectIdGetDatum(object->objectId));
5847 if (!HeapTupleIsValid(tup))
5848 {
5849 if (!missing_ok)
5850 elog(ERROR, "cache lookup failed for parameter ACL %u",
5851 object->objectId);
5852 break;
5853 }
5854 nameDatum = SysCacheGetAttrNotNull(PARAMETERACLOID, tup,
5855 Anum_pg_parameter_acl_parname);
5856 parname = TextDatumGetCString(nameDatum);
5857 appendStringInfoString(&buffer, parname);
5858 if (objname)
5859 *objname = list_make1(parname);
5860 ReleaseSysCache(tup);
5861 break;
5862 }
5863
5864 case PolicyRelationId:
5865 {
5866 Relation polDesc;
5867 HeapTuple tup;
5868 Form_pg_policy policy;
5869
5870 polDesc = table_open(PolicyRelationId, AccessShareLock);
5871
5872 tup = get_catalog_object_by_oid(polDesc, Anum_pg_policy_oid,
5873 object->objectId);
5874
5875 if (!HeapTupleIsValid(tup))
5876 {
5877 if (!missing_ok)
5878 elog(ERROR, "could not find tuple for policy %u",
5879 object->objectId);
5880
5881 table_close(polDesc, AccessShareLock);
5882 break;
5883 }
5884
5885 policy = (Form_pg_policy) GETSTRUCT(tup);
5886
5887 appendStringInfo(&buffer, "%s on ",
5888 quote_identifier(NameStr(policy->polname)));
5889 getRelationIdentity(&buffer, policy->polrelid, objname, false);
5890 if (objname)
5891 *objname = lappend(*objname, pstrdup(NameStr(policy->polname)));
5892
5893 table_close(polDesc, AccessShareLock);
5894 break;
5895 }
5896
5897 case PublicationRelationId:
5898 {
5899 char *pubname;
5900
5901 pubname = get_publication_name(object->objectId, missing_ok);
5902 if (pubname)
5903 {
5904 appendStringInfoString(&buffer,
5905 quote_identifier(pubname));
5906 if (objname)
5907 *objname = list_make1(pubname);
5908 }
5909 break;
5910 }
5911
5912 case PublicationNamespaceRelationId:
5913 {
5914 char *pubname;
5915 char *nspname;
5916
5917 if (!getPublicationSchemaInfo(object, missing_ok, &pubname,
5918 &nspname))
5919 break;
5920 appendStringInfo(&buffer, "%s in publication %s",
5921 nspname, pubname);
5922
5923 if (objargs)
5924 *objargs = list_make1(pubname);
5925 else
5926 pfree(pubname);
5927
5928 if (objname)
5929 *objname = list_make1(nspname);
5930 else
5931 pfree(nspname);
5932
5933 break;
5934 }
5935
5936 case PublicationRelRelationId:
5937 {
5938 HeapTuple tup;
5939 char *pubname;
5941
5942 tup = SearchSysCache1(PUBLICATIONREL,
5943 ObjectIdGetDatum(object->objectId));
5944 if (!HeapTupleIsValid(tup))
5945 {
5946 if (!missing_ok)
5947 elog(ERROR, "cache lookup failed for publication table %u",
5948 object->objectId);
5949 break;
5950 }
5951
5952 prform = (Form_pg_publication_rel) GETSTRUCT(tup);
5953 pubname = get_publication_name(prform->prpubid, false);
5954
5955 getRelationIdentity(&buffer, prform->prrelid, objname, false);
5956 appendStringInfo(&buffer, " in publication %s", pubname);
5957
5958 if (objargs)
5959 *objargs = list_make1(pubname);
5960
5961 ReleaseSysCache(tup);
5962 break;
5963 }
5964
5965 case SubscriptionRelationId:
5966 {
5967 char *subname;
5968
5969 subname = get_subscription_name(object->objectId, missing_ok);
5970 if (subname)
5971 {
5972 appendStringInfoString(&buffer,
5974 if (objname)
5975 *objname = list_make1(subname);
5976 }
5977 break;
5978 }
5979
5980 case TransformRelationId:
5981 {
5982 Relation transformDesc;
5983 HeapTuple tup;
5984 Form_pg_transform transform;
5985 char *transformLang;
5986 char *transformType;
5987
5988 transformDesc = table_open(TransformRelationId, AccessShareLock);
5989
5990 tup = get_catalog_object_by_oid(transformDesc,
5991 Anum_pg_transform_oid,
5992 object->objectId);
5993
5994 if (!HeapTupleIsValid(tup))
5995 {
5996 if (!missing_ok)
5997 elog(ERROR, "could not find tuple for transform %u",
5998 object->objectId);
5999
6000 table_close(transformDesc, AccessShareLock);
6001 break;
6002 }
6003
6004 transform = (Form_pg_transform) GETSTRUCT(tup);
6005
6006 transformType = format_type_be_qualified(transform->trftype);
6007 transformLang = get_language_name(transform->trflang, false);
6008
6009 appendStringInfo(&buffer, "for %s language %s",
6010 transformType,
6011 transformLang);
6012 if (objname)
6013 {
6014 *objname = list_make1(transformType);
6015 *objargs = list_make1(pstrdup(transformLang));
6016 }
6017
6018 table_close(transformDesc, AccessShareLock);
6019 }
6020 break;
6021
6022 default:
6023 elog(ERROR, "unsupported object class: %u", object->classId);
6024 }
6025
6026 if (!missing_ok)
6027 {
6028 /*
6029 * If a get_object_address() representation was requested, make sure
6030 * we are providing one. We don't check objargs, because many of the
6031 * cases above leave it as NIL.
6032 */
6033 if (objname && *objname == NIL)
6034 elog(ERROR, "requested object address for unsupported object class %u: text result \"%s\"",
6035 object->classId, buffer.data);
6036 }
6037 else
6038 {
6039 /* an empty buffer is equivalent to no object found */
6040 if (buffer.len == 0)
6041 {
6042 Assert((objname == NULL || *objname == NIL) &&
6043 (objargs == NULL || *objargs == NIL));
6044 return NULL;
6045 }
6046 }
6047
6048 return buffer.data;
6049}
char * get_am_name(Oid amOid)
Definition: amcmds.c:192
#define FORMAT_TYPE_FORCE_QUALIFY
Definition: builtins.h:126
char * format_type_be_qualified(Oid type_oid)
Definition: format_type.c:353
List * lappend(List *list, void *datum)
Definition: list.c:339
char * get_namespace_name_or_temp(Oid nspid)
Definition: lsyscache.c:3557
char * pstrdup(const char *in)
Definition: mcxt.c:1759
HeapTuple get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId)
static void getOpFamilyIdentity(StringInfo buffer, Oid opfid, List **object, bool missing_ok)
static void getRelationIdentity(StringInfo buffer, Oid relid, List **object, bool missing_ok)
FormData_pg_language * Form_pg_language
Definition: pg_language.h:65
#define NIL
Definition: pg_list.h:68
#define list_make1(x1)
Definition: pg_list.h:212
#define list_make3(x1, x2, x3)
Definition: pg_list.h:216
#define list_make2(x1, x2)
Definition: pg_list.h:214
char * psprintf(const char *fmt,...)
Definition: psprintf.c:43
void format_operator_parts(Oid operator_oid, List **objnames, List **objargs, bool missing_ok)
Definition: regproc.c:814
void format_procedure_parts(Oid procedure_oid, List **objnames, List **objargs, bool missing_ok)
Definition: regproc.c:404
#define FORMAT_OPERATOR_FORCE_QUALIFY
Definition: regproc.h:25
#define FORMAT_PROC_FORCE_QUALIFY
Definition: regproc.h:20
const char * quote_identifier(const char *ident)
Definition: ruleutils.c:13030
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:230

References _, AccessShareLock, appendStringInfo(), appendStringInfoString(), Assert(), BTEqualStrategyNumber, ObjectAddress::classId, StringInfoData::data, datname, elog, ERROR, ForeignDataWrapper::fdwname, format_operator_extended(), FORMAT_OPERATOR_FORCE_QUALIFY, FORMAT_OPERATOR_INVALID_AS_NULL, format_operator_parts(), FORMAT_PROC_FORCE_QUALIFY, FORMAT_PROC_INVALID_AS_NULL, format_procedure_extended(), format_procedure_parts(), format_type_be_qualified(), format_type_extended(), FORMAT_TYPE_FORCE_QUALIFY, FORMAT_TYPE_INVALID_AS_NULL, get_am_name(), get_attname(), get_catalog_object_by_oid(), get_database_name(), get_extension_name(), get_language_name(), get_namespace_name_or_temp(), get_publication_name(), get_subscription_name(), get_tablespace_name(), GetAttrDefaultColumnAddress(), GetForeignDataWrapperExtended(), GetForeignServer(), GetForeignServerExtended(), getObjectIdentityParts(), getOpFamilyIdentity(), getPublicationSchemaInfo(), getRelationIdentity(), GETSTRUCT(), GetUserNameFromId(), HeapTupleIsValid, initStringInfo(), lappend(), LargeObjectExists(), StringInfoData::len, list_make1, list_make2, list_make3, NameStr, NIL, ObjectAddress::objectId, ObjectIdGetDatum(), ObjectAddress::objectSubId, OidIsValid, pfree(), proname, psprintf(), pstrdup(), quote_identifier(), quote_qualified_identifier(), ReleaseSysCache(), ScanKeyInit(), SearchSysCache1(), ForeignServer::servername, subname, SysCacheGetAttrNotNull(), systable_beginscan(), systable_endscan(), systable_getnext(), table_close(), table_open(), TextDatumGetCString, and username.

Referenced by EventTriggerSQLDropAddObject(), getObjectIdentity(), getObjectIdentityParts(), and pg_identify_object_as_address().

◆ getObjectTypeDescription()

char * getObjectTypeDescription ( const ObjectAddress object,
bool  missing_ok 
)

Definition at line 4496 of file objectaddress.c.

4497{
4498 StringInfoData buffer;
4499
4500 initStringInfo(&buffer);
4501
4502 switch (object->classId)
4503 {
4504 case RelationRelationId:
4505 getRelationTypeDescription(&buffer, object->objectId,
4506 object->objectSubId,
4507 missing_ok);
4508 break;
4509
4510 case ProcedureRelationId:
4511 getProcedureTypeDescription(&buffer, object->objectId,
4512 missing_ok);
4513 break;
4514
4515 case TypeRelationId:
4516 appendStringInfoString(&buffer, "type");
4517 break;
4518
4519 case CastRelationId:
4520 appendStringInfoString(&buffer, "cast");
4521 break;
4522
4523 case CollationRelationId:
4524 appendStringInfoString(&buffer, "collation");
4525 break;
4526
4527 case ConstraintRelationId:
4528 getConstraintTypeDescription(&buffer, object->objectId,
4529 missing_ok);
4530 break;
4531
4532 case ConversionRelationId:
4533 appendStringInfoString(&buffer, "conversion");
4534 break;
4535
4536 case AttrDefaultRelationId:
4537 appendStringInfoString(&buffer, "default value");
4538 break;
4539
4540 case LanguageRelationId:
4541 appendStringInfoString(&buffer, "language");
4542 break;
4543
4544 case LargeObjectRelationId:
4545 appendStringInfoString(&buffer, "large object");
4546 break;
4547
4548 case OperatorRelationId:
4549 appendStringInfoString(&buffer, "operator");
4550 break;
4551
4552 case OperatorClassRelationId:
4553 appendStringInfoString(&buffer, "operator class");
4554 break;
4555
4556 case OperatorFamilyRelationId:
4557 appendStringInfoString(&buffer, "operator family");
4558 break;
4559
4560 case AccessMethodRelationId:
4561 appendStringInfoString(&buffer, "access method");
4562 break;
4563
4564 case AccessMethodOperatorRelationId:
4565 appendStringInfoString(&buffer, "operator of access method");
4566 break;
4567
4568 case AccessMethodProcedureRelationId:
4569 appendStringInfoString(&buffer, "function of access method");
4570 break;
4571
4572 case RewriteRelationId:
4573 appendStringInfoString(&buffer, "rule");
4574 break;
4575
4576 case TriggerRelationId:
4577 appendStringInfoString(&buffer, "trigger");
4578 break;
4579
4580 case NamespaceRelationId:
4581 appendStringInfoString(&buffer, "schema");
4582 break;
4583
4584 case StatisticExtRelationId:
4585 appendStringInfoString(&buffer, "statistics object");
4586 break;
4587
4588 case TSParserRelationId:
4589 appendStringInfoString(&buffer, "text search parser");
4590 break;
4591
4592 case TSDictionaryRelationId:
4593 appendStringInfoString(&buffer, "text search dictionary");
4594 break;
4595
4596 case TSTemplateRelationId:
4597 appendStringInfoString(&buffer, "text search template");
4598 break;
4599
4600 case TSConfigRelationId:
4601 appendStringInfoString(&buffer, "text search configuration");
4602 break;
4603
4604 case AuthIdRelationId:
4605 appendStringInfoString(&buffer, "role");
4606 break;
4607
4608 case AuthMemRelationId:
4609 appendStringInfoString(&buffer, "role membership");
4610 break;
4611
4612 case DatabaseRelationId:
4613 appendStringInfoString(&buffer, "database");
4614 break;
4615
4616 case TableSpaceRelationId:
4617 appendStringInfoString(&buffer, "tablespace");
4618 break;
4619
4620 case ForeignDataWrapperRelationId:
4621 appendStringInfoString(&buffer, "foreign-data wrapper");
4622 break;
4623
4624 case ForeignServerRelationId:
4625 appendStringInfoString(&buffer, "server");
4626 break;
4627
4628 case UserMappingRelationId:
4629 appendStringInfoString(&buffer, "user mapping");
4630 break;
4631
4632 case DefaultAclRelationId:
4633 appendStringInfoString(&buffer, "default acl");
4634 break;
4635
4636 case ExtensionRelationId:
4637 appendStringInfoString(&buffer, "extension");
4638 break;
4639
4640 case EventTriggerRelationId:
4641 appendStringInfoString(&buffer, "event trigger");
4642 break;
4643
4644 case ParameterAclRelationId:
4645 appendStringInfoString(&buffer, "parameter ACL");
4646 break;
4647
4648 case PolicyRelationId:
4649 appendStringInfoString(&buffer, "policy");
4650 break;
4651
4652 case PublicationRelationId:
4653 appendStringInfoString(&buffer, "publication");
4654 break;
4655
4656 case PublicationNamespaceRelationId:
4657 appendStringInfoString(&buffer, "publication namespace");
4658 break;
4659
4660 case PublicationRelRelationId:
4661 appendStringInfoString(&buffer, "publication relation");
4662 break;
4663
4664 case SubscriptionRelationId:
4665 appendStringInfoString(&buffer, "subscription");
4666 break;
4667
4668 case TransformRelationId:
4669 appendStringInfoString(&buffer, "transform");
4670 break;
4671
4672 default:
4673 elog(ERROR, "unsupported object class: %u", object->classId);
4674 }
4675
4676 /* the result can never be empty */
4677 Assert(buffer.len > 0);
4678
4679 return buffer.data;
4680}
static void getConstraintTypeDescription(StringInfo buffer, Oid constroid, bool missing_ok)
static void getProcedureTypeDescription(StringInfo buffer, Oid procid, bool missing_ok)
static void getRelationTypeDescription(StringInfo buffer, Oid relid, int32 objectSubId, bool missing_ok)

References appendStringInfoString(), Assert(), ObjectAddress::classId, StringInfoData::data, elog, ERROR, getConstraintTypeDescription(), getProcedureTypeDescription(), getRelationTypeDescription(), initStringInfo(), StringInfoData::len, ObjectAddress::objectId, and ObjectAddress::objectSubId.

Referenced by EventTriggerSQLDropAddObject(), pg_event_trigger_ddl_commands(), pg_identify_object(), pg_identify_object_as_address(), and sepgsql_object_relabel().

◆ is_objectclass_supported()

bool is_objectclass_supported ( Oid  class_id)

Definition at line 2737 of file objectaddress.c.

2738{
2739 int index;
2740
2741 for (index = 0; index < lengthof(ObjectProperty); index++)
2742 {
2743 if (ObjectProperty[index].class_oid == class_id)
2744 return true;
2745 }
2746
2747 return false;
2748}
#define lengthof(array)
Definition: c.h:788
static const ObjectPropertyType ObjectProperty[]
Definition: type.h:96

References lengthof, and ObjectProperty.

Referenced by obtain_object_name_namespace(), pg_event_trigger_ddl_commands(), and pg_identify_object().

◆ read_objtype_from_string()

int read_objtype_from_string ( const char *  objtype)

Definition at line 2608 of file objectaddress.c.

2609{
2610 int i;
2611
2612 for (i = 0; i < lengthof(ObjectTypeMap); i++)
2613 {
2614 if (strcmp(ObjectTypeMap[i].tm_name, objtype) == 0)
2615 return ObjectTypeMap[i].tm_type;
2616 }
2617 ereport(ERROR,
2618 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2619 errmsg("unrecognized object type \"%s\"", objtype)));
2620
2621 return -1; /* keep compiler quiet */
2622}
int i
Definition: isn.c:77
static const struct object_type_map ObjectTypeMap[]

References ereport, errcode(), errmsg(), ERROR, i, lengthof, and ObjectTypeMap.

Referenced by pg_get_object_address().

◆ strlist_to_textarray()

struct ArrayType * strlist_to_textarray ( List list)

Definition at line 6130 of file objectaddress.c.

6131{
6132 ArrayType *arr;
6133 Datum *datums;
6134 bool *nulls;
6135 int j = 0;
6136 ListCell *cell;
6137 MemoryContext memcxt;
6138 MemoryContext oldcxt;
6139 int lb[1];
6140
6141 /* Work in a temp context; easier than individually pfree'ing the Datums */
6143 "strlist to array",
6145 oldcxt = MemoryContextSwitchTo(memcxt);
6146
6147 datums = (Datum *) palloc(sizeof(Datum) * list_length(list));
6148 nulls = palloc(sizeof(bool) * list_length(list));
6149
6150 foreach(cell, list)
6151 {
6152 char *name = lfirst(cell);
6153
6154 if (name)
6155 {
6156 nulls[j] = false;
6157 datums[j++] = CStringGetTextDatum(name);
6158 }
6159 else
6160 nulls[j] = true;
6161 }
6162
6163 MemoryContextSwitchTo(oldcxt);
6164
6165 lb[0] = 1;
6166 arr = construct_md_array(datums, nulls, 1, &j,
6167 lb, TEXTOID, -1, false, TYPALIGN_INT);
6168
6169 MemoryContextDelete(memcxt);
6170
6171 return arr;
6172}
ArrayType * construct_md_array(Datum *elems, bool *nulls, int ndims, int *dims, int *lbs, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
Definition: arrayfuncs.c:3494
#define CStringGetTextDatum(s)
Definition: builtins.h:97
int j
Definition: isn.c:78
void * palloc(Size size)
Definition: mcxt.c:1365
MemoryContext CurrentMemoryContext
Definition: mcxt.c:160
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:469
#define AllocSetContextCreate
Definition: memutils.h:129
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:160
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
#define lfirst(lc)
Definition: pg_list.h:172
static int list_length(const List *l)
Definition: pg_list.h:152
const char * name

References ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate, construct_md_array(), CStringGetTextDatum, CurrentMemoryContext, j, lfirst, sort-test::list, list_length(), MemoryContextDelete(), MemoryContextSwitchTo(), name, and palloc().

Referenced by fill_hba_line(), pg_event_trigger_dropped_objects(), and pg_identify_object_as_address().

Variable Documentation

◆ InvalidObjectAddress