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 2387 of file objectaddress.c.

2389{
2390 switch (objtype)
2391 {
2392 case OBJECT_INDEX:
2393 case OBJECT_SEQUENCE:
2394 case OBJECT_TABLE:
2395 case OBJECT_VIEW:
2396 case OBJECT_MATVIEW:
2398 case OBJECT_COLUMN:
2399 case OBJECT_RULE:
2400 case OBJECT_TRIGGER:
2401 case OBJECT_POLICY:
2403 if (!object_ownercheck(RelationRelationId, RelationGetRelid(relation), roleid))
2405 RelationGetRelationName(relation));
2406 break;
2407 case OBJECT_TYPE:
2408 case OBJECT_DOMAIN:
2409 case OBJECT_ATTRIBUTE:
2410 if (!object_ownercheck(address.classId, address.objectId, roleid))
2412 break;
2414 {
2415 HeapTuple tuple;
2416 Oid contypid;
2417
2418 tuple = SearchSysCache1(CONSTROID,
2419 ObjectIdGetDatum(address.objectId));
2420 if (!HeapTupleIsValid(tuple))
2421 elog(ERROR, "constraint with OID %u does not exist",
2422 address.objectId);
2423
2424 contypid = ((Form_pg_constraint) GETSTRUCT(tuple))->contypid;
2425
2426 ReleaseSysCache(tuple);
2427
2428 /*
2429 * Fallback to type ownership check in this case as this is
2430 * what domain constraints rely on.
2431 */
2432 if (!object_ownercheck(TypeRelationId, contypid, roleid))
2434 }
2435 break;
2436 case OBJECT_AGGREGATE:
2437 case OBJECT_FUNCTION:
2438 case OBJECT_PROCEDURE:
2439 case OBJECT_ROUTINE:
2440 case OBJECT_OPERATOR:
2441 if (!object_ownercheck(address.classId, address.objectId, roleid))
2443 NameListToString((castNode(ObjectWithArgs, object))->objname));
2444 break;
2445 case OBJECT_DATABASE:
2447 case OBJECT_EXTENSION:
2448 case OBJECT_FDW:
2450 case OBJECT_LANGUAGE:
2451 case OBJECT_PUBLICATION:
2452 case OBJECT_SCHEMA:
2454 case OBJECT_TABLESPACE:
2455 if (!object_ownercheck(address.classId, address.objectId, roleid))
2457 strVal(object));
2458 break;
2459 case OBJECT_COLLATION:
2460 case OBJECT_CONVERSION:
2461 case OBJECT_OPCLASS:
2462 case OBJECT_OPFAMILY:
2466 if (!object_ownercheck(address.classId, address.objectId, roleid))
2468 NameListToString(castNode(List, object)));
2469 break;
2470 case OBJECT_LARGEOBJECT:
2471 if (!lo_compat_privileges &&
2472 !object_ownercheck(address.classId, address.objectId, roleid))
2473 ereport(ERROR,
2474 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2475 errmsg("must be owner of large object %u",
2476 address.objectId)));
2477 break;
2478 case OBJECT_CAST:
2479 {
2480 /* We can only check permissions on the source/target types */
2481 TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
2482 TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
2483 Oid sourcetypeid = typenameTypeId(NULL, sourcetype);
2484 Oid targettypeid = typenameTypeId(NULL, targettype);
2485
2486 if (!object_ownercheck(TypeRelationId, sourcetypeid, roleid)
2487 && !object_ownercheck(TypeRelationId, targettypeid, roleid))
2488 ereport(ERROR,
2489 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2490 errmsg("must be owner of type %s or type %s",
2491 format_type_be(sourcetypeid),
2492 format_type_be(targettypeid))));
2493 }
2494 break;
2495 case OBJECT_TRANSFORM:
2496 {
2497 TypeName *typename = linitial_node(TypeName, castNode(List, object));
2498 Oid typeid = typenameTypeId(NULL, typename);
2499
2500 if (!object_ownercheck(TypeRelationId, typeid, roleid))
2502 }
2503 break;
2504 case OBJECT_ROLE:
2505
2506 /*
2507 * We treat roles as being "owned" by those with CREATEROLE priv,
2508 * provided that they also have admin option on the role.
2509 *
2510 * However, superusers are only owned by superusers.
2511 */
2512 if (superuser_arg(address.objectId))
2513 {
2514 if (!superuser_arg(roleid))
2515 ereport(ERROR,
2516 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2517 errmsg("permission denied"),
2518 errdetail("The current user must have the %s attribute.",
2519 "SUPERUSER")));
2520 }
2521 else
2522 {
2523 if (!has_createrole_privilege(roleid))
2524 ereport(ERROR,
2525 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2526 errmsg("permission denied"),
2527 errdetail("The current user must have the %s attribute.",
2528 "CREATEROLE")));
2529 if (!is_admin_of_role(roleid, address.objectId))
2530 ereport(ERROR,
2531 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2532 errmsg("permission denied"),
2533 errdetail("The current user must have the %s option on role \"%s\".",
2534 "ADMIN",
2536 true))));
2537 }
2538 break;
2539 case OBJECT_TSPARSER:
2540 case OBJECT_TSTEMPLATE:
2543 /* We treat these object types as being owned by superusers */
2544 if (!superuser_arg(roleid))
2545 ereport(ERROR,
2546 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2547 errmsg("must be superuser")));
2548 break;
2549 case OBJECT_AMOP:
2550 case OBJECT_AMPROC:
2551 case OBJECT_DEFAULT:
2552 case OBJECT_DEFACL:
2556 /* These are currently not supported or don't make sense here. */
2557 elog(ERROR, "unsupported object type: %d", (int) objtype);
2558 break;
2559 }
2560}
bool is_admin_of_role(Oid member, Oid role)
Definition: acl.c:5398
@ ACLCHECK_NOT_OWNER
Definition: acl.h:185
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
Definition: aclchk.c:2622
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
Definition: aclchk.c:4058
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
Definition: aclchk.c:2941
bool has_createrole_privilege(Oid roleid)
Definition: aclchk.c:4137
int errdetail(const char *fmt,...)
Definition: elog.c:1203
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
#define ereport(elevel,...)
Definition: elog.h:149
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:1036
char * NameListToString(const List *names)
Definition: namespace.c:3594
#define castNode(_type_, nodeptr)
Definition: nodes.h:176
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
Definition: parse_type.c:291
@ OBJECT_EVENT_TRIGGER
Definition: parsenodes.h:2326
@ OBJECT_FDW
Definition: parsenodes.h:2328
@ OBJECT_TSPARSER
Definition: parsenodes.h:2359
@ OBJECT_COLLATION
Definition: parsenodes.h:2319
@ OBJECT_USER_MAPPING
Definition: parsenodes.h:2362
@ OBJECT_ACCESS_METHOD
Definition: parsenodes.h:2312
@ OBJECT_OPCLASS
Definition: parsenodes.h:2336
@ OBJECT_DEFACL
Definition: parsenodes.h:2323
@ OBJECT_AGGREGATE
Definition: parsenodes.h:2313
@ OBJECT_MATVIEW
Definition: parsenodes.h:2335
@ OBJECT_SCHEMA
Definition: parsenodes.h:2348
@ OBJECT_POLICY
Definition: parsenodes.h:2340
@ OBJECT_OPERATOR
Definition: parsenodes.h:2337
@ OBJECT_FOREIGN_TABLE
Definition: parsenodes.h:2330
@ OBJECT_TSCONFIGURATION
Definition: parsenodes.h:2357
@ OBJECT_OPFAMILY
Definition: parsenodes.h:2338
@ OBJECT_DOMAIN
Definition: parsenodes.h:2324
@ OBJECT_COLUMN
Definition: parsenodes.h:2318
@ OBJECT_TABLESPACE
Definition: parsenodes.h:2354
@ OBJECT_ROLE
Definition: parsenodes.h:2345
@ OBJECT_ROUTINE
Definition: parsenodes.h:2346
@ OBJECT_LARGEOBJECT
Definition: parsenodes.h:2334
@ OBJECT_PUBLICATION_NAMESPACE
Definition: parsenodes.h:2343
@ OBJECT_PROCEDURE
Definition: parsenodes.h:2341
@ OBJECT_EXTENSION
Definition: parsenodes.h:2327
@ OBJECT_INDEX
Definition: parsenodes.h:2332
@ OBJECT_DEFAULT
Definition: parsenodes.h:2322
@ OBJECT_DATABASE
Definition: parsenodes.h:2321
@ OBJECT_SEQUENCE
Definition: parsenodes.h:2349
@ OBJECT_TSTEMPLATE
Definition: parsenodes.h:2360
@ OBJECT_LANGUAGE
Definition: parsenodes.h:2333
@ OBJECT_AMOP
Definition: parsenodes.h:2314
@ OBJECT_PUBLICATION_REL
Definition: parsenodes.h:2344
@ OBJECT_FOREIGN_SERVER
Definition: parsenodes.h:2329
@ OBJECT_TSDICTIONARY
Definition: parsenodes.h:2358
@ OBJECT_ATTRIBUTE
Definition: parsenodes.h:2316
@ OBJECT_PUBLICATION
Definition: parsenodes.h:2342
@ OBJECT_RULE
Definition: parsenodes.h:2347
@ OBJECT_CONVERSION
Definition: parsenodes.h:2320
@ OBJECT_AMPROC
Definition: parsenodes.h:2315
@ OBJECT_TABLE
Definition: parsenodes.h:2353
@ OBJECT_VIEW
Definition: parsenodes.h:2363
@ OBJECT_PARAMETER_ACL
Definition: parsenodes.h:2339
@ OBJECT_TYPE
Definition: parsenodes.h:2361
@ OBJECT_FUNCTION
Definition: parsenodes.h:2331
@ OBJECT_TABCONSTRAINT
Definition: parsenodes.h:2352
@ OBJECT_DOMCONSTRAINT
Definition: parsenodes.h:2325
@ OBJECT_SUBSCRIPTION
Definition: parsenodes.h:2350
@ OBJECT_STATISTIC_EXT
Definition: parsenodes.h:2351
@ OBJECT_CAST
Definition: parsenodes.h:2317
@ OBJECT_TRIGGER
Definition: parsenodes.h:2356
@ OBJECT_TRANSFORM
Definition: parsenodes.h:2355
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:257
unsigned int Oid
Definition: postgres_ext.h:32
#define RelationGetRelid(relation)
Definition: rel.h:506
#define RelationGetRelationName(relation)
Definition: rel.h:540
Definition: pg_list.h:54
bool superuser_arg(Oid roleid)
Definition: superuser.c:56
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:269
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:221
#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 2786 of file objectaddress.c.

2787{
2788 return
2789 get_catalog_object_by_oid_extended(catalog, oidcol, objectId, false);
2790}
HeapTuple get_catalog_object_by_oid_extended(Relation catalog, AttrNumber oidcol, Oid objectId, bool locktup)

References get_catalog_object_by_oid_extended().

Referenced by EventTriggerSQLDropAddObject(), getConstraintTypeDescription(), getObjectIdentityParts(), 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 2799 of file objectaddress.c.

2803{
2804 HeapTuple tuple;
2805 Oid classId = RelationGetRelid(catalog);
2806 int oidCacheId = get_object_catcache_oid(classId);
2807
2808 if (oidCacheId > 0)
2809 {
2810 if (locktup)
2811 tuple = SearchSysCacheLockedCopy1(oidCacheId,
2812 ObjectIdGetDatum(objectId));
2813 else
2814 tuple = SearchSysCacheCopy1(oidCacheId,
2815 ObjectIdGetDatum(objectId));
2816 if (!HeapTupleIsValid(tuple)) /* should not happen */
2817 return NULL;
2818 }
2819 else
2820 {
2821 Oid oidIndexId = get_object_oid_index(classId);
2822 SysScanDesc scan;
2823 ScanKeyData skey;
2824
2825 Assert(OidIsValid(oidIndexId));
2826
2827 ScanKeyInit(&skey,
2828 oidcol,
2829 BTEqualStrategyNumber, F_OIDEQ,
2830 ObjectIdGetDatum(objectId));
2831
2832 scan = systable_beginscan(catalog, oidIndexId, true,
2833 NULL, 1, &skey);
2834 tuple = systable_getnext(scan);
2835 if (!HeapTupleIsValid(tuple))
2836 {
2837 systable_endscan(scan);
2838 return NULL;
2839 }
2840
2841 if (locktup)
2842 LockTuple(catalog, &tuple->t_self, InplaceUpdateTupleLock);
2843
2844 tuple = heap_copytuple(tuple);
2845
2846 systable_endscan(scan);
2847 }
2848
2849 return tuple;
2850}
#define Assert(condition)
Definition: c.h:815
#define OidIsValid(objectId)
Definition: c.h:732
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:606
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:513
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition: genam.c:387
HeapTuple heap_copytuple(HeapTuple tuple)
Definition: heaptuple.c:778
void LockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode)
Definition: lmgr.c:557
#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:404
#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 923 of file objectaddress.c.

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

1228{
1229 if (rel)
1230 {
1231 object = lcons(makeString(rel->relname), object);
1232 if (rel->schemaname)
1233 object = lcons(makeString(rel->schemaname), object);
1234 if (rel->catalogname)
1235 object = lcons(makeString(rel->catalogname), object);
1236 }
1237
1238 return get_object_address(objtype, (Node *) object,
1239 relp, lockmode, missing_ok);
1240}
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:129
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 2689 of file objectaddress.c.

2690{
2691 const ObjectPropertyType *prop = get_object_property_data(class_id);
2692
2693 return prop->attnum_acl;
2694}
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 2649 of file objectaddress.c.

2650{
2651 const ObjectPropertyType *prop = get_object_property_data(class_id);
2652
2653 return prop->name_catcache_id;
2654}

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 2722 of file objectaddress.c.

2723{
2724 const ObjectPropertyType *prop = get_object_property_data(class_id);
2725
2726 return prop->is_nsp_name_unique;
2727}

References get_object_property_data(), and ObjectPropertyType::is_nsp_name_unique.

Referenced by EventTriggerSQLDropAddObject(), and pg_identify_object().

◆ get_object_namespace()

Oid get_object_namespace ( const ObjectAddress address)

Definition at line 2569 of file objectaddress.c.

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

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 2633 of file objectaddress.c.

2634{
2635 const ObjectPropertyType *prop = get_object_property_data(class_id);
2636
2637 return prop->oid_index_oid;
2638}

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 2704 of file objectaddress.c.

2705{
2706 const ObjectPropertyType *prop = get_object_property_data(class_id);
2707
2708 if (prop->objtype == OBJECT_TABLE)
2709 {
2710 /*
2711 * If the property data says it's a table, dig a little deeper to get
2712 * the real relation kind, so that callers can produce more precise
2713 * error messages.
2714 */
2715 return get_relkind_objtype(get_rel_relkind(object_id));
2716 }
2717 else
2718 return prop->objtype;
2719}
char get_rel_relkind(Oid relid)
Definition: lsyscache.c:2030
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 6172 of file objectaddress.c.

6173{
6174 switch (relkind)
6175 {
6176 case RELKIND_RELATION:
6177 case RELKIND_PARTITIONED_TABLE:
6178 return OBJECT_TABLE;
6179 case RELKIND_INDEX:
6180 case RELKIND_PARTITIONED_INDEX:
6181 return OBJECT_INDEX;
6182 case RELKIND_SEQUENCE:
6183 return OBJECT_SEQUENCE;
6184 case RELKIND_VIEW:
6185 return OBJECT_VIEW;
6186 case RELKIND_MATVIEW:
6187 return OBJECT_MATVIEW;
6188 case RELKIND_FOREIGN_TABLE:
6189 return OBJECT_FOREIGN_TABLE;
6190 case RELKIND_TOASTVALUE:
6191 return OBJECT_TABLE;
6192 default:
6193 /* Per above, don't raise an error */
6194 return OBJECT_TABLE;
6195 }
6196}

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 2908 of file objectaddress.c.

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

4077{
4078 ObjectAddress address;
4079
4080 address.classId = classid;
4081 address.objectId = objid;
4082 address.objectSubId = 0;
4083
4084 return getObjectDescription(&address, false);
4085}

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 4829 of file objectaddress.c.

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

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

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

References lengthof, and ObjectProperty.

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

◆ read_objtype_from_string()

int read_objtype_from_string ( const char *  objtype)

Definition at line 2605 of file objectaddress.c.

2606{
2607 int i;
2608
2609 for (i = 0; i < lengthof(ObjectTypeMap); i++)
2610 {
2611 if (strcmp(ObjectTypeMap[i].tm_name, objtype) == 0)
2612 return ObjectTypeMap[i].tm_type;
2613 }
2614 ereport(ERROR,
2615 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2616 errmsg("unrecognized object type \"%s\"", objtype)));
2617
2618 return -1; /* keep compiler quiet */
2619}
int i
Definition: isn.c:72
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 6117 of file objectaddress.c.

6118{
6119 ArrayType *arr;
6120 Datum *datums;
6121 bool *nulls;
6122 int j = 0;
6123 ListCell *cell;
6124 MemoryContext memcxt;
6125 MemoryContext oldcxt;
6126 int lb[1];
6127
6128 /* Work in a temp context; easier than individually pfree'ing the Datums */
6130 "strlist to array",
6132 oldcxt = MemoryContextSwitchTo(memcxt);
6133
6134 datums = (Datum *) palloc(sizeof(Datum) * list_length(list));
6135 nulls = palloc(sizeof(bool) * list_length(list));
6136
6137 foreach(cell, list)
6138 {
6139 char *name = lfirst(cell);
6140
6141 if (name)
6142 {
6143 nulls[j] = false;
6144 datums[j++] = CStringGetTextDatum(name);
6145 }
6146 else
6147 nulls[j] = true;
6148 }
6149
6150 MemoryContextSwitchTo(oldcxt);
6151
6152 lb[0] = 1;
6153 arr = construct_md_array(datums, nulls, 1, &j,
6154 lb, TEXTOID, -1, false, TYPALIGN_INT);
6155
6156 MemoryContextDelete(memcxt);
6157
6158 return arr;
6159}
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:73
void * palloc(Size size)
Definition: mcxt.c:1317
MemoryContext CurrentMemoryContext
Definition: mcxt.c:143
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:454
#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