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)
 
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 *address, bool missing_ok)
 
char * getObjectIdentityParts (const ObjectAddress *address, List **objname, List **objargs, bool missing_ok)
 
struct ArrayTypestrlist_to_textarray (List *list)
 
ObjectType get_relkind_objtype (char relkind)
 

Variables

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.

Referenced by addFkRecurseReferenced(), addFkRecurseReferencing(), AddNewAttributeTuples(), AggregateCreate(), AlterCollation(), AlterConstraintNamespaces(), AlterDatabaseOwner(), AlterDomainAddConstraint(), AlterDomainDefault(), AlterDomainDropConstraint(), AlterDomainNotNull(), AlterDomainValidateConstraint(), AlterEnum(), AlterEventTriggerOwner(), AlterExtensionNamespace(), AlterForeignDataWrapper(), AlterForeignDataWrapperOwner(), AlterForeignServer(), AlterForeignServerOwner(), AlterFunction(), AlterPublicationOptions(), AlterPublicationOwner(), AlterSchemaOwner(), AlterSequence(), AlterStatistics(), AlterSubscription(), AlterSubscriptionOwner(), AlterTableNamespace(), AlterTSConfiguration(), AlterTSDictionary(), AlterType(), AlterTypeNamespace(), AlterTypeOwner(), AlterUserMapping(), ATAddCheckConstraint(), ATExecAddInherit(), ATExecAlterConstraint(), ATExecAttachPartition(), ATExecAttachPartitionIdx(), ATExecClusterOn(), ATExecDetachPartition(), ATExecDetachPartitionFinalize(), ATExecDropInherit(), ATExecValidateConstraint(), ATPostAlterTypeCleanup(), CastCreate(), CloneFkReferencing(), ConstraintSetParentConstraint(), CreateConstraintEntry(), CreateProceduralLanguage(), CreatePublication(), CreateSchemaCommand(), CreateStatistics(), CreateSubscription(), CreateTransform(), CreateTriggerFiringOn(), DefineCollation(), DefineIndex(), DefineQueryRewrite(), DefineRelation(), DefineTSConfiguration(), DefineVirtualRelation(), DetachPartitionFinalize(), domainAddConstraint(), DropClonedTriggersFromPartition(), DropSubscription(), EventTriggerCollectAlterOpFam(), EventTriggerCollectAlterTSConfig(), EventTriggerCollectCreateOpClass(), ExecAlterExtensionStmt(), ExecAlterObjectSchemaStmt(), ExecRefreshMatView(), GenerateTypeDependencies(), get_object_address_defacl(), get_object_address_opf_member(), get_object_address_publication_rel(), get_object_address_usermapping(), heap_create_with_catalog(), index_constraint_create(), index_create(), IndexSetParentIndex(), InsertExtensionTuple(), makeDictionaryDependencies(), makeOperatorDependencies(), makeParserDependencies(), makeTSTemplateDependencies(), pg_event_trigger_ddl_commands(), ProcedureCreate(), publication_add_relation(), PublicationDropTables(), RangeCreate(), recordDependencyOnTablespace(), rename_constraint_internal(), rename_policy(), RenameDatabase(), RenameRelation(), RenameRewriteRule(), RenameRole(), RenameSchema(), RenameTableSpace(), renametrig(), RenameType(), StorePartitionKey(), tryAttachPartitionForeignKey(), TypeCreate(), and TypeShellMake().

◆ ObjectAddressSubSet

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

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

References aclcheck_error(), aclcheck_error_type(), ACLCHECK_NOT_OWNER, castNode, CONSTROID, elog, ereport, errcode(), errmsg(), ERROR, format_type_be(), GETSTRUCT, has_createrole_privilege(), HeapTupleIsValid, linitial_node, lo_compat_privileges, lsecond_node, NameListToString(), OBJECT_ACCESS_METHOD, OBJECT_AGGREGATE, OBJECT_ATTRIBUTE, OBJECT_CAST, OBJECT_COLLATION, OBJECT_COLUMN, OBJECT_CONVERSION, OBJECT_DATABASE, 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_POLICY, OBJECT_PROCEDURE, OBJECT_PUBLICATION, 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_VIEW, ObjectAddress::objectId, ObjectIdGetDatum, pg_class_ownercheck(), pg_collation_ownercheck(), pg_conversion_ownercheck(), pg_database_ownercheck(), pg_event_trigger_ownercheck(), pg_extension_ownercheck(), pg_foreign_data_wrapper_ownercheck(), pg_foreign_server_ownercheck(), pg_language_ownercheck(), pg_largeobject_ownercheck(), pg_namespace_ownercheck(), pg_opclass_ownercheck(), pg_oper_ownercheck(), pg_opfamily_ownercheck(), pg_proc_ownercheck(), pg_publication_ownercheck(), pg_statistics_object_ownercheck(), pg_subscription_ownercheck(), pg_tablespace_ownercheck(), pg_ts_config_ownercheck(), pg_ts_dict_ownercheck(), pg_type_ownercheck(), RelationGetRelationName, RelationGetRelid, ReleaseSysCache(), SearchSysCache1(), strVal, superuser_arg(), and typenameTypeId().

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

2368 {
2369  switch (objtype)
2370  {
2371  case OBJECT_INDEX:
2372  case OBJECT_SEQUENCE:
2373  case OBJECT_TABLE:
2374  case OBJECT_VIEW:
2375  case OBJECT_MATVIEW:
2376  case OBJECT_FOREIGN_TABLE:
2377  case OBJECT_COLUMN:
2378  case OBJECT_RULE:
2379  case OBJECT_TRIGGER:
2380  case OBJECT_POLICY:
2381  case OBJECT_TABCONSTRAINT:
2382  if (!pg_class_ownercheck(RelationGetRelid(relation), roleid))
2384  RelationGetRelationName(relation));
2385  break;
2386  case OBJECT_DATABASE:
2387  if (!pg_database_ownercheck(address.objectId, roleid))
2389  strVal(object));
2390  break;
2391  case OBJECT_TYPE:
2392  case OBJECT_DOMAIN:
2393  case OBJECT_ATTRIBUTE:
2394  if (!pg_type_ownercheck(address.objectId, roleid))
2396  break;
2397  case OBJECT_DOMCONSTRAINT:
2398  {
2399  HeapTuple tuple;
2400  Oid contypid;
2401 
2402  tuple = SearchSysCache1(CONSTROID,
2403  ObjectIdGetDatum(address.objectId));
2404  if (!HeapTupleIsValid(tuple))
2405  elog(ERROR, "constraint with OID %u does not exist",
2406  address.objectId);
2407 
2408  contypid = ((Form_pg_constraint) GETSTRUCT(tuple))->contypid;
2409 
2410  ReleaseSysCache(tuple);
2411 
2412  /*
2413  * Fallback to type ownership check in this case as this is
2414  * what domain constraints rely on.
2415  */
2416  if (!pg_type_ownercheck(contypid, roleid))
2418  }
2419  break;
2420  case OBJECT_AGGREGATE:
2421  case OBJECT_FUNCTION:
2422  case OBJECT_PROCEDURE:
2423  case OBJECT_ROUTINE:
2424  if (!pg_proc_ownercheck(address.objectId, roleid))
2426  NameListToString((castNode(ObjectWithArgs, object))->objname));
2427  break;
2428  case OBJECT_OPERATOR:
2429  if (!pg_oper_ownercheck(address.objectId, roleid))
2431  NameListToString((castNode(ObjectWithArgs, object))->objname));
2432  break;
2433  case OBJECT_SCHEMA:
2434  if (!pg_namespace_ownercheck(address.objectId, roleid))
2436  strVal(object));
2437  break;
2438  case OBJECT_COLLATION:
2439  if (!pg_collation_ownercheck(address.objectId, roleid))
2441  NameListToString(castNode(List, object)));
2442  break;
2443  case OBJECT_CONVERSION:
2444  if (!pg_conversion_ownercheck(address.objectId, roleid))
2446  NameListToString(castNode(List, object)));
2447  break;
2448  case OBJECT_EXTENSION:
2449  if (!pg_extension_ownercheck(address.objectId, roleid))
2451  strVal(object));
2452  break;
2453  case OBJECT_FDW:
2454  if (!pg_foreign_data_wrapper_ownercheck(address.objectId, roleid))
2456  strVal(object));
2457  break;
2458  case OBJECT_FOREIGN_SERVER:
2459  if (!pg_foreign_server_ownercheck(address.objectId, roleid))
2461  strVal(object));
2462  break;
2463  case OBJECT_EVENT_TRIGGER:
2464  if (!pg_event_trigger_ownercheck(address.objectId, roleid))
2466  strVal(object));
2467  break;
2468  case OBJECT_LANGUAGE:
2469  if (!pg_language_ownercheck(address.objectId, roleid))
2471  strVal(object));
2472  break;
2473  case OBJECT_OPCLASS:
2474  if (!pg_opclass_ownercheck(address.objectId, roleid))
2476  NameListToString(castNode(List, object)));
2477  break;
2478  case OBJECT_OPFAMILY:
2479  if (!pg_opfamily_ownercheck(address.objectId, roleid))
2481  NameListToString(castNode(List, object)));
2482  break;
2483  case OBJECT_LARGEOBJECT:
2484  if (!lo_compat_privileges &&
2485  !pg_largeobject_ownercheck(address.objectId, roleid))
2486  ereport(ERROR,
2487  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2488  errmsg("must be owner of large object %u",
2489  address.objectId)));
2490  break;
2491  case OBJECT_CAST:
2492  {
2493  /* We can only check permissions on the source/target types */
2494  TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
2495  TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
2496  Oid sourcetypeid = typenameTypeId(NULL, sourcetype);
2497  Oid targettypeid = typenameTypeId(NULL, targettype);
2498 
2499  if (!pg_type_ownercheck(sourcetypeid, roleid)
2500  && !pg_type_ownercheck(targettypeid, roleid))
2501  ereport(ERROR,
2502  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2503  errmsg("must be owner of type %s or type %s",
2504  format_type_be(sourcetypeid),
2505  format_type_be(targettypeid))));
2506  }
2507  break;
2508  case OBJECT_PUBLICATION:
2509  if (!pg_publication_ownercheck(address.objectId, roleid))
2511  strVal(object));
2512  break;
2513  case OBJECT_SUBSCRIPTION:
2514  if (!pg_subscription_ownercheck(address.objectId, roleid))
2516  strVal(object));
2517  break;
2518  case OBJECT_TRANSFORM:
2519  {
2520  TypeName *typename = linitial_node(TypeName, castNode(List, object));
2521  Oid typeid = typenameTypeId(NULL, typename);
2522 
2523  if (!pg_type_ownercheck(typeid, roleid))
2525  }
2526  break;
2527  case OBJECT_TABLESPACE:
2528  if (!pg_tablespace_ownercheck(address.objectId, roleid))
2530  strVal(object));
2531  break;
2532  case OBJECT_TSDICTIONARY:
2533  if (!pg_ts_dict_ownercheck(address.objectId, roleid))
2535  NameListToString(castNode(List, object)));
2536  break;
2538  if (!pg_ts_config_ownercheck(address.objectId, roleid))
2540  NameListToString(castNode(List, object)));
2541  break;
2542  case OBJECT_ROLE:
2543 
2544  /*
2545  * We treat roles as being "owned" by those with CREATEROLE priv,
2546  * except that superusers are only owned by superusers.
2547  */
2548  if (superuser_arg(address.objectId))
2549  {
2550  if (!superuser_arg(roleid))
2551  ereport(ERROR,
2552  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2553  errmsg("must be superuser")));
2554  }
2555  else
2556  {
2557  if (!has_createrole_privilege(roleid))
2558  ereport(ERROR,
2559  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2560  errmsg("must have CREATEROLE privilege")));
2561  }
2562  break;
2563  case OBJECT_TSPARSER:
2564  case OBJECT_TSTEMPLATE:
2565  case OBJECT_ACCESS_METHOD:
2566  /* We treat these object types as being owned by superusers */
2567  if (!superuser_arg(roleid))
2568  ereport(ERROR,
2569  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2570  errmsg("must be superuser")));
2571  break;
2572  case OBJECT_STATISTIC_EXT:
2573  if (!pg_statistics_object_ownercheck(address.objectId, roleid))
2575  NameListToString(castNode(List, object)));
2576  break;
2577  default:
2578  elog(ERROR, "unrecognized object type: %d",
2579  (int) objtype);
2580  }
2581 }
bool has_createrole_privilege(Oid roleid)
Definition: aclchk.c:5443
bool pg_collation_ownercheck(Oid coll_oid, Oid roleid)
Definition: aclchk.c:5262
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
bool lo_compat_privileges
Definition: inv_api.c:58
bool pg_largeobject_ownercheck(Oid lobj_oid, Oid roleid)
Definition: aclchk.c:4951
bool pg_ts_dict_ownercheck(Oid dict_oid, Oid roleid)
Definition: aclchk.c:5101
bool pg_language_ownercheck(Oid lan_oid, Oid roleid)
Definition: aclchk.c:4922
#define castNode(_type_, nodeptr)
Definition: nodes.h:605
bool pg_ts_config_ownercheck(Oid cfg_oid, Oid roleid)
Definition: aclchk.c:5128
bool pg_foreign_server_ownercheck(Oid srv_oid, Oid roleid)
Definition: aclchk.c:5182
bool pg_publication_ownercheck(Oid pub_oid, Oid roleid)
Definition: aclchk.c:5356
#define strVal(v)
Definition: value.h:65
bool pg_oper_ownercheck(Oid oper_oid, Oid roleid)
Definition: aclchk.c:4870
int errcode(int sqlerrcode)
Definition: elog.c:698
char * format_type_be(Oid type_oid)
Definition: format_type.c:339
bool pg_namespace_ownercheck(Oid nsp_oid, Oid roleid)
Definition: aclchk.c:4994
unsigned int Oid
Definition: postgres_ext.h:31
bool pg_type_ownercheck(Oid type_oid, Oid roleid)
Definition: aclchk.c:4844
#define linitial_node(type, l)
Definition: pg_list.h:177
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
Definition: aclchk.c:3621
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
Definition: aclchk.c:3308
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
#define ERROR
Definition: elog.h:46
bool pg_event_trigger_ownercheck(Oid et_oid, Oid roleid)
Definition: aclchk.c:5209
bool pg_extension_ownercheck(Oid ext_oid, Oid roleid)
Definition: aclchk.c:5314
#define RelationGetRelationName(relation)
Definition: rel.h:511
bool pg_tablespace_ownercheck(Oid spc_oid, Oid roleid)
Definition: aclchk.c:5020
bool pg_opfamily_ownercheck(Oid opf_oid, Oid roleid)
Definition: aclchk.c:5074
bool pg_database_ownercheck(Oid db_oid, Oid roleid)
Definition: aclchk.c:5236
bool superuser_arg(Oid roleid)
Definition: superuser.c:56
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1127
char * NameListToString(List *names)
Definition: namespace.c:3147
#define lsecond_node(type, l)
Definition: pg_list.h:182
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
bool pg_opclass_ownercheck(Oid opc_oid, Oid roleid)
Definition: aclchk.c:5047
bool pg_conversion_ownercheck(Oid conv_oid, Oid roleid)
Definition: aclchk.c:5288
#define ereport(elevel,...)
Definition: elog.h:157
FormData_pg_constraint * Form_pg_constraint
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
bool pg_class_ownercheck(Oid class_oid, Oid roleid)
Definition: aclchk.c:4818
bool pg_foreign_data_wrapper_ownercheck(Oid srv_oid, Oid roleid)
Definition: aclchk.c:5155
int errmsg(const char *fmt,...)
Definition: elog.c:909
#define elog(elevel,...)
Definition: elog.h:232
Definition: pg_list.h:50
#define RelationGetRelid(relation)
Definition: rel.h:477
bool pg_proc_ownercheck(Oid proc_oid, Oid roleid)
Definition: aclchk.c:4896
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
Definition: parse_type.c:291
bool pg_subscription_ownercheck(Oid sub_oid, Oid roleid)
Definition: aclchk.c:5382
bool pg_statistics_object_ownercheck(Oid stat_oid, Oid roleid)
Definition: aclchk.c:5408

◆ get_catalog_object_by_oid()

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

Definition at line 2810 of file objectaddress.c.

References Assert, BTEqualStrategyNumber, get_object_catcache_oid(), get_object_oid_index(), heap_copytuple(), HeapTupleIsValid, ObjectIdGetDatum, OidIsValid, RelationGetRelid, ScanKeyInit(), SearchSysCacheCopy1, systable_beginscan(), systable_endscan(), and systable_getnext().

Referenced by AlterObjectOwner_internal(), EventTriggerSQLDropAddObject(), getConstraintTypeDescription(), getObjectIdentityParts(), pg_event_trigger_ddl_commands(), and pg_identify_object().

2811 {
2812  HeapTuple tuple;
2813  Oid classId = RelationGetRelid(catalog);
2814  int oidCacheId = get_object_catcache_oid(classId);
2815 
2816  if (oidCacheId > 0)
2817  {
2818  tuple = SearchSysCacheCopy1(oidCacheId, ObjectIdGetDatum(objectId));
2819  if (!HeapTupleIsValid(tuple)) /* should not happen */
2820  return NULL;
2821  }
2822  else
2823  {
2824  Oid oidIndexId = get_object_oid_index(classId);
2825  SysScanDesc scan;
2826  ScanKeyData skey;
2827 
2828  Assert(OidIsValid(oidIndexId));
2829 
2830  ScanKeyInit(&skey,
2831  oidcol,
2832  BTEqualStrategyNumber, F_OIDEQ,
2833  ObjectIdGetDatum(objectId));
2834 
2835  scan = systable_beginscan(catalog, oidIndexId, true,
2836  NULL, 1, &skey);
2837  tuple = systable_getnext(scan);
2838  if (!HeapTupleIsValid(tuple))
2839  {
2840  systable_endscan(scan);
2841  return NULL;
2842  }
2843  tuple = heap_copytuple(tuple);
2844 
2845  systable_endscan(scan);
2846  }
2847 
2848  return tuple;
2849 }
HeapTuple heap_copytuple(HeapTuple tuple)
Definition: heaptuple.c:680
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:595
Oid get_object_oid_index(Oid class_id)
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:710
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition: genam.c:383
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:502
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
int get_object_catcache_oid(Oid class_id)
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
#define Assert(condition)
Definition: c.h:804
#define SearchSysCacheCopy1(cacheId, key1)
Definition: syscache.h:175
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
#define RelationGetRelid(relation)
Definition: rel.h:477
#define BTEqualStrategyNumber
Definition: stratnum.h:31

◆ get_object_address()

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

Definition at line 929 of file objectaddress.c.

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_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_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_POLICY, OBJECT_PROCEDURE, OBJECT_PUBLICATION, 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(), pg_get_object_address(), and RemoveObjects().

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

◆ get_object_address_rv()

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

Definition at line 1224 of file objectaddress.c.

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

Referenced by ExecAlterObjectDependsStmt().

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

◆ get_object_attnum_acl()

AttrNumber get_object_attnum_acl ( Oid  class_id)

Definition at line 2713 of file objectaddress.c.

References ObjectPropertyType::attnum_acl, and get_object_property_data().

Referenced by AlterObjectOwner_internal().

2714 {
2715  const ObjectPropertyType *prop = get_object_property_data(class_id);
2716 
2717  return prop->attnum_acl;
2718 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AttrNumber attnum_acl

◆ get_object_attnum_name()

AttrNumber get_object_attnum_name ( Oid  class_id)

Definition at line 2689 of file objectaddress.c.

References ObjectPropertyType::attnum_name, and get_object_property_data().

Referenced by AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), EventTriggerSQLDropAddObject(), and pg_identify_object().

2690 {
2691  const ObjectPropertyType *prop = get_object_property_data(class_id);
2692 
2693  return prop->attnum_name;
2694 }
AttrNumber attnum_name
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_attnum_namespace()

AttrNumber get_object_attnum_namespace ( Oid  class_id)

Definition at line 2697 of file objectaddress.c.

References ObjectPropertyType::attnum_namespace, and get_object_property_data().

Referenced by AlterObjectNamespace_internal(), AlterObjectOwner_internal(), AlterObjectRename_internal(), EventTriggerSQLDropAddObject(), pg_event_trigger_ddl_commands(), and pg_identify_object().

2698 {
2699  const ObjectPropertyType *prop = get_object_property_data(class_id);
2700 
2701  return prop->attnum_namespace;
2702 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AttrNumber attnum_namespace

◆ get_object_attnum_oid()

AttrNumber get_object_attnum_oid ( Oid  class_id)

Definition at line 2681 of file objectaddress.c.

References ObjectPropertyType::attnum_oid, and get_object_property_data().

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

2682 {
2683  const ObjectPropertyType *prop = get_object_property_data(class_id);
2684 
2685  return prop->attnum_oid;
2686 }
AttrNumber attnum_oid
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_attnum_owner()

AttrNumber get_object_attnum_owner ( Oid  class_id)

Definition at line 2705 of file objectaddress.c.

References ObjectPropertyType::attnum_owner, and get_object_property_data().

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

2706 {
2707  const ObjectPropertyType *prop = get_object_property_data(class_id);
2708 
2709  return prop->attnum_owner;
2710 }
AttrNumber attnum_owner
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_catcache_name()

int get_object_catcache_name ( Oid  class_id)

Definition at line 2673 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::name_catcache_id.

Referenced by AlterObjectNamespace_internal(), and AlterObjectRename_internal().

2674 {
2675  const ObjectPropertyType *prop = get_object_property_data(class_id);
2676 
2677  return prop->name_catcache_id;
2678 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_catcache_oid()

int get_object_catcache_oid ( Oid  class_id)

Definition at line 2665 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::oid_catcache_id.

Referenced by AlterObjectNamespace_internal(), AlterObjectRename_internal(), DropObjectById(), and get_catalog_object_by_oid().

2666 {
2667  const ObjectPropertyType *prop = get_object_property_data(class_id);
2668 
2669  return prop->oid_catcache_id;
2670 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_class_descr()

const char* get_object_class_descr ( Oid  class_id)

Definition at line 2649 of file objectaddress.c.

References ObjectPropertyType::class_descr, and get_object_property_data().

Referenced by DropObjectById().

2650 {
2651  const ObjectPropertyType *prop = get_object_property_data(class_id);
2652 
2653  return prop->class_descr;
2654 }
const char * class_descr
Definition: objectaddress.c:99
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_namensp_unique()

bool get_object_namensp_unique ( Oid  class_id)

Definition at line 2746 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::is_nsp_name_unique.

Referenced by EventTriggerSQLDropAddObject(), and pg_identify_object().

2747 {
2748  const ObjectPropertyType *prop = get_object_property_data(class_id);
2749 
2750  return prop->is_nsp_name_unique;
2751 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_namespace()

Oid get_object_namespace ( const ObjectAddress address)

Definition at line 2590 of file objectaddress.c.

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

Referenced by RemoveObjects().

2591 {
2592  int cache;
2593  HeapTuple tuple;
2594  bool isnull;
2595  Oid oid;
2596  const ObjectPropertyType *property;
2597 
2598  /* If not owned by a namespace, just return InvalidOid. */
2599  property = get_object_property_data(address->classId);
2600  if (property->attnum_namespace == InvalidAttrNumber)
2601  return InvalidOid;
2602 
2603  /* Currently, we can only handle object types with system caches. */
2604  cache = property->oid_catcache_id;
2605  Assert(cache != -1);
2606 
2607  /* Fetch tuple from syscache and extract namespace attribute. */
2608  tuple = SearchSysCache1(cache, ObjectIdGetDatum(address->objectId));
2609  if (!HeapTupleIsValid(tuple))
2610  elog(ERROR, "cache lookup failed for cache %d oid %u",
2611  cache, address->objectId);
2612  oid = DatumGetObjectId(SysCacheGetAttr(cache,
2613  tuple,
2614  property->attnum_namespace,
2615  &isnull));
2616  Assert(!isnull);
2617  ReleaseSysCache(tuple);
2618 
2619  return oid;
2620 }
#define DatumGetObjectId(X)
Definition: postgres.h:544
unsigned int Oid
Definition: postgres_ext.h:31
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
#define ERROR
Definition: elog.h:46
static const ObjectPropertyType * get_object_property_data(Oid class_id)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1127
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition: syscache.c:1388
#define InvalidOid
Definition: postgres_ext.h:36
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
#define Assert(condition)
Definition: c.h:804
AttrNumber attnum_namespace
#define InvalidAttrNumber
Definition: attnum.h:23
#define elog(elevel,...)
Definition: elog.h:232

◆ get_object_oid_index()

Oid get_object_oid_index ( Oid  class_id)

Definition at line 2657 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::oid_index_oid.

Referenced by DropObjectById(), and get_catalog_object_by_oid().

2658 {
2659  const ObjectPropertyType *prop = get_object_property_data(class_id);
2660 
2661  return prop->oid_index_oid;
2662 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_type()

ObjectType get_object_type ( Oid  class_id,
Oid  object_id 
)

Definition at line 2728 of file objectaddress.c.

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

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

2729 {
2730  const ObjectPropertyType *prop = get_object_property_data(class_id);
2731 
2732  if (prop->objtype == OBJECT_TABLE)
2733  {
2734  /*
2735  * If the property data says it's a table, dig a little deeper to get
2736  * the real relation kind, so that callers can produce more precise
2737  * error messages.
2738  */
2739  return get_relkind_objtype(get_rel_relkind(object_id));
2740  }
2741  else
2742  return prop->objtype;
2743 }
char get_rel_relkind(Oid relid)
Definition: lsyscache.c:1974
static const ObjectPropertyType * get_object_property_data(Oid class_id)
ObjectType get_relkind_objtype(char relkind)

◆ get_relkind_objtype()

ObjectType get_relkind_objtype ( char  relkind)

Definition at line 5937 of file objectaddress.c.

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(), ExecCheckRTPerms(), get_object_type(), get_rel_from_relname(), heap_force_common(), LockViewRecurse_walker(), MergeAttributes(), pg_prewarm(), pgrowlocks(), PublicationAddTables(), RangeVarCallbackForAlterRelation(), RangeVarCallbackForDropRelation(), RangeVarCallbackForLockTable(), RangeVarCallbackForPolicy(), RangeVarCallbackForRenameRule(), RangeVarCallbackForRenameTrigger(), RangeVarCallbackOwnsRelation(), RangeVarCallbackOwnsTable(), RangeVarGetAndCheckCreationNamespace(), renameatt_check(), transformTableLikeClause(), and truncate_check_perms().

5938 {
5939  switch (relkind)
5940  {
5941  case RELKIND_RELATION:
5942  case RELKIND_PARTITIONED_TABLE:
5943  return OBJECT_TABLE;
5944  case RELKIND_INDEX:
5945  case RELKIND_PARTITIONED_INDEX:
5946  return OBJECT_INDEX;
5947  case RELKIND_SEQUENCE:
5948  return OBJECT_SEQUENCE;
5949  case RELKIND_VIEW:
5950  return OBJECT_VIEW;
5951  case RELKIND_MATVIEW:
5952  return OBJECT_MATVIEW;
5953  case RELKIND_FOREIGN_TABLE:
5954  return OBJECT_FOREIGN_TABLE;
5955  case RELKIND_TOASTVALUE:
5956  return OBJECT_TABLE;
5957  default:
5958  /* Per above, don't raise an error */
5959  return OBJECT_TABLE;
5960  }
5961 }

◆ getObjectDescription()

char* getObjectDescription ( const ObjectAddress object,
bool  missing_ok 
)

Definition at line 2858 of file objectaddress.c.

References _, AccessShareLock, AMOID, appendStringInfo(), Assert, attname, BTEqualStrategyNumber, CLAOID, ObjectAddress::classId, CollationIsVisible(), COLLOID, CONSTROID, ConversionIsVisible(), CONVOID, StringInfoData::data, datname, elog, ERROR, EVENTTRIGGEROID, ForeignDataWrapper::fdwname, format_operator(), format_operator_extended(), FORMAT_OPERATOR_INVALID_AS_NULL, FORMAT_PROC_INVALID_AS_NULL, format_procedure(), format_procedure_extended(), 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(), GetForeignDataWrapperExtended(), GetForeignServer(), GetForeignServerExtended(), getObjectClass(), getObjectDescription(), getOpFamilyDescription(), getRelationDescription(), GETSTRUCT, GetUserNameFromId(), HeapTupleIsValid, initStringInfo(), LargeObjectExists(), StringInfoData::len, NameStr, ObjectAddress::objectId, ObjectIdGetDatum, ObjectAddress::objectSubId, OCLASS_AM, OCLASS_AMOP, OCLASS_AMPROC, OCLASS_CAST, OCLASS_CLASS, OCLASS_COLLATION, OCLASS_CONSTRAINT, OCLASS_CONVERSION, OCLASS_DATABASE, OCLASS_DEFACL, OCLASS_DEFAULT, OCLASS_EVENT_TRIGGER, OCLASS_EXTENSION, OCLASS_FDW, OCLASS_FOREIGN_SERVER, OCLASS_LANGUAGE, OCLASS_LARGEOBJECT, OCLASS_OPCLASS, OCLASS_OPERATOR, OCLASS_OPFAMILY, OCLASS_POLICY, OCLASS_PROC, OCLASS_PUBLICATION, OCLASS_PUBLICATION_REL, OCLASS_REWRITE, OCLASS_ROLE, OCLASS_SCHEMA, OCLASS_STATISTIC_EXT, OCLASS_SUBSCRIPTION, OCLASS_TBLSPACE, OCLASS_TRANSFORM, OCLASS_TRIGGER, OCLASS_TSCONFIG, OCLASS_TSDICT, OCLASS_TSPARSER, OCLASS_TSTEMPLATE, OCLASS_TYPE, OCLASS_USER_MAPPING, OidIsValid, OpclassIsVisible(), pfree(), proname, PUBLICATIONREL, quote_qualified_identifier(), ReleaseSysCache(), ScanKeyInit(), SearchSysCache1(), ForeignServer::servername, STATEXTOID, StatisticsObjIsVisible(), subname, systable_beginscan(), systable_endscan(), systable_getnext(), table_close(), table_open(), TRFOID, TSConfigIsVisible(), TSCONFIGOID, TSDictionaryIsVisible(), TSDICTOID, TSParserIsVisible(), TSPARSEROID, TSTemplateIsVisible(), TSTEMPLATEOID, typname, USERMAPPINGOID, and username.

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

2859 {
2860  StringInfoData buffer;
2861 
2862  initStringInfo(&buffer);
2863 
2864  switch (getObjectClass(object))
2865  {
2866  case OCLASS_CLASS:
2867  if (object->objectSubId == 0)
2868  getRelationDescription(&buffer, object->objectId, missing_ok);
2869  else
2870  {
2871  /* column, not whole relation */
2872  StringInfoData rel;
2873  char *attname = get_attname(object->objectId,
2874  object->objectSubId,
2875  missing_ok);
2876 
2877  if (!attname)
2878  break;
2879 
2880  initStringInfo(&rel);
2881  getRelationDescription(&rel, object->objectId, missing_ok);
2882  /* translator: second %s is, e.g., "table %s" */
2883  appendStringInfo(&buffer, _("column %s of %s"),
2884  attname, rel.data);
2885  pfree(rel.data);
2886  }
2887  break;
2888 
2889  case OCLASS_PROC:
2890  {
2892  char *proname = format_procedure_extended(object->objectId,
2893  flags);
2894 
2895  if (proname == NULL)
2896  break;
2897 
2898  appendStringInfo(&buffer, _("function %s"), proname);
2899  break;
2900  }
2901 
2902  case OCLASS_TYPE:
2903  {
2905  char *typname = format_type_extended(object->objectId, -1,
2906  flags);
2907 
2908  if (typname == NULL)
2909  break;
2910 
2911  appendStringInfo(&buffer, _("type %s"), typname);
2912  break;
2913  }
2914 
2915  case OCLASS_CAST:
2916  {
2917  Relation castDesc;
2918  ScanKeyData skey[1];
2919  SysScanDesc rcscan;
2920  HeapTuple tup;
2921  Form_pg_cast castForm;
2922 
2923  castDesc = table_open(CastRelationId, AccessShareLock);
2924 
2925  ScanKeyInit(&skey[0],
2926  Anum_pg_cast_oid,
2927  BTEqualStrategyNumber, F_OIDEQ,
2928  ObjectIdGetDatum(object->objectId));
2929 
2930  rcscan = systable_beginscan(castDesc, CastOidIndexId, true,
2931  NULL, 1, skey);
2932 
2933  tup = systable_getnext(rcscan);
2934 
2935  if (!HeapTupleIsValid(tup))
2936  {
2937  if (!missing_ok)
2938  elog(ERROR, "could not find tuple for cast %u",
2939  object->objectId);
2940 
2941  systable_endscan(rcscan);
2942  table_close(castDesc, AccessShareLock);
2943  break;
2944  }
2945 
2946  castForm = (Form_pg_cast) GETSTRUCT(tup);
2947 
2948  appendStringInfo(&buffer, _("cast from %s to %s"),
2949  format_type_be(castForm->castsource),
2950  format_type_be(castForm->casttarget));
2951 
2952  systable_endscan(rcscan);
2953  table_close(castDesc, AccessShareLock);
2954  break;
2955  }
2956 
2957  case OCLASS_COLLATION:
2958  {
2959  HeapTuple collTup;
2960  Form_pg_collation coll;
2961  char *nspname;
2962 
2963  collTup = SearchSysCache1(COLLOID,
2964  ObjectIdGetDatum(object->objectId));
2965  if (!HeapTupleIsValid(collTup))
2966  {
2967  if (!missing_ok)
2968  elog(ERROR, "cache lookup failed for collation %u",
2969  object->objectId);
2970  break;
2971  }
2972 
2973  coll = (Form_pg_collation) GETSTRUCT(collTup);
2974 
2975  /* Qualify the name if not visible in search path */
2976  if (CollationIsVisible(object->objectId))
2977  nspname = NULL;
2978  else
2979  nspname = get_namespace_name(coll->collnamespace);
2980 
2981  appendStringInfo(&buffer, _("collation %s"),
2983  NameStr(coll->collname)));
2984  ReleaseSysCache(collTup);
2985  break;
2986  }
2987 
2988  case OCLASS_CONSTRAINT:
2989  {
2990  HeapTuple conTup;
2991  Form_pg_constraint con;
2992 
2993  conTup = SearchSysCache1(CONSTROID,
2994  ObjectIdGetDatum(object->objectId));
2995  if (!HeapTupleIsValid(conTup))
2996  {
2997  if (!missing_ok)
2998  elog(ERROR, "cache lookup failed for constraint %u",
2999  object->objectId);
3000  break;
3001  }
3002 
3003  con = (Form_pg_constraint) GETSTRUCT(conTup);
3004 
3005  if (OidIsValid(con->conrelid))
3006  {
3007  StringInfoData rel;
3008 
3009  initStringInfo(&rel);
3010  getRelationDescription(&rel, con->conrelid, false);
3011  /* translator: second %s is, e.g., "table %s" */
3012  appendStringInfo(&buffer, _("constraint %s on %s"),
3013  NameStr(con->conname), rel.data);
3014  pfree(rel.data);
3015  }
3016  else
3017  {
3018  appendStringInfo(&buffer, _("constraint %s"),
3019  NameStr(con->conname));
3020  }
3021 
3022  ReleaseSysCache(conTup);
3023  break;
3024  }
3025 
3026  case OCLASS_CONVERSION:
3027  {
3028  HeapTuple conTup;
3029  Form_pg_conversion conv;
3030  char *nspname;
3031 
3032  conTup = SearchSysCache1(CONVOID,
3033  ObjectIdGetDatum(object->objectId));
3034  if (!HeapTupleIsValid(conTup))
3035  {
3036  if (!missing_ok)
3037  elog(ERROR, "cache lookup failed for conversion %u",
3038  object->objectId);
3039  break;
3040  }
3041 
3042  conv = (Form_pg_conversion) GETSTRUCT(conTup);
3043 
3044  /* Qualify the name if not visible in search path */
3045  if (ConversionIsVisible(object->objectId))
3046  nspname = NULL;
3047  else
3048  nspname = get_namespace_name(conv->connamespace);
3049 
3050  appendStringInfo(&buffer, _("conversion %s"),
3052  NameStr(conv->conname)));
3053  ReleaseSysCache(conTup);
3054  break;
3055  }
3056 
3057  case OCLASS_DEFAULT:
3058  {
3059  Relation attrdefDesc;
3060  ScanKeyData skey[1];
3061  SysScanDesc adscan;
3062  HeapTuple tup;
3063  Form_pg_attrdef attrdef;
3064  ObjectAddress colobject;
3065 
3066  attrdefDesc = table_open(AttrDefaultRelationId, AccessShareLock);
3067 
3068  ScanKeyInit(&skey[0],
3069  Anum_pg_attrdef_oid,
3070  BTEqualStrategyNumber, F_OIDEQ,
3071  ObjectIdGetDatum(object->objectId));
3072 
3073  adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndexId,
3074  true, NULL, 1, skey);
3075 
3076  tup = systable_getnext(adscan);
3077 
3078  if (!HeapTupleIsValid(tup))
3079  {
3080  if (!missing_ok)
3081  elog(ERROR, "could not find tuple for attrdef %u",
3082  object->objectId);
3083 
3084  systable_endscan(adscan);
3085  table_close(attrdefDesc, AccessShareLock);
3086  break;
3087  }
3088 
3089  attrdef = (Form_pg_attrdef) GETSTRUCT(tup);
3090 
3091  colobject.classId = RelationRelationId;
3092  colobject.objectId = attrdef->adrelid;
3093  colobject.objectSubId = attrdef->adnum;
3094 
3095  /* translator: %s is typically "column %s of table %s" */
3096  appendStringInfo(&buffer, _("default value for %s"),
3097  getObjectDescription(&colobject, false));
3098 
3099  systable_endscan(adscan);
3100  table_close(attrdefDesc, AccessShareLock);
3101  break;
3102  }
3103 
3104  case OCLASS_LANGUAGE:
3105  {
3106  char *langname = get_language_name(object->objectId,
3107  missing_ok);
3108 
3109  if (langname)
3110  appendStringInfo(&buffer, _("language %s"),
3111  get_language_name(object->objectId, false));
3112  break;
3113  }
3114 
3115  case OCLASS_LARGEOBJECT:
3116  if (!LargeObjectExists(object->objectId))
3117  break;
3118  appendStringInfo(&buffer, _("large object %u"),
3119  object->objectId);
3120  break;
3121 
3122  case OCLASS_OPERATOR:
3123  {
3125  char *oprname = format_operator_extended(object->objectId,
3126  flags);
3127 
3128  if (oprname == NULL)
3129  break;
3130 
3131  appendStringInfo(&buffer, _("operator %s"), oprname);
3132  break;
3133  }
3134 
3135  case OCLASS_OPCLASS:
3136  {
3137  HeapTuple opcTup;
3138  Form_pg_opclass opcForm;
3139  HeapTuple amTup;
3140  Form_pg_am amForm;
3141  char *nspname;
3142 
3143  opcTup = SearchSysCache1(CLAOID,
3144  ObjectIdGetDatum(object->objectId));
3145  if (!HeapTupleIsValid(opcTup))
3146  {
3147  if (!missing_ok)
3148  elog(ERROR, "cache lookup failed for opclass %u",
3149  object->objectId);
3150  break;
3151  }
3152 
3153  opcForm = (Form_pg_opclass) GETSTRUCT(opcTup);
3154 
3155  amTup = SearchSysCache1(AMOID,
3156  ObjectIdGetDatum(opcForm->opcmethod));
3157  if (!HeapTupleIsValid(amTup))
3158  elog(ERROR, "cache lookup failed for access method %u",
3159  opcForm->opcmethod);
3160  amForm = (Form_pg_am) GETSTRUCT(amTup);
3161 
3162  /* Qualify the name if not visible in search path */
3163  if (OpclassIsVisible(object->objectId))
3164  nspname = NULL;
3165  else
3166  nspname = get_namespace_name(opcForm->opcnamespace);
3167 
3168  appendStringInfo(&buffer, _("operator class %s for access method %s"),
3170  NameStr(opcForm->opcname)),
3171  NameStr(amForm->amname));
3172 
3173  ReleaseSysCache(amTup);
3174  ReleaseSysCache(opcTup);
3175  break;
3176  }
3177 
3178  case OCLASS_OPFAMILY:
3179  getOpFamilyDescription(&buffer, object->objectId, missing_ok);
3180  break;
3181 
3182  case OCLASS_AM:
3183  {
3184  HeapTuple tup;
3185 
3186  tup = SearchSysCache1(AMOID,
3187  ObjectIdGetDatum(object->objectId));
3188  if (!HeapTupleIsValid(tup))
3189  {
3190  if (!missing_ok)
3191  elog(ERROR, "cache lookup failed for access method %u",
3192  object->objectId);
3193  break;
3194  }
3195 
3196  appendStringInfo(&buffer, _("access method %s"),
3197  NameStr(((Form_pg_am) GETSTRUCT(tup))->amname));
3198  ReleaseSysCache(tup);
3199  break;
3200  }
3201 
3202  case OCLASS_AMOP:
3203  {
3204  Relation amopDesc;
3205  HeapTuple tup;
3206  ScanKeyData skey[1];
3207  SysScanDesc amscan;
3208  Form_pg_amop amopForm;
3209  StringInfoData opfam;
3210 
3211  amopDesc = table_open(AccessMethodOperatorRelationId,
3212  AccessShareLock);
3213 
3214  ScanKeyInit(&skey[0],
3215  Anum_pg_amop_oid,
3216  BTEqualStrategyNumber, F_OIDEQ,
3217  ObjectIdGetDatum(object->objectId));
3218 
3219  amscan = systable_beginscan(amopDesc, AccessMethodOperatorOidIndexId, true,
3220  NULL, 1, skey);
3221 
3222  tup = systable_getnext(amscan);
3223 
3224  if (!HeapTupleIsValid(tup))
3225  {
3226  if (!missing_ok)
3227  elog(ERROR, "could not find tuple for amop entry %u",
3228  object->objectId);
3229 
3230  systable_endscan(amscan);
3231  table_close(amopDesc, AccessShareLock);
3232  break;
3233  }
3234 
3235  amopForm = (Form_pg_amop) GETSTRUCT(tup);
3236 
3237  initStringInfo(&opfam);
3238  getOpFamilyDescription(&opfam, amopForm->amopfamily, false);
3239 
3240  /*------
3241  translator: %d is the operator strategy (a number), the
3242  first two %s's are data type names, the third %s is the
3243  description of the operator family, and the last %s is the
3244  textual form of the operator with arguments. */
3245  appendStringInfo(&buffer, _("operator %d (%s, %s) of %s: %s"),
3246  amopForm->amopstrategy,
3247  format_type_be(amopForm->amoplefttype),
3248  format_type_be(amopForm->amoprighttype),
3249  opfam.data,
3250  format_operator(amopForm->amopopr));
3251 
3252  pfree(opfam.data);
3253 
3254  systable_endscan(amscan);
3255  table_close(amopDesc, AccessShareLock);
3256  break;
3257  }
3258 
3259  case OCLASS_AMPROC:
3260  {
3261  Relation amprocDesc;
3262  ScanKeyData skey[1];
3263  SysScanDesc amscan;
3264  HeapTuple tup;
3265  Form_pg_amproc amprocForm;
3266  StringInfoData opfam;
3267 
3268  amprocDesc = table_open(AccessMethodProcedureRelationId,
3269  AccessShareLock);
3270 
3271  ScanKeyInit(&skey[0],
3272  Anum_pg_amproc_oid,
3273  BTEqualStrategyNumber, F_OIDEQ,
3274  ObjectIdGetDatum(object->objectId));
3275 
3276  amscan = systable_beginscan(amprocDesc, AccessMethodProcedureOidIndexId, true,
3277  NULL, 1, skey);
3278 
3279  tup = systable_getnext(amscan);
3280 
3281  if (!HeapTupleIsValid(tup))
3282  {
3283  if (!missing_ok)
3284  elog(ERROR, "could not find tuple for amproc entry %u",
3285  object->objectId);
3286 
3287  systable_endscan(amscan);
3288  table_close(amprocDesc, AccessShareLock);
3289  break;
3290  }
3291 
3292  amprocForm = (Form_pg_amproc) GETSTRUCT(tup);
3293 
3294  initStringInfo(&opfam);
3295  getOpFamilyDescription(&opfam, amprocForm->amprocfamily, false);
3296 
3297  /*------
3298  translator: %d is the function number, the first two %s's
3299  are data type names, the third %s is the description of the
3300  operator family, and the last %s is the textual form of the
3301  function with arguments. */
3302  appendStringInfo(&buffer, _("function %d (%s, %s) of %s: %s"),
3303  amprocForm->amprocnum,
3304  format_type_be(amprocForm->amproclefttype),
3305  format_type_be(amprocForm->amprocrighttype),
3306  opfam.data,
3307  format_procedure(amprocForm->amproc));
3308 
3309  pfree(opfam.data);
3310 
3311  systable_endscan(amscan);
3312  table_close(amprocDesc, AccessShareLock);
3313  break;
3314  }
3315 
3316  case OCLASS_REWRITE:
3317  {
3318  Relation ruleDesc;
3319  ScanKeyData skey[1];
3320  SysScanDesc rcscan;
3321  HeapTuple tup;
3323  StringInfoData rel;
3324 
3325  ruleDesc = table_open(RewriteRelationId, AccessShareLock);
3326 
3327  ScanKeyInit(&skey[0],
3328  Anum_pg_rewrite_oid,
3329  BTEqualStrategyNumber, F_OIDEQ,
3330  ObjectIdGetDatum(object->objectId));
3331 
3332  rcscan = systable_beginscan(ruleDesc, RewriteOidIndexId, true,
3333  NULL, 1, skey);
3334 
3335  tup = systable_getnext(rcscan);
3336 
3337  if (!HeapTupleIsValid(tup))
3338  {
3339  if (!missing_ok)
3340  elog(ERROR, "could not find tuple for rule %u",
3341  object->objectId);
3342 
3343  systable_endscan(rcscan);
3344  table_close(ruleDesc, AccessShareLock);
3345  break;
3346  }
3347 
3348  rule = (Form_pg_rewrite) GETSTRUCT(tup);
3349 
3350  initStringInfo(&rel);
3351  getRelationDescription(&rel, rule->ev_class, false);
3352 
3353  /* translator: second %s is, e.g., "table %s" */
3354  appendStringInfo(&buffer, _("rule %s on %s"),
3355  NameStr(rule->rulename), rel.data);
3356  pfree(rel.data);
3357  systable_endscan(rcscan);
3358  table_close(ruleDesc, AccessShareLock);
3359  break;
3360  }
3361 
3362  case OCLASS_TRIGGER:
3363  {
3364  Relation trigDesc;
3365  ScanKeyData skey[1];
3366  SysScanDesc tgscan;
3367  HeapTuple tup;
3368  Form_pg_trigger trig;
3369  StringInfoData rel;
3370 
3371  trigDesc = table_open(TriggerRelationId, AccessShareLock);
3372 
3373  ScanKeyInit(&skey[0],
3374  Anum_pg_trigger_oid,
3375  BTEqualStrategyNumber, F_OIDEQ,
3376  ObjectIdGetDatum(object->objectId));
3377 
3378  tgscan = systable_beginscan(trigDesc, TriggerOidIndexId, true,
3379  NULL, 1, skey);
3380 
3381  tup = systable_getnext(tgscan);
3382 
3383  if (!HeapTupleIsValid(tup))
3384  {
3385  if (!missing_ok)
3386  elog(ERROR, "could not find tuple for trigger %u",
3387  object->objectId);
3388 
3389  systable_endscan(tgscan);
3390  table_close(trigDesc, AccessShareLock);
3391  break;
3392  }
3393 
3394  trig = (Form_pg_trigger) GETSTRUCT(tup);
3395 
3396  initStringInfo(&rel);
3397  getRelationDescription(&rel, trig->tgrelid, false);
3398 
3399  /* translator: second %s is, e.g., "table %s" */
3400  appendStringInfo(&buffer, _("trigger %s on %s"),
3401  NameStr(trig->tgname), rel.data);
3402  pfree(rel.data);
3403  systable_endscan(tgscan);
3404  table_close(trigDesc, AccessShareLock);
3405  break;
3406  }
3407 
3408  case OCLASS_SCHEMA:
3409  {
3410  char *nspname;
3411 
3412  nspname = get_namespace_name(object->objectId);
3413  if (!nspname)
3414  {
3415  if (!missing_ok)
3416  elog(ERROR, "cache lookup failed for namespace %u",
3417  object->objectId);
3418  break;
3419  }
3420  appendStringInfo(&buffer, _("schema %s"), nspname);
3421  break;
3422  }
3423 
3424  case OCLASS_STATISTIC_EXT:
3425  {
3426  HeapTuple stxTup;
3427  Form_pg_statistic_ext stxForm;
3428  char *nspname;
3429 
3430  stxTup = SearchSysCache1(STATEXTOID,
3431  ObjectIdGetDatum(object->objectId));
3432  if (!HeapTupleIsValid(stxTup))
3433  {
3434  if (!missing_ok)
3435  elog(ERROR, "could not find tuple for statistics object %u",
3436  object->objectId);
3437  break;
3438  }
3439 
3440  stxForm = (Form_pg_statistic_ext) GETSTRUCT(stxTup);
3441 
3442  /* Qualify the name if not visible in search path */
3443  if (StatisticsObjIsVisible(object->objectId))
3444  nspname = NULL;
3445  else
3446  nspname = get_namespace_name(stxForm->stxnamespace);
3447 
3448  appendStringInfo(&buffer, _("statistics object %s"),
3450  NameStr(stxForm->stxname)));
3451 
3452  ReleaseSysCache(stxTup);
3453  break;
3454  }
3455 
3456  case OCLASS_TSPARSER:
3457  {
3458  HeapTuple tup;
3459  Form_pg_ts_parser prsForm;
3460  char *nspname;
3461 
3463  ObjectIdGetDatum(object->objectId));
3464  if (!HeapTupleIsValid(tup))
3465  {
3466  if (!missing_ok)
3467  elog(ERROR, "cache lookup failed for text search parser %u",
3468  object->objectId);
3469  break;
3470  }
3471  prsForm = (Form_pg_ts_parser) GETSTRUCT(tup);
3472 
3473  /* Qualify the name if not visible in search path */
3474  if (TSParserIsVisible(object->objectId))
3475  nspname = NULL;
3476  else
3477  nspname = get_namespace_name(prsForm->prsnamespace);
3478 
3479  appendStringInfo(&buffer, _("text search parser %s"),
3481  NameStr(prsForm->prsname)));
3482  ReleaseSysCache(tup);
3483  break;
3484  }
3485 
3486  case OCLASS_TSDICT:
3487  {
3488  HeapTuple tup;
3489  Form_pg_ts_dict dictForm;
3490  char *nspname;
3491 
3492  tup = SearchSysCache1(TSDICTOID,
3493  ObjectIdGetDatum(object->objectId));
3494  if (!HeapTupleIsValid(tup))
3495  {
3496  if (!missing_ok)
3497  elog(ERROR, "cache lookup failed for text search dictionary %u",
3498  object->objectId);
3499  break;
3500  }
3501 
3502  dictForm = (Form_pg_ts_dict) GETSTRUCT(tup);
3503 
3504  /* Qualify the name if not visible in search path */
3505  if (TSDictionaryIsVisible(object->objectId))
3506  nspname = NULL;
3507  else
3508  nspname = get_namespace_name(dictForm->dictnamespace);
3509 
3510  appendStringInfo(&buffer, _("text search dictionary %s"),
3512  NameStr(dictForm->dictname)));
3513  ReleaseSysCache(tup);
3514  break;
3515  }
3516 
3517  case OCLASS_TSTEMPLATE:
3518  {
3519  HeapTuple tup;
3520  Form_pg_ts_template tmplForm;
3521  char *nspname;
3522 
3524  ObjectIdGetDatum(object->objectId));
3525  if (!HeapTupleIsValid(tup))
3526  {
3527  if (!missing_ok)
3528  elog(ERROR, "cache lookup failed for text search template %u",
3529  object->objectId);
3530  break;
3531  }
3532 
3533  tmplForm = (Form_pg_ts_template) GETSTRUCT(tup);
3534 
3535  /* Qualify the name if not visible in search path */
3536  if (TSTemplateIsVisible(object->objectId))
3537  nspname = NULL;
3538  else
3539  nspname = get_namespace_name(tmplForm->tmplnamespace);
3540 
3541  appendStringInfo(&buffer, _("text search template %s"),
3543  NameStr(tmplForm->tmplname)));
3544  ReleaseSysCache(tup);
3545  break;
3546  }
3547 
3548  case OCLASS_TSCONFIG:
3549  {
3550  HeapTuple tup;
3551  Form_pg_ts_config cfgForm;
3552  char *nspname;
3553 
3555  ObjectIdGetDatum(object->objectId));
3556  if (!HeapTupleIsValid(tup))
3557  {
3558  if (!missing_ok)
3559  elog(ERROR, "cache lookup failed for text search configuration %u",
3560  object->objectId);
3561  break;
3562  }
3563 
3564  cfgForm = (Form_pg_ts_config) GETSTRUCT(tup);
3565 
3566  /* Qualify the name if not visible in search path */
3567  if (TSConfigIsVisible(object->objectId))
3568  nspname = NULL;
3569  else
3570  nspname = get_namespace_name(cfgForm->cfgnamespace);
3571 
3572  appendStringInfo(&buffer, _("text search configuration %s"),
3574  NameStr(cfgForm->cfgname)));
3575  ReleaseSysCache(tup);
3576  break;
3577  }
3578 
3579  case OCLASS_ROLE:
3580  {
3581  char *username = GetUserNameFromId(object->objectId,
3582  missing_ok);
3583 
3584  if (username)
3585  appendStringInfo(&buffer, _("role %s"), username);
3586  break;
3587  }
3588 
3589  case OCLASS_DATABASE:
3590  {
3591  char *datname;
3592 
3593  datname = get_database_name(object->objectId);
3594  if (!datname)
3595  {
3596  if (!missing_ok)
3597  elog(ERROR, "cache lookup failed for database %u",
3598  object->objectId);
3599  break;
3600  }
3601  appendStringInfo(&buffer, _("database %s"), datname);
3602  break;
3603  }
3604 
3605  case OCLASS_TBLSPACE:
3606  {
3607  char *tblspace;
3608 
3609  tblspace = get_tablespace_name(object->objectId);
3610  if (!tblspace)
3611  {
3612  if (!missing_ok)
3613  elog(ERROR, "cache lookup failed for tablespace %u",
3614  object->objectId);
3615  break;
3616  }
3617  appendStringInfo(&buffer, _("tablespace %s"), tblspace);
3618  break;
3619  }
3620 
3621  case OCLASS_FDW:
3622  {
3623  ForeignDataWrapper *fdw;
3624 
3626  missing_ok);
3627  if (fdw)
3628  appendStringInfo(&buffer, _("foreign-data wrapper %s"), fdw->fdwname);
3629  break;
3630  }
3631 
3632  case OCLASS_FOREIGN_SERVER:
3633  {
3634  ForeignServer *srv;
3635 
3636  srv = GetForeignServerExtended(object->objectId, missing_ok);
3637  if (srv)
3638  appendStringInfo(&buffer, _("server %s"), srv->servername);
3639  break;
3640  }
3641 
3642  case OCLASS_USER_MAPPING:
3643  {
3644  HeapTuple tup;
3645  Oid useid;
3646  char *usename;
3647  Form_pg_user_mapping umform;
3648  ForeignServer *srv;
3649 
3651  ObjectIdGetDatum(object->objectId));
3652  if (!HeapTupleIsValid(tup))
3653  {
3654  if (!missing_ok)
3655  elog(ERROR, "cache lookup failed for user mapping %u",
3656  object->objectId);
3657  break;
3658  }
3659 
3660  umform = (Form_pg_user_mapping) GETSTRUCT(tup);
3661  useid = umform->umuser;
3662  srv = GetForeignServer(umform->umserver);
3663 
3664  ReleaseSysCache(tup);
3665 
3666  if (OidIsValid(useid))
3667  usename = GetUserNameFromId(useid, false);
3668  else
3669  usename = "public";
3670 
3671  appendStringInfo(&buffer, _("user mapping for %s on server %s"), usename,
3672  srv->servername);
3673  break;
3674  }
3675 
3676  case OCLASS_DEFACL:
3677  {
3678  Relation defaclrel;
3679  ScanKeyData skey[1];
3680  SysScanDesc rcscan;
3681  HeapTuple tup;
3682  Form_pg_default_acl defacl;
3683  char *rolename;
3684  char *nspname;
3685 
3686  defaclrel = table_open(DefaultAclRelationId, AccessShareLock);
3687 
3688  ScanKeyInit(&skey[0],
3689  Anum_pg_default_acl_oid,
3690  BTEqualStrategyNumber, F_OIDEQ,
3691  ObjectIdGetDatum(object->objectId));
3692 
3693  rcscan = systable_beginscan(defaclrel, DefaultAclOidIndexId,
3694  true, NULL, 1, skey);
3695 
3696  tup = systable_getnext(rcscan);
3697 
3698  if (!HeapTupleIsValid(tup))
3699  {
3700  if (!missing_ok)
3701  elog(ERROR, "could not find tuple for default ACL %u",
3702  object->objectId);
3703 
3704  systable_endscan(rcscan);
3705  table_close(defaclrel, AccessShareLock);
3706  break;
3707  }
3708 
3709  defacl = (Form_pg_default_acl) GETSTRUCT(tup);
3710 
3711  rolename = GetUserNameFromId(defacl->defaclrole, false);
3712 
3713  if (OidIsValid(defacl->defaclnamespace))
3714  nspname = get_namespace_name(defacl->defaclnamespace);
3715  else
3716  nspname = NULL;
3717 
3718  switch (defacl->defaclobjtype)
3719  {
3720  case DEFACLOBJ_RELATION:
3721  if (nspname)
3722  appendStringInfo(&buffer,
3723  _("default privileges on new relations belonging to role %s in schema %s"),
3724  rolename, nspname);
3725  else
3726  appendStringInfo(&buffer,
3727  _("default privileges on new relations belonging to role %s"),
3728  rolename);
3729  break;
3730  case DEFACLOBJ_SEQUENCE:
3731  if (nspname)
3732  appendStringInfo(&buffer,
3733  _("default privileges on new sequences belonging to role %s in schema %s"),
3734  rolename, nspname);
3735  else
3736  appendStringInfo(&buffer,
3737  _("default privileges on new sequences belonging to role %s"),
3738  rolename);
3739  break;
3740  case DEFACLOBJ_FUNCTION:
3741  if (nspname)
3742  appendStringInfo(&buffer,
3743  _("default privileges on new functions belonging to role %s in schema %s"),
3744  rolename, nspname);
3745  else
3746  appendStringInfo(&buffer,
3747  _("default privileges on new functions belonging to role %s"),
3748  rolename);
3749  break;
3750  case DEFACLOBJ_TYPE:
3751  if (nspname)
3752  appendStringInfo(&buffer,
3753  _("default privileges on new types belonging to role %s in schema %s"),
3754  rolename, nspname);
3755  else
3756  appendStringInfo(&buffer,
3757  _("default privileges on new types belonging to role %s"),
3758  rolename);
3759  break;
3760  case DEFACLOBJ_NAMESPACE:
3761  Assert(!nspname);
3762  appendStringInfo(&buffer,
3763  _("default privileges on new schemas belonging to role %s"),
3764  rolename);
3765  break;
3766  default:
3767  /* shouldn't get here */
3768  if (nspname)
3769  appendStringInfo(&buffer,
3770  _("default privileges belonging to role %s in schema %s"),
3771  rolename, nspname);
3772  else
3773  appendStringInfo(&buffer,
3774  _("default privileges belonging to role %s"),
3775  rolename);
3776  break;
3777  }
3778 
3779  systable_endscan(rcscan);
3780  table_close(defaclrel, AccessShareLock);
3781  break;
3782  }
3783 
3784  case OCLASS_EXTENSION:
3785  {
3786  char *extname;
3787 
3788  extname = get_extension_name(object->objectId);
3789  if (!extname)
3790  {
3791  if (!missing_ok)
3792  elog(ERROR, "cache lookup failed for extension %u",
3793  object->objectId);
3794  break;
3795  }
3796  appendStringInfo(&buffer, _("extension %s"), extname);
3797  break;
3798  }
3799 
3800  case OCLASS_EVENT_TRIGGER:
3801  {
3802  HeapTuple tup;
3803 
3805  ObjectIdGetDatum(object->objectId));
3806  if (!HeapTupleIsValid(tup))
3807  {
3808  if (!missing_ok)
3809  elog(ERROR, "cache lookup failed for event trigger %u",
3810  object->objectId);
3811  break;
3812  }
3813  appendStringInfo(&buffer, _("event trigger %s"),
3814  NameStr(((Form_pg_event_trigger) GETSTRUCT(tup))->evtname));
3815  ReleaseSysCache(tup);
3816  break;
3817  }
3818 
3819  case OCLASS_POLICY:
3820  {
3821  Relation policy_rel;
3822  ScanKeyData skey[1];
3823  SysScanDesc sscan;
3824  HeapTuple tuple;
3825  Form_pg_policy form_policy;
3826  StringInfoData rel;
3827 
3828  policy_rel = table_open(PolicyRelationId, AccessShareLock);
3829 
3830  ScanKeyInit(&skey[0],
3831  Anum_pg_policy_oid,
3832  BTEqualStrategyNumber, F_OIDEQ,
3833  ObjectIdGetDatum(object->objectId));
3834 
3835  sscan = systable_beginscan(policy_rel, PolicyOidIndexId,
3836  true, NULL, 1, skey);
3837 
3838  tuple = systable_getnext(sscan);
3839 
3840  if (!HeapTupleIsValid(tuple))
3841  {
3842  if (!missing_ok)
3843  elog(ERROR, "could not find tuple for policy %u",
3844  object->objectId);
3845 
3846  systable_endscan(sscan);
3847  table_close(policy_rel, AccessShareLock);
3848  break;
3849  }
3850 
3851  form_policy = (Form_pg_policy) GETSTRUCT(tuple);
3852 
3853  initStringInfo(&rel);
3854  getRelationDescription(&rel, form_policy->polrelid, false);
3855 
3856  /* translator: second %s is, e.g., "table %s" */
3857  appendStringInfo(&buffer, _("policy %s on %s"),
3858  NameStr(form_policy->polname), rel.data);
3859  pfree(rel.data);
3860  systable_endscan(sscan);
3861  table_close(policy_rel, AccessShareLock);
3862  break;
3863  }
3864 
3865  case OCLASS_PUBLICATION:
3866  {
3867  char *pubname = get_publication_name(object->objectId,
3868  missing_ok);
3869 
3870  if (pubname)
3871  appendStringInfo(&buffer, _("publication %s"), pubname);
3872  break;
3873  }
3874 
3876  {
3877  HeapTuple tup;
3878  char *pubname;
3879  Form_pg_publication_rel prform;
3880  StringInfoData rel;
3881 
3883  ObjectIdGetDatum(object->objectId));
3884  if (!HeapTupleIsValid(tup))
3885  {
3886  if (!missing_ok)
3887  elog(ERROR, "cache lookup failed for publication table %u",
3888  object->objectId);
3889  break;
3890  }
3891 
3892  prform = (Form_pg_publication_rel) GETSTRUCT(tup);
3893  pubname = get_publication_name(prform->prpubid, false);
3894 
3895  initStringInfo(&rel);
3896  getRelationDescription(&rel, prform->prrelid, false);
3897 
3898  /* translator: first %s is, e.g., "table %s" */
3899  appendStringInfo(&buffer, _("publication of %s in publication %s"),
3900  rel.data, pubname);
3901  pfree(rel.data);
3902  ReleaseSysCache(tup);
3903  break;
3904  }
3905 
3906  case OCLASS_SUBSCRIPTION:
3907  {
3908  char *subname = get_subscription_name(object->objectId,
3909  missing_ok);
3910 
3911  if (subname)
3912  appendStringInfo(&buffer, _("subscription %s"), subname);
3913  break;
3914  }
3915 
3916  case OCLASS_TRANSFORM:
3917  {
3918  HeapTuple trfTup;
3919  Form_pg_transform trfForm;
3920 
3921  trfTup = SearchSysCache1(TRFOID,
3922  ObjectIdGetDatum(object->objectId));
3923  if (!HeapTupleIsValid(trfTup))
3924  {
3925  if (!missing_ok)
3926  elog(ERROR, "could not find tuple for transform %u",
3927  object->objectId);
3928  break;
3929  }
3930 
3931  trfForm = (Form_pg_transform) GETSTRUCT(trfTup);
3932 
3933  appendStringInfo(&buffer, _("transform for %s language %s"),
3934  format_type_be(trfForm->trftype),
3935  get_language_name(trfForm->trflang, false));
3936 
3937  ReleaseSysCache(trfTup);
3938  break;
3939  }
3940 
3941  /*
3942  * There's intentionally no default: case here; we want the
3943  * compiler to warn if a new OCLASS hasn't been handled above.
3944  */
3945  }
3946 
3947  /* an empty buffer is equivalent to no object found */
3948  if (buffer.len == 0)
3949  return NULL;
3950 
3951  return buffer.data;
3952 }
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
void table_close(Relation relation, LOCKMODE lockmode)
Definition: table.c:167
NameData proname
Definition: pg_proc.h:35
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:595
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
Definition: syscache.h:36
char * get_language_name(Oid langoid, bool missing_ok)
Definition: lsyscache.c:1154
FormData_pg_ts_config * Form_pg_ts_config
Definition: pg_ts_config.h:48
uint16 bits16
Definition: c.h:449
char * fdwname
Definition: foreign.h:28
FormData_pg_amproc * Form_pg_amproc
Definition: pg_amproc.h:68
char * get_extension_name(Oid ext_oid)
Definition: extension.c:185
static void getOpFamilyDescription(StringInfo buffer, Oid opfid, bool missing_ok)
static void getRelationDescription(StringInfo buffer, Oid relid, bool missing_ok)
#define AccessShareLock
Definition: lockdefs.h:36
bool StatisticsObjIsVisible(Oid relid)
Definition: namespace.c:2280
char * format_type_be(Oid type_oid)
Definition: format_type.c:339
NameData datname
Definition: pg_database.h:35
char * format_operator(Oid operator_oid)
Definition: regproc.c:852
unsigned int Oid
Definition: postgres_ext.h:31
NameData subname
ObjectClass getObjectClass(const ObjectAddress *object)
Definition: dependency.c:2740
#define OidIsValid(objectId)
Definition: c.h:710
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition: genam.c:383
char * get_publication_name(Oid pubid, bool missing_ok)
char * format_operator_extended(Oid operator_oid, bits16 flags)
Definition: regproc.c:781
Definition: localtime.c:72
char * get_subscription_name(Oid subid, bool missing_ok)
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:502
void pfree(void *pointer)
Definition: mcxt.c:1169
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:91
FormData_pg_transform * Form_pg_transform
Definition: pg_transform.h:43
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
#define ERROR
Definition: elog.h:46
NameData attname
Definition: pg_attribute.h:41
bool TSConfigIsVisible(Oid cfgid)
Definition: namespace.c:2782
char * get_database_name(Oid dbid)
Definition: dbcommands.c:2113
FormData_pg_user_mapping * Form_pg_user_mapping
FormData_pg_ts_dict * Form_pg_ts_dict
Definition: pg_ts_dict.h:52
FormData_pg_default_acl * Form_pg_default_acl
char * get_namespace_name(Oid nspid)
Definition: lsyscache.c:3316
bool CollationIsVisible(Oid collid)
Definition: namespace.c:2093
FormData_pg_cast * Form_pg_cast
Definition: pg_cast.h:57
const char * username
Definition: pgbench.c:282
NameData typname
Definition: pg_type.h:41
void initStringInfo(StringInfo str)
Definition: stringinfo.c:59
FormData_pg_attrdef * Form_pg_attrdef
Definition: pg_attrdef.h:48
bool TSDictionaryIsVisible(Oid dictId)
Definition: namespace.c:2529
char * quote_qualified_identifier(const char *qualifier, const char *ident)
Definition: ruleutils.c:11458
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1127
#define FORMAT_TYPE_INVALID_AS_NULL
Definition: builtins.h:115
#define FORMAT_OPERATOR_INVALID_AS_NULL
Definition: regproc.h:24
ForeignServer * GetForeignServer(Oid serverid)
Definition: foreign.c:109
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
FormData_pg_ts_parser * Form_pg_ts_parser
Definition: pg_ts_parser.h:55
FormData_pg_conversion * Form_pg_conversion
Definition: pg_conversion.h:61
char * format_procedure_extended(Oid procedure_oid, bits16 flags)
Definition: regproc.c:350
bool OpclassIsVisible(Oid opcid)
Definition: namespace.c:1878
FormData_pg_policy * Form_pg_policy
Definition: pg_policy.h:51
ForeignServer * GetForeignServerExtended(Oid serverid, bits16 flags)
Definition: foreign.c:121
char * format_procedure(Oid procedure_oid)
Definition: regproc.c:323
#define FORMAT_PROC_INVALID_AS_NULL
Definition: regproc.h:19
bool ConversionIsVisible(Oid conid)
Definition: namespace.c:2176
FormData_pg_constraint * Form_pg_constraint
FormData_pg_event_trigger * Form_pg_event_trigger
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
char * GetUserNameFromId(Oid roleid, bool noerr)
Definition: miscinit.c:910
#define Assert(condition)
Definition: c.h:804
FormData_pg_trigger * Form_pg_trigger
Definition: pg_trigger.h:80
char * format_type_extended(Oid type_oid, int32 typemod, bits16 flags)
Definition: format_type.c:112
FormData_pg_collation * Form_pg_collation
Definition: pg_collation.h:56
FormData_pg_rewrite * Form_pg_rewrite
Definition: pg_rewrite.h:52
bool TSTemplateIsVisible(Oid tmplId)
Definition: namespace.c:2656
FormData_pg_am * Form_pg_am
Definition: pg_am.h:48
bool LargeObjectExists(Oid loid)
bool TSParserIsVisible(Oid prsId)
Definition: namespace.c:2403
ForeignDataWrapper * GetForeignDataWrapperExtended(Oid fdwid, bits16 flags)
Definition: foreign.c:47
FormData_pg_amop * Form_pg_amop
Definition: pg_amop.h:88
char * get_tablespace_name(Oid spc_oid)
Definition: tablespace.c:1473
char * servername
Definition: foreign.h:39
FormData_pg_ts_template * Form_pg_ts_template
#define elog(elevel,...)
Definition: elog.h:232
FormData_pg_publication_rel * Form_pg_publication_rel
#define NameStr(name)
Definition: c.h:681
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
char * get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
Definition: lsyscache.c:825
Relation table_open(Oid relationId, LOCKMODE lockmode)
Definition: table.c:39
FormData_pg_opclass * Form_pg_opclass
Definition: pg_opclass.h:83
#define _(x)
Definition: elog.c:89
#define BTEqualStrategyNumber
Definition: stratnum.h:31
FormData_pg_statistic_ext * Form_pg_statistic_ext

◆ getObjectDescriptionOids()

char* getObjectDescriptionOids ( Oid  classid,
Oid  objid 
)

Definition at line 3958 of file objectaddress.c.

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

Referenced by AlterObjectNamespace_internal(), and AlterObjectRename_internal().

3959 {
3960  ObjectAddress address;
3961 
3962  address.classId = classid;
3963  address.objectId = objid;
3964  address.objectSubId = 0;
3965 
3966  return getObjectDescription(&address, false);
3967 }
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)

◆ getObjectIdentity()

◆ getObjectIdentityParts()

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

Definition at line 4656 of file objectaddress.c.

References AccessShareLock, AMOID, appendStringInfo(), appendStringInfoString(), Assert, BTEqualStrategyNumber, CLAOID, ObjectAddress::classId, COLLOID, CONSTROID, CONVOID, StringInfoData::data, datname, elog, ERROR, EVENTTRIGGEROID, 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(), GetForeignDataWrapperExtended(), GetForeignServer(), GetForeignServerExtended(), getObjectClass(), getObjectIdentityParts(), getOpFamilyIdentity(), getRelationIdentity(), GETSTRUCT, GetUserNameFromId(), HeapTupleIsValid, initStringInfo(), LANGOID, lappend(), LargeObjectExists(), StringInfoData::len, list_make1, list_make2, list_make3, NameStr, NIL, ObjectAddress::objectId, ObjectIdGetDatum, ObjectAddress::objectSubId, OCLASS_AM, OCLASS_AMOP, OCLASS_AMPROC, OCLASS_CAST, OCLASS_CLASS, OCLASS_COLLATION, OCLASS_CONSTRAINT, OCLASS_CONVERSION, OCLASS_DATABASE, OCLASS_DEFACL, OCLASS_DEFAULT, OCLASS_EVENT_TRIGGER, OCLASS_EXTENSION, OCLASS_FDW, OCLASS_FOREIGN_SERVER, OCLASS_LANGUAGE, OCLASS_LARGEOBJECT, OCLASS_OPCLASS, OCLASS_OPERATOR, OCLASS_OPFAMILY, OCLASS_POLICY, OCLASS_PROC, OCLASS_PUBLICATION, OCLASS_PUBLICATION_REL, OCLASS_REWRITE, OCLASS_ROLE, OCLASS_SCHEMA, OCLASS_STATISTIC_EXT, OCLASS_SUBSCRIPTION, OCLASS_TBLSPACE, OCLASS_TRANSFORM, OCLASS_TRIGGER, OCLASS_TSCONFIG, OCLASS_TSDICT, OCLASS_TSPARSER, OCLASS_TSTEMPLATE, OCLASS_TYPE, OCLASS_USER_MAPPING, OidIsValid, pfree(), PointerIsValid, proname, psprintf(), pstrdup(), PUBLICATIONREL, quote_identifier(), quote_qualified_identifier(), ReleaseSysCache(), ScanKeyInit(), SearchSysCache1(), ForeignServer::servername, STATEXTOID, subname, systable_beginscan(), systable_endscan(), systable_getnext(), table_close(), table_open(), TSCONFIGOID, TSDICTOID, TSPARSEROID, TSTEMPLATEOID, USERMAPPINGOID, and username.

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

4659 {
4660  StringInfoData buffer;
4661 
4662  initStringInfo(&buffer);
4663 
4664  /*
4665  * Make sure that both objname and objargs were passed, or none was; and
4666  * initialize them to empty lists. For objname this is useless because it
4667  * will be initialized in all cases inside the switch; but we do it anyway
4668  * so that we can test below that no branch leaves it unset.
4669  */
4670  Assert(PointerIsValid(objname) == PointerIsValid(objargs));
4671  if (objname)
4672  {
4673  *objname = NIL;
4674  *objargs = NIL;
4675  }
4676 
4677  switch (getObjectClass(object))
4678  {
4679  case OCLASS_CLASS:
4680  {
4681  char *attr = NULL;
4682 
4683  /*
4684  * Check for the attribute first, so as if it is missing we
4685  * can skip the entire relation description.
4686  */
4687  if (object->objectSubId != 0)
4688  {
4689  attr = get_attname(object->objectId,
4690  object->objectSubId,
4691  missing_ok);
4692 
4693  if (missing_ok && attr == NULL)
4694  break;
4695  }
4696 
4697  getRelationIdentity(&buffer, object->objectId, objname,
4698  missing_ok);
4699  if (objname && *objname == NIL)
4700  break;
4701 
4702  if (attr)
4703  {
4704  appendStringInfo(&buffer, ".%s",
4705  quote_identifier(attr));
4706  if (objname)
4707  *objname = lappend(*objname, attr);
4708  }
4709  }
4710  break;
4711 
4712  case OCLASS_PROC:
4713  {
4715  char *proname = format_procedure_extended(object->objectId,
4716  flags);
4717 
4718  if (proname == NULL)
4719  break;
4720 
4721  appendStringInfoString(&buffer, proname);
4722  if (objname)
4723  format_procedure_parts(object->objectId, objname, objargs,
4724  missing_ok);
4725  break;
4726  }
4727 
4728  case OCLASS_TYPE:
4729  {
4731  char *typeout;
4732 
4733  typeout = format_type_extended(object->objectId, -1, flags);
4734 
4735  if (typeout == NULL)
4736  break;
4737 
4738  appendStringInfoString(&buffer, typeout);
4739  if (objname)
4740  *objname = list_make1(typeout);
4741  }
4742  break;
4743 
4744  case OCLASS_CAST:
4745  {
4746  Relation castRel;
4747  HeapTuple tup;
4748  Form_pg_cast castForm;
4749 
4750  castRel = table_open(CastRelationId, AccessShareLock);
4751 
4752  tup = get_catalog_object_by_oid(castRel, Anum_pg_cast_oid,
4753  object->objectId);
4754 
4755  if (!HeapTupleIsValid(tup))
4756  {
4757  if (!missing_ok)
4758  elog(ERROR, "could not find tuple for cast %u",
4759  object->objectId);
4760 
4761  table_close(castRel, AccessShareLock);
4762  break;
4763  }
4764 
4765  castForm = (Form_pg_cast) GETSTRUCT(tup);
4766 
4767  appendStringInfo(&buffer, "(%s AS %s)",
4768  format_type_be_qualified(castForm->castsource),
4769  format_type_be_qualified(castForm->casttarget));
4770 
4771  if (objname)
4772  {
4773  *objname = list_make1(format_type_be_qualified(castForm->castsource));
4774  *objargs = list_make1(format_type_be_qualified(castForm->casttarget));
4775  }
4776 
4777  table_close(castRel, AccessShareLock);
4778  break;
4779  }
4780 
4781  case OCLASS_COLLATION:
4782  {
4783  HeapTuple collTup;
4784  Form_pg_collation coll;
4785  char *schema;
4786 
4787  collTup = SearchSysCache1(COLLOID,
4788  ObjectIdGetDatum(object->objectId));
4789  if (!HeapTupleIsValid(collTup))
4790  {
4791  if (!missing_ok)
4792  elog(ERROR, "cache lookup failed for collation %u",
4793  object->objectId);
4794  break;
4795  }
4796  coll = (Form_pg_collation) GETSTRUCT(collTup);
4797  schema = get_namespace_name_or_temp(coll->collnamespace);
4798  appendStringInfoString(&buffer,
4800  NameStr(coll->collname)));
4801  if (objname)
4802  *objname = list_make2(schema,
4803  pstrdup(NameStr(coll->collname)));
4804  ReleaseSysCache(collTup);
4805  break;
4806  }
4807 
4808  case OCLASS_CONSTRAINT:
4809  {
4810  HeapTuple conTup;
4811  Form_pg_constraint con;
4812 
4813  conTup = SearchSysCache1(CONSTROID,
4814  ObjectIdGetDatum(object->objectId));
4815  if (!HeapTupleIsValid(conTup))
4816  {
4817  if (!missing_ok)
4818  elog(ERROR, "cache lookup failed for constraint %u",
4819  object->objectId);
4820  break;
4821  }
4822  con = (Form_pg_constraint) GETSTRUCT(conTup);
4823 
4824  if (OidIsValid(con->conrelid))
4825  {
4826  appendStringInfo(&buffer, "%s on ",
4827  quote_identifier(NameStr(con->conname)));
4828  getRelationIdentity(&buffer, con->conrelid, objname,
4829  false);
4830  if (objname)
4831  *objname = lappend(*objname, pstrdup(NameStr(con->conname)));
4832  }
4833  else
4834  {
4835  ObjectAddress domain;
4836 
4837  Assert(OidIsValid(con->contypid));
4838  domain.classId = TypeRelationId;
4839  domain.objectId = con->contypid;
4840  domain.objectSubId = 0;
4841 
4842  appendStringInfo(&buffer, "%s on %s",
4843  quote_identifier(NameStr(con->conname)),
4844  getObjectIdentityParts(&domain, objname,
4845  objargs, false));
4846 
4847  if (objname)
4848  *objargs = lappend(*objargs, pstrdup(NameStr(con->conname)));
4849  }
4850 
4851  ReleaseSysCache(conTup);
4852  break;
4853  }
4854 
4855  case OCLASS_CONVERSION:
4856  {
4857  HeapTuple conTup;
4858  Form_pg_conversion conForm;
4859  char *schema;
4860 
4861  conTup = SearchSysCache1(CONVOID,
4862  ObjectIdGetDatum(object->objectId));
4863  if (!HeapTupleIsValid(conTup))
4864  {
4865  if (!missing_ok)
4866  elog(ERROR, "cache lookup failed for conversion %u",
4867  object->objectId);
4868  break;
4869  }
4870  conForm = (Form_pg_conversion) GETSTRUCT(conTup);
4871  schema = get_namespace_name_or_temp(conForm->connamespace);
4872  appendStringInfoString(&buffer,
4874  NameStr(conForm->conname)));
4875  if (objname)
4876  *objname = list_make2(schema,
4877  pstrdup(NameStr(conForm->conname)));
4878  ReleaseSysCache(conTup);
4879  break;
4880  }
4881 
4882  case OCLASS_DEFAULT:
4883  {
4884  Relation attrdefDesc;
4885  ScanKeyData skey[1];
4886  SysScanDesc adscan;
4887 
4888  HeapTuple tup;
4889  Form_pg_attrdef attrdef;
4890  ObjectAddress colobject;
4891 
4892  attrdefDesc = table_open(AttrDefaultRelationId, AccessShareLock);
4893 
4894  ScanKeyInit(&skey[0],
4895  Anum_pg_attrdef_oid,
4896  BTEqualStrategyNumber, F_OIDEQ,
4897  ObjectIdGetDatum(object->objectId));
4898 
4899  adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndexId,
4900  true, NULL, 1, skey);
4901 
4902  tup = systable_getnext(adscan);
4903 
4904  if (!HeapTupleIsValid(tup))
4905  {
4906  if (!missing_ok)
4907  elog(ERROR, "could not find tuple for attrdef %u",
4908  object->objectId);
4909 
4910  systable_endscan(adscan);
4911  table_close(attrdefDesc, AccessShareLock);
4912  break;
4913  }
4914 
4915  attrdef = (Form_pg_attrdef) GETSTRUCT(tup);
4916 
4917  colobject.classId = RelationRelationId;
4918  colobject.objectId = attrdef->adrelid;
4919  colobject.objectSubId = attrdef->adnum;
4920 
4921  appendStringInfo(&buffer, "for %s",
4922  getObjectIdentityParts(&colobject,
4923  objname, objargs,
4924  false));
4925 
4926  systable_endscan(adscan);
4927  table_close(attrdefDesc, AccessShareLock);
4928  break;
4929  }
4930 
4931  case OCLASS_LANGUAGE:
4932  {
4933  HeapTuple langTup;
4934  Form_pg_language langForm;
4935 
4936  langTup = SearchSysCache1(LANGOID,
4937  ObjectIdGetDatum(object->objectId));
4938  if (!HeapTupleIsValid(langTup))
4939  {
4940  if (!missing_ok)
4941  elog(ERROR, "cache lookup failed for language %u",
4942  object->objectId);
4943  break;
4944  }
4945  langForm = (Form_pg_language) GETSTRUCT(langTup);
4946  appendStringInfoString(&buffer,
4947  quote_identifier(NameStr(langForm->lanname)));
4948  if (objname)
4949  *objname = list_make1(pstrdup(NameStr(langForm->lanname)));
4950  ReleaseSysCache(langTup);
4951  break;
4952  }
4953  case OCLASS_LARGEOBJECT:
4954  if (!LargeObjectExists(object->objectId))
4955  break;
4956  appendStringInfo(&buffer, "%u",
4957  object->objectId);
4958  if (objname)
4959  *objname = list_make1(psprintf("%u", object->objectId));
4960  break;
4961 
4962  case OCLASS_OPERATOR:
4963  {
4965  char *oprname = format_operator_extended(object->objectId,
4966  flags);
4967 
4968  if (oprname == NULL)
4969  break;
4970 
4971  appendStringInfoString(&buffer, oprname);
4972  if (objname)
4973  format_operator_parts(object->objectId, objname, objargs, missing_ok);
4974  break;
4975  }
4976 
4977  case OCLASS_OPCLASS:
4978  {
4979  HeapTuple opcTup;
4980  Form_pg_opclass opcForm;
4981  HeapTuple amTup;
4982  Form_pg_am amForm;
4983  char *schema;
4984 
4985  opcTup = SearchSysCache1(CLAOID,
4986  ObjectIdGetDatum(object->objectId));
4987  if (!HeapTupleIsValid(opcTup))
4988  {
4989  if (!missing_ok)
4990  elog(ERROR, "cache lookup failed for opclass %u",
4991  object->objectId);
4992  break;
4993  }
4994  opcForm = (Form_pg_opclass) GETSTRUCT(opcTup);
4995  schema = get_namespace_name_or_temp(opcForm->opcnamespace);
4996 
4997  amTup = SearchSysCache1(AMOID,
4998  ObjectIdGetDatum(opcForm->opcmethod));
4999  if (!HeapTupleIsValid(amTup))
5000  elog(ERROR, "cache lookup failed for access method %u",
5001  opcForm->opcmethod);
5002  amForm = (Form_pg_am) GETSTRUCT(amTup);
5003 
5004  appendStringInfo(&buffer, "%s USING %s",
5006  NameStr(opcForm->opcname)),
5007  quote_identifier(NameStr(amForm->amname)));
5008  if (objname)
5009  *objname = list_make3(pstrdup(NameStr(amForm->amname)),
5010  schema,
5011  pstrdup(NameStr(opcForm->opcname)));
5012 
5013  ReleaseSysCache(amTup);
5014  ReleaseSysCache(opcTup);
5015  break;
5016  }
5017 
5018  case OCLASS_OPFAMILY:
5019  getOpFamilyIdentity(&buffer, object->objectId, objname,
5020  missing_ok);
5021  break;
5022 
5023  case OCLASS_AM:
5024  {
5025  char *amname;
5026 
5027  amname = get_am_name(object->objectId);
5028  if (!amname)
5029  {
5030  if (!missing_ok)
5031  elog(ERROR, "cache lookup failed for access method %u",
5032  object->objectId);
5033  break;
5034  }
5035  appendStringInfoString(&buffer, quote_identifier(amname));
5036  if (objname)
5037  *objname = list_make1(amname);
5038  }
5039  break;
5040 
5041  case OCLASS_AMOP:
5042  {
5043  Relation amopDesc;
5044  HeapTuple tup;
5045  ScanKeyData skey[1];
5046  SysScanDesc amscan;
5047  Form_pg_amop amopForm;
5048  StringInfoData opfam;
5049  char *ltype;
5050  char *rtype;
5051 
5052  amopDesc = table_open(AccessMethodOperatorRelationId,
5053  AccessShareLock);
5054 
5055  ScanKeyInit(&skey[0],
5056  Anum_pg_amop_oid,
5057  BTEqualStrategyNumber, F_OIDEQ,
5058  ObjectIdGetDatum(object->objectId));
5059 
5060  amscan = systable_beginscan(amopDesc, AccessMethodOperatorOidIndexId, true,
5061  NULL, 1, skey);
5062 
5063  tup = systable_getnext(amscan);
5064 
5065  if (!HeapTupleIsValid(tup))
5066  {
5067  if (!missing_ok)
5068  elog(ERROR, "could not find tuple for amop entry %u",
5069  object->objectId);
5070 
5071  systable_endscan(amscan);
5072  table_close(amopDesc, AccessShareLock);
5073  break;
5074  }
5075 
5076  amopForm = (Form_pg_amop) GETSTRUCT(tup);
5077 
5078  initStringInfo(&opfam);
5079  getOpFamilyIdentity(&opfam, amopForm->amopfamily, objname,
5080  false);
5081 
5082  ltype = format_type_be_qualified(amopForm->amoplefttype);
5083  rtype = format_type_be_qualified(amopForm->amoprighttype);
5084 
5085  if (objname)
5086  {
5087  *objname = lappend(*objname,
5088  psprintf("%d", amopForm->amopstrategy));
5089  *objargs = list_make2(ltype, rtype);
5090  }
5091 
5092  appendStringInfo(&buffer, "operator %d (%s, %s) of %s",
5093  amopForm->amopstrategy,
5094  ltype, rtype, opfam.data);
5095 
5096  pfree(opfam.data);
5097 
5098  systable_endscan(amscan);
5099  table_close(amopDesc, AccessShareLock);
5100  break;
5101  }
5102 
5103  case OCLASS_AMPROC:
5104  {
5105  Relation amprocDesc;
5106  ScanKeyData skey[1];
5107  SysScanDesc amscan;
5108  HeapTuple tup;
5109  Form_pg_amproc amprocForm;
5110  StringInfoData opfam;
5111  char *ltype;
5112  char *rtype;
5113 
5114  amprocDesc = table_open(AccessMethodProcedureRelationId,
5115  AccessShareLock);
5116 
5117  ScanKeyInit(&skey[0],
5118  Anum_pg_amproc_oid,
5119  BTEqualStrategyNumber, F_OIDEQ,
5120  ObjectIdGetDatum(object->objectId));
5121 
5122  amscan = systable_beginscan(amprocDesc, AccessMethodProcedureOidIndexId, true,
5123  NULL, 1, skey);
5124 
5125  tup = systable_getnext(amscan);
5126 
5127  if (!HeapTupleIsValid(tup))
5128  {
5129  if (!missing_ok)
5130  elog(ERROR, "could not find tuple for amproc entry %u",
5131  object->objectId);
5132 
5133  systable_endscan(amscan);
5134  table_close(amprocDesc, AccessShareLock);
5135  break;
5136  }
5137 
5138  amprocForm = (Form_pg_amproc) GETSTRUCT(tup);
5139 
5140  initStringInfo(&opfam);
5141  getOpFamilyIdentity(&opfam, amprocForm->amprocfamily, objname,
5142  false);
5143 
5144  ltype = format_type_be_qualified(amprocForm->amproclefttype);
5145  rtype = format_type_be_qualified(amprocForm->amprocrighttype);
5146 
5147  if (objname)
5148  {
5149  *objname = lappend(*objname,
5150  psprintf("%d", amprocForm->amprocnum));
5151  *objargs = list_make2(ltype, rtype);
5152  }
5153 
5154  appendStringInfo(&buffer, "function %d (%s, %s) of %s",
5155  amprocForm->amprocnum,
5156  ltype, rtype, opfam.data);
5157 
5158  pfree(opfam.data);
5159 
5160  systable_endscan(amscan);
5161  table_close(amprocDesc, AccessShareLock);
5162  break;
5163  }
5164 
5165  case OCLASS_REWRITE:
5166  {
5167  Relation ruleDesc;
5168  HeapTuple tup;
5170 
5171  ruleDesc = table_open(RewriteRelationId, AccessShareLock);
5172 
5173  tup = get_catalog_object_by_oid(ruleDesc, Anum_pg_rewrite_oid,
5174  object->objectId);
5175 
5176  if (!HeapTupleIsValid(tup))
5177  {
5178  if (!missing_ok)
5179  elog(ERROR, "could not find tuple for rule %u",
5180  object->objectId);
5181 
5182  table_close(ruleDesc, AccessShareLock);
5183  break;
5184  }
5185 
5186  rule = (Form_pg_rewrite) GETSTRUCT(tup);
5187 
5188  appendStringInfo(&buffer, "%s on ",
5189  quote_identifier(NameStr(rule->rulename)));
5190  getRelationIdentity(&buffer, rule->ev_class, objname, false);
5191  if (objname)
5192  *objname = lappend(*objname, pstrdup(NameStr(rule->rulename)));
5193 
5194  table_close(ruleDesc, AccessShareLock);
5195  break;
5196  }
5197 
5198  case OCLASS_TRIGGER:
5199  {
5200  Relation trigDesc;
5201  HeapTuple tup;
5202  Form_pg_trigger trig;
5203 
5204  trigDesc = table_open(TriggerRelationId, AccessShareLock);
5205 
5206  tup = get_catalog_object_by_oid(trigDesc, Anum_pg_trigger_oid,
5207  object->objectId);
5208 
5209  if (!HeapTupleIsValid(tup))
5210  {
5211  if (!missing_ok)
5212  elog(ERROR, "could not find tuple for trigger %u",
5213  object->objectId);
5214 
5215  table_close(trigDesc, AccessShareLock);
5216  break;
5217  }
5218 
5219  trig = (Form_pg_trigger) GETSTRUCT(tup);
5220 
5221  appendStringInfo(&buffer, "%s on ",
5222  quote_identifier(NameStr(trig->tgname)));
5223  getRelationIdentity(&buffer, trig->tgrelid, objname, false);
5224  if (objname)
5225  *objname = lappend(*objname, pstrdup(NameStr(trig->tgname)));
5226 
5227  table_close(trigDesc, AccessShareLock);
5228  break;
5229  }
5230 
5231  case OCLASS_SCHEMA:
5232  {
5233  char *nspname;
5234 
5235  nspname = get_namespace_name_or_temp(object->objectId);
5236  if (!nspname)
5237  {
5238  if (!missing_ok)
5239  elog(ERROR, "cache lookup failed for namespace %u",
5240  object->objectId);
5241  break;
5242  }
5243  appendStringInfoString(&buffer,
5244  quote_identifier(nspname));
5245  if (objname)
5246  *objname = list_make1(nspname);
5247  break;
5248  }
5249 
5250  case OCLASS_STATISTIC_EXT:
5251  {
5252  HeapTuple tup;
5253  Form_pg_statistic_ext formStatistic;
5254  char *schema;
5255 
5257  ObjectIdGetDatum(object->objectId));
5258  if (!HeapTupleIsValid(tup))
5259  {
5260  if (!missing_ok)
5261  elog(ERROR, "cache lookup failed for statistics object %u",
5262  object->objectId);
5263  break;
5264  }
5265  formStatistic = (Form_pg_statistic_ext) GETSTRUCT(tup);
5266  schema = get_namespace_name_or_temp(formStatistic->stxnamespace);
5267  appendStringInfoString(&buffer,
5269  NameStr(formStatistic->stxname)));
5270  if (objname)
5271  *objname = list_make2(schema,
5272  pstrdup(NameStr(formStatistic->stxname)));
5273  ReleaseSysCache(tup);
5274  }
5275  break;
5276 
5277  case OCLASS_TSPARSER:
5278  {
5279  HeapTuple tup;
5280  Form_pg_ts_parser formParser;
5281  char *schema;
5282 
5284  ObjectIdGetDatum(object->objectId));
5285  if (!HeapTupleIsValid(tup))
5286  {
5287  if (!missing_ok)
5288  elog(ERROR, "cache lookup failed for text search parser %u",
5289  object->objectId);
5290  break;
5291  }
5292  formParser = (Form_pg_ts_parser) GETSTRUCT(tup);
5293  schema = get_namespace_name_or_temp(formParser->prsnamespace);
5294  appendStringInfoString(&buffer,
5296  NameStr(formParser->prsname)));
5297  if (objname)
5298  *objname = list_make2(schema,
5299  pstrdup(NameStr(formParser->prsname)));
5300  ReleaseSysCache(tup);
5301  break;
5302  }
5303 
5304  case OCLASS_TSDICT:
5305  {
5306  HeapTuple tup;
5307  Form_pg_ts_dict formDict;
5308  char *schema;
5309 
5310  tup = SearchSysCache1(TSDICTOID,
5311  ObjectIdGetDatum(object->objectId));
5312  if (!HeapTupleIsValid(tup))
5313  {
5314  if (!missing_ok)
5315  elog(ERROR, "cache lookup failed for text search dictionary %u",
5316  object->objectId);
5317  break;
5318  }
5319  formDict = (Form_pg_ts_dict) GETSTRUCT(tup);
5320  schema = get_namespace_name_or_temp(formDict->dictnamespace);
5321  appendStringInfoString(&buffer,
5323  NameStr(formDict->dictname)));
5324  if (objname)
5325  *objname = list_make2(schema,
5326  pstrdup(NameStr(formDict->dictname)));
5327  ReleaseSysCache(tup);
5328  break;
5329  }
5330 
5331  case OCLASS_TSTEMPLATE:
5332  {
5333  HeapTuple tup;
5334  Form_pg_ts_template formTmpl;
5335  char *schema;
5336 
5338  ObjectIdGetDatum(object->objectId));
5339  if (!HeapTupleIsValid(tup))
5340  {
5341  if (!missing_ok)
5342  elog(ERROR, "cache lookup failed for text search template %u",
5343  object->objectId);
5344  break;
5345  }
5346  formTmpl = (Form_pg_ts_template) GETSTRUCT(tup);
5347  schema = get_namespace_name_or_temp(formTmpl->tmplnamespace);
5348  appendStringInfoString(&buffer,
5350  NameStr(formTmpl->tmplname)));
5351  if (objname)
5352  *objname = list_make2(schema,
5353  pstrdup(NameStr(formTmpl->tmplname)));
5354  ReleaseSysCache(tup);
5355  break;
5356  }
5357 
5358  case OCLASS_TSCONFIG:
5359  {
5360  HeapTuple tup;
5361  Form_pg_ts_config formCfg;
5362  char *schema;
5363 
5365  ObjectIdGetDatum(object->objectId));
5366  if (!HeapTupleIsValid(tup))
5367  {
5368  if (!missing_ok)
5369  elog(ERROR, "cache lookup failed for text search configuration %u",
5370  object->objectId);
5371  break;
5372  }
5373  formCfg = (Form_pg_ts_config) GETSTRUCT(tup);
5374  schema = get_namespace_name_or_temp(formCfg->cfgnamespace);
5375  appendStringInfoString(&buffer,
5377  NameStr(formCfg->cfgname)));
5378  if (objname)
5379  *objname = list_make2(schema,
5380  pstrdup(NameStr(formCfg->cfgname)));
5381  ReleaseSysCache(tup);
5382  break;
5383  }
5384 
5385  case OCLASS_ROLE:
5386  {
5387  char *username;
5388 
5389  username = GetUserNameFromId(object->objectId, missing_ok);
5390  if (!username)
5391  break;
5392  if (objname)
5393  *objname = list_make1(username);
5394  appendStringInfoString(&buffer,
5395  quote_identifier(username));
5396  break;
5397  }
5398 
5399  case OCLASS_DATABASE:
5400  {
5401  char *datname;
5402 
5403  datname = get_database_name(object->objectId);
5404  if (!datname)
5405  {
5406  if (!missing_ok)
5407  elog(ERROR, "cache lookup failed for database %u",
5408  object->objectId);
5409  break;
5410  }
5411  if (objname)
5412  *objname = list_make1(datname);
5413  appendStringInfoString(&buffer,
5414  quote_identifier(datname));
5415  break;
5416  }
5417 
5418  case OCLASS_TBLSPACE:
5419  {
5420  char *tblspace;
5421 
5422  tblspace = get_tablespace_name(object->objectId);
5423  if (!tblspace)
5424  {
5425  if (!missing_ok)
5426  elog(ERROR, "cache lookup failed for tablespace %u",
5427  object->objectId);
5428  break;
5429  }
5430  if (objname)
5431  *objname = list_make1(tblspace);
5432  appendStringInfoString(&buffer,
5433  quote_identifier(tblspace));
5434  break;
5435  }
5436 
5437  case OCLASS_FDW:
5438  {
5439  ForeignDataWrapper *fdw;
5440 
5441  fdw = GetForeignDataWrapperExtended(object->objectId,
5442  missing_ok);
5443  if (fdw)
5444  {
5446  if (objname)
5447  *objname = list_make1(pstrdup(fdw->fdwname));
5448  }
5449  break;
5450  }
5451 
5452  case OCLASS_FOREIGN_SERVER:
5453  {
5454  ForeignServer *srv;
5455 
5456  srv = GetForeignServerExtended(object->objectId,
5457  missing_ok);
5458  if (srv)
5459  {
5460  appendStringInfoString(&buffer,
5462  if (objname)
5463  *objname = list_make1(pstrdup(srv->servername));
5464  }
5465  break;
5466  }
5467 
5468  case OCLASS_USER_MAPPING:
5469  {
5470  HeapTuple tup;
5471  Oid useid;
5472  Form_pg_user_mapping umform;
5473  ForeignServer *srv;
5474  const char *usename;
5475 
5477  ObjectIdGetDatum(object->objectId));
5478  if (!HeapTupleIsValid(tup))
5479  {
5480  if (!missing_ok)
5481  elog(ERROR, "cache lookup failed for user mapping %u",
5482  object->objectId);
5483  break;
5484  }
5485  umform = (Form_pg_user_mapping) GETSTRUCT(tup);
5486  useid = umform->umuser;
5487  srv = GetForeignServer(umform->umserver);
5488 
5489  ReleaseSysCache(tup);
5490 
5491  if (OidIsValid(useid))
5492  usename = GetUserNameFromId(useid, false);
5493  else
5494  usename = "public";
5495 
5496  if (objname)
5497  {
5498  *objname = list_make1(pstrdup(usename));
5499  *objargs = list_make1(pstrdup(srv->servername));
5500  }
5501 
5502  appendStringInfo(&buffer, "%s on server %s",
5503  quote_identifier(usename),
5504  srv->servername);
5505  break;
5506  }
5507 
5508  case OCLASS_DEFACL:
5509  {
5510  Relation defaclrel;
5511  ScanKeyData skey[1];
5512  SysScanDesc rcscan;
5513  HeapTuple tup;
5514  Form_pg_default_acl defacl;
5515  char *schema;
5516  char *username;
5517 
5518  defaclrel = table_open(DefaultAclRelationId, AccessShareLock);
5519 
5520  ScanKeyInit(&skey[0],
5521  Anum_pg_default_acl_oid,
5522  BTEqualStrategyNumber, F_OIDEQ,
5523  ObjectIdGetDatum(object->objectId));
5524 
5525  rcscan = systable_beginscan(defaclrel, DefaultAclOidIndexId,
5526  true, NULL, 1, skey);
5527 
5528  tup = systable_getnext(rcscan);
5529 
5530  if (!HeapTupleIsValid(tup))
5531  {
5532  if (!missing_ok)
5533  elog(ERROR, "could not find tuple for default ACL %u",
5534  object->objectId);
5535 
5536  systable_endscan(rcscan);
5537  table_close(defaclrel, AccessShareLock);
5538  break;
5539 
5540  }
5541 
5542  defacl = (Form_pg_default_acl) GETSTRUCT(tup);
5543 
5544  username = GetUserNameFromId(defacl->defaclrole, false);
5545  appendStringInfo(&buffer,
5546  "for role %s",
5547  quote_identifier(username));
5548 
5549  if (OidIsValid(defacl->defaclnamespace))
5550  {
5551  schema = get_namespace_name_or_temp(defacl->defaclnamespace);
5552  appendStringInfo(&buffer,
5553  " in schema %s",
5554  quote_identifier(schema));
5555  }
5556  else
5557  schema = NULL;
5558 
5559  switch (defacl->defaclobjtype)
5560  {
5561  case DEFACLOBJ_RELATION:
5562  appendStringInfoString(&buffer,
5563  " on tables");
5564  break;
5565  case DEFACLOBJ_SEQUENCE:
5566  appendStringInfoString(&buffer,
5567  " on sequences");
5568  break;
5569  case DEFACLOBJ_FUNCTION:
5570  appendStringInfoString(&buffer,
5571  " on functions");
5572  break;
5573  case DEFACLOBJ_TYPE:
5574  appendStringInfoString(&buffer,
5575  " on types");
5576  break;
5577  case DEFACLOBJ_NAMESPACE:
5578  appendStringInfoString(&buffer,
5579  " on schemas");
5580  break;
5581  }
5582 
5583  if (objname)
5584  {
5585  *objname = list_make1(username);
5586  if (schema)
5587  *objname = lappend(*objname, schema);
5588  *objargs = list_make1(psprintf("%c", defacl->defaclobjtype));
5589  }
5590 
5591  systable_endscan(rcscan);
5592  table_close(defaclrel, AccessShareLock);
5593  break;
5594  }
5595 
5596  case OCLASS_EXTENSION:
5597  {
5598  char *extname;
5599 
5600  extname = get_extension_name(object->objectId);
5601  if (!extname)
5602  {
5603  if (!missing_ok)
5604  elog(ERROR, "cache lookup failed for extension %u",
5605  object->objectId);
5606  break;
5607  }
5608  appendStringInfoString(&buffer, quote_identifier(extname));
5609  if (objname)
5610  *objname = list_make1(extname);
5611  break;
5612  }
5613 
5614  case OCLASS_EVENT_TRIGGER:
5615  {
5616  HeapTuple tup;
5617  Form_pg_event_trigger trigForm;
5618  char *evtname;
5619 
5621  ObjectIdGetDatum(object->objectId));
5622  if (!HeapTupleIsValid(tup))
5623  {
5624  if (!missing_ok)
5625  elog(ERROR, "cache lookup failed for event trigger %u",
5626  object->objectId);
5627  break;
5628  }
5629  trigForm = (Form_pg_event_trigger) GETSTRUCT(tup);
5630  evtname = pstrdup(NameStr(trigForm->evtname));
5631  appendStringInfoString(&buffer, quote_identifier(evtname));
5632  if (objname)
5633  *objname = list_make1(evtname);
5634  ReleaseSysCache(tup);
5635  break;
5636  }
5637 
5638  case OCLASS_POLICY:
5639  {
5640  Relation polDesc;
5641  HeapTuple tup;
5642  Form_pg_policy policy;
5643 
5644  polDesc = table_open(PolicyRelationId, AccessShareLock);
5645 
5646  tup = get_catalog_object_by_oid(polDesc, Anum_pg_policy_oid,
5647  object->objectId);
5648 
5649  if (!HeapTupleIsValid(tup))
5650  {
5651  if (!missing_ok)
5652  elog(ERROR, "could not find tuple for policy %u",
5653  object->objectId);
5654 
5655  table_close(polDesc, AccessShareLock);
5656  break;
5657  }
5658 
5659  policy = (Form_pg_policy) GETSTRUCT(tup);
5660 
5661  appendStringInfo(&buffer, "%s on ",
5662  quote_identifier(NameStr(policy->polname)));
5663  getRelationIdentity(&buffer, policy->polrelid, objname, false);
5664  if (objname)
5665  *objname = lappend(*objname, pstrdup(NameStr(policy->polname)));
5666 
5667  table_close(polDesc, AccessShareLock);
5668  break;
5669  }
5670 
5671  case OCLASS_PUBLICATION:
5672  {
5673  char *pubname;
5674 
5675  pubname = get_publication_name(object->objectId, missing_ok);
5676  if (pubname)
5677  {
5678  appendStringInfoString(&buffer,
5679  quote_identifier(pubname));
5680  if (objname)
5681  *objname = list_make1(pubname);
5682  }
5683  break;
5684  }
5685 
5687  {
5688  HeapTuple tup;
5689  char *pubname;
5690  Form_pg_publication_rel prform;
5691 
5693  ObjectIdGetDatum(object->objectId));
5694  if (!HeapTupleIsValid(tup))
5695  {
5696  if (!missing_ok)
5697  elog(ERROR, "cache lookup failed for publication table %u",
5698  object->objectId);
5699  break;
5700  }
5701 
5702  prform = (Form_pg_publication_rel) GETSTRUCT(tup);
5703  pubname = get_publication_name(prform->prpubid, false);
5704 
5705  getRelationIdentity(&buffer, prform->prrelid, objname, false);
5706  appendStringInfo(&buffer, " in publication %s", pubname);
5707 
5708  if (objargs)
5709  *objargs = list_make1(pubname);
5710 
5711  ReleaseSysCache(tup);
5712  break;
5713  }
5714 
5715  case OCLASS_SUBSCRIPTION:
5716  {
5717  char *subname;
5718 
5719  subname = get_subscription_name(object->objectId, missing_ok);
5720  if (subname)
5721  {
5722  appendStringInfoString(&buffer,
5723  quote_identifier(subname));
5724  if (objname)
5725  *objname = list_make1(subname);
5726  }
5727  break;
5728  }
5729 
5730  case OCLASS_TRANSFORM:
5731  {
5732  Relation transformDesc;
5733  HeapTuple tup;
5734  Form_pg_transform transform;
5735  char *transformLang;
5736  char *transformType;
5737 
5738  transformDesc = table_open(TransformRelationId, AccessShareLock);
5739 
5740  tup = get_catalog_object_by_oid(transformDesc,
5741  Anum_pg_transform_oid,
5742  object->objectId);
5743 
5744  if (!HeapTupleIsValid(tup))
5745  {
5746  if (!missing_ok)
5747  elog(ERROR, "could not find tuple for transform %u",
5748  object->objectId);
5749 
5750  table_close(transformDesc, AccessShareLock);
5751  break;
5752  }
5753 
5754  transform = (Form_pg_transform) GETSTRUCT(tup);
5755 
5756  transformType = format_type_be_qualified(transform->trftype);
5757  transformLang = get_language_name(transform->trflang, false);
5758 
5759  appendStringInfo(&buffer, "for %s on language %s",
5760  transformType,
5761  transformLang);
5762  if (objname)
5763  {
5764  *objname = list_make1(transformType);
5765  *objargs = list_make1(pstrdup(transformLang));
5766  }
5767 
5768  table_close(transformDesc, AccessShareLock);
5769  }
5770  break;
5771 
5772  /*
5773  * There's intentionally no default: case here; we want the
5774  * compiler to warn if a new OCLASS hasn't been handled above.
5775  */
5776  }
5777 
5778  if (!missing_ok)
5779  {
5780  /*
5781  * If a get_object_address() representation was requested, make sure
5782  * we are providing one. We don't check objargs, because many of the
5783  * cases above leave it as NIL.
5784  */
5785  if (objname && *objname == NIL)
5786  elog(ERROR, "requested object address for unsupported object class %d: text result \"%s\"",
5787  (int) getObjectClass(object), buffer.data);
5788  }
5789  else
5790  {
5791  /* an empty buffer is equivalent to no object found */
5792  if (buffer.len == 0)
5793  {
5794  Assert((objname == NULL || *objname == NIL) &&
5795  (objargs == NULL || *objargs == NIL));
5796  return NULL;
5797  }
5798  }
5799 
5800  return buffer.data;
5801 }
#define list_make2(x1, x2)
Definition: pg_list.h:208
#define list_make3(x1, x2, x3)
Definition: pg_list.h:210
#define NIL
Definition: pg_list.h:65
char * getObjectIdentityParts(const ObjectAddress *object, List **objname, List **objargs, bool missing_ok)
void table_close(Relation relation, LOCKMODE lockmode)
Definition: table.c:167
NameData proname
Definition: pg_proc.h:35
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:595
#define GETSTRUCT(TUP)
Definition: htup_details.h:654
Definition: syscache.h:36
const char * quote_identifier(const char *ident)
Definition: ruleutils.c:11374
char * get_language_name(Oid langoid, bool missing_ok)
Definition: lsyscache.c:1154
FormData_pg_ts_config * Form_pg_ts_config
Definition: pg_ts_config.h:48
uint16 bits16
Definition: c.h:449
char * fdwname
Definition: foreign.h:28
static void getOpFamilyIdentity(StringInfo buffer, Oid opfid, List **object, bool missing_ok)
FormData_pg_amproc * Form_pg_amproc
Definition: pg_amproc.h:68
char * pstrdup(const char *in)
Definition: mcxt.c:1299
char * psprintf(const char *fmt,...)
Definition: psprintf.c:46
char * get_extension_name(Oid ext_oid)
Definition: extension.c:185
#define AccessShareLock
Definition: lockdefs.h:36
NameData datname
Definition: pg_database.h:35
unsigned int Oid
Definition: postgres_ext.h:31
NameData subname
ObjectClass getObjectClass(const ObjectAddress *object)
Definition: dependency.c:2740
#define OidIsValid(objectId)
Definition: c.h:710
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition: genam.c:383
char * get_publication_name(Oid pubid, bool missing_ok)
char * format_operator_extended(Oid operator_oid, bits16 flags)
Definition: regproc.c:781
Definition: localtime.c:72
char * get_subscription_name(Oid subid, bool missing_ok)
#define list_make1(x1)
Definition: pg_list.h:206
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:502
void pfree(void *pointer)
Definition: mcxt.c:1169
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:91
FormData_pg_transform * Form_pg_transform
Definition: pg_transform.h:43
#define ObjectIdGetDatum(X)
Definition: postgres.h:551
#define ERROR
Definition: elog.h:46
char * get_database_name(Oid dbid)
Definition: dbcommands.c:2113
FormData_pg_user_mapping * Form_pg_user_mapping
FormData_pg_ts_dict * Form_pg_ts_dict
Definition: pg_ts_dict.h:52
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:176
FormData_pg_default_acl * Form_pg_default_acl
char * get_am_name(Oid amOid)
Definition: amcmds.c:192
#define FORMAT_TYPE_FORCE_QUALIFY
Definition: builtins.h:114
FormData_pg_cast * Form_pg_cast
Definition: pg_cast.h:57
const char * username
Definition: pgbench.c:282
List * lappend(List *list, void *datum)
Definition: list.c:336
static void getRelationIdentity(StringInfo buffer, Oid relid, List **object, bool missing_ok)
void initStringInfo(StringInfo str)
Definition: stringinfo.c:59
FormData_pg_attrdef * Form_pg_attrdef
Definition: pg_attrdef.h:48
char * quote_qualified_identifier(const char *qualifier, const char *ident)
Definition: ruleutils.c:11458
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1127
#define FORMAT_TYPE_INVALID_AS_NULL
Definition: builtins.h:115
#define FORMAT_OPERATOR_INVALID_AS_NULL
Definition: regproc.h:24
ForeignServer * GetForeignServer(Oid serverid)
Definition: foreign.c:109
HeapTuple get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId)
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1175
FormData_pg_ts_parser * Form_pg_ts_parser
Definition: pg_ts_parser.h:55
FormData_pg_conversion * Form_pg_conversion
Definition: pg_conversion.h:61
char * format_procedure_extended(Oid procedure_oid, bits16 flags)
Definition: regproc.c:350
void format_procedure_parts(Oid procedure_oid, List **objnames, List **objargs, bool missing_ok)
Definition: regproc.c:422
FormData_pg_policy * Form_pg_policy
Definition: pg_policy.h:51
ForeignServer * GetForeignServerExtended(Oid serverid, bits16 flags)
Definition: foreign.c:121
#define FORMAT_PROC_INVALID_AS_NULL
Definition: regproc.h:19
FormData_pg_constraint * Form_pg_constraint
FormData_pg_event_trigger * Form_pg_event_trigger
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
char * GetUserNameFromId(Oid roleid, bool noerr)
Definition: miscinit.c:910
#define Assert(condition)
Definition: c.h:804
char * format_type_be_qualified(Oid type_oid)
Definition: format_type.c:349
FormData_pg_trigger * Form_pg_trigger
Definition: pg_trigger.h:80
char * format_type_extended(Oid type_oid, int32 typemod, bits16 flags)
Definition: format_type.c:112
FormData_pg_collation * Form_pg_collation
Definition: pg_collation.h:56
FormData_pg_rewrite * Form_pg_rewrite
Definition: pg_rewrite.h:52
#define FORMAT_PROC_FORCE_QUALIFY
Definition: regproc.h:20
FormData_pg_am * Form_pg_am
Definition: pg_am.h:48
bool LargeObjectExists(Oid loid)
void format_operator_parts(Oid operator_oid, List **objnames, List **objargs, bool missing_ok)
Definition: regproc.c:865
FormData_pg_language * Form_pg_language
Definition: pg_language.h:65
ForeignDataWrapper * GetForeignDataWrapperExtended(Oid fdwid, bits16 flags)
Definition: foreign.c:47
char * get_namespace_name_or_temp(Oid nspid)
Definition: lsyscache.c:3340
FormData_pg_amop * Form_pg_amop
Definition: pg_amop.h:88
char * get_tablespace_name(Oid spc_oid)
Definition: tablespace.c:1473
char * servername
Definition: foreign.h:39
FormData_pg_ts_template * Form_pg_ts_template
#define elog(elevel,...)
Definition: elog.h:232
FormData_pg_publication_rel * Form_pg_publication_rel
#define NameStr(name)
Definition: c.h:681
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
char * get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
Definition: lsyscache.c:825
Relation table_open(Oid relationId, LOCKMODE lockmode)
Definition: table.c:39
FormData_pg_opclass * Form_pg_opclass
Definition: pg_opclass.h:83
#define PointerIsValid(pointer)
Definition: c.h:698
#define BTEqualStrategyNumber
Definition: stratnum.h:31
#define FORMAT_OPERATOR_FORCE_QUALIFY
Definition: regproc.h:25
FormData_pg_statistic_ext * Form_pg_statistic_ext

◆ getObjectTypeDescription()

char* getObjectTypeDescription ( const ObjectAddress object,
bool  missing_ok 
)

Definition at line 4324 of file objectaddress.c.

References appendStringInfoString(), Assert, StringInfoData::data, getConstraintTypeDescription(), getObjectClass(), getProcedureTypeDescription(), getRelationTypeDescription(), initStringInfo(), StringInfoData::len, ObjectAddress::objectId, ObjectAddress::objectSubId, OCLASS_AM, OCLASS_AMOP, OCLASS_AMPROC, OCLASS_CAST, OCLASS_CLASS, OCLASS_COLLATION, OCLASS_CONSTRAINT, OCLASS_CONVERSION, OCLASS_DATABASE, OCLASS_DEFACL, OCLASS_DEFAULT, OCLASS_EVENT_TRIGGER, OCLASS_EXTENSION, OCLASS_FDW, OCLASS_FOREIGN_SERVER, OCLASS_LANGUAGE, OCLASS_LARGEOBJECT, OCLASS_OPCLASS, OCLASS_OPERATOR, OCLASS_OPFAMILY, OCLASS_POLICY, OCLASS_PROC, OCLASS_PUBLICATION, OCLASS_PUBLICATION_REL, OCLASS_REWRITE, OCLASS_ROLE, OCLASS_SCHEMA, OCLASS_STATISTIC_EXT, OCLASS_SUBSCRIPTION, OCLASS_TBLSPACE, OCLASS_TRANSFORM, OCLASS_TRIGGER, OCLASS_TSCONFIG, OCLASS_TSDICT, OCLASS_TSPARSER, OCLASS_TSTEMPLATE, OCLASS_TYPE, and OCLASS_USER_MAPPING.

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

4325 {
4326  StringInfoData buffer;
4327 
4328  initStringInfo(&buffer);
4329 
4330  switch (getObjectClass(object))
4331  {
4332  case OCLASS_CLASS:
4333  getRelationTypeDescription(&buffer, object->objectId,
4334  object->objectSubId,
4335  missing_ok);
4336  break;
4337 
4338  case OCLASS_PROC:
4339  getProcedureTypeDescription(&buffer, object->objectId,
4340  missing_ok);
4341  break;
4342 
4343  case OCLASS_TYPE:
4344  appendStringInfoString(&buffer, "type");
4345  break;
4346 
4347  case OCLASS_CAST:
4348  appendStringInfoString(&buffer, "cast");
4349  break;
4350 
4351  case OCLASS_COLLATION:
4352  appendStringInfoString(&buffer, "collation");
4353  break;
4354 
4355  case OCLASS_CONSTRAINT:
4356  getConstraintTypeDescription(&buffer, object->objectId,
4357  missing_ok);
4358  break;
4359 
4360  case OCLASS_CONVERSION:
4361  appendStringInfoString(&buffer, "conversion");
4362  break;
4363 
4364  case OCLASS_DEFAULT:
4365  appendStringInfoString(&buffer, "default value");
4366  break;
4367 
4368  case OCLASS_LANGUAGE:
4369  appendStringInfoString(&buffer, "language");
4370  break;
4371 
4372  case OCLASS_LARGEOBJECT:
4373  appendStringInfoString(&buffer, "large object");
4374  break;
4375 
4376  case OCLASS_OPERATOR:
4377  appendStringInfoString(&buffer, "operator");
4378  break;
4379 
4380  case OCLASS_OPCLASS:
4381  appendStringInfoString(&buffer, "operator class");
4382  break;
4383 
4384  case OCLASS_OPFAMILY:
4385  appendStringInfoString(&buffer, "operator family");
4386  break;
4387 
4388  case OCLASS_AM:
4389  appendStringInfoString(&buffer, "access method");
4390  break;
4391 
4392  case OCLASS_AMOP:
4393  appendStringInfoString(&buffer, "operator of access method");
4394  break;
4395 
4396  case OCLASS_AMPROC:
4397  appendStringInfoString(&buffer, "function of access method");
4398  break;
4399 
4400  case OCLASS_REWRITE:
4401  appendStringInfoString(&buffer, "rule");
4402  break;
4403 
4404  case OCLASS_TRIGGER:
4405  appendStringInfoString(&buffer, "trigger");
4406  break;
4407 
4408  case OCLASS_SCHEMA:
4409  appendStringInfoString(&buffer, "schema");
4410  break;
4411 
4412  case OCLASS_STATISTIC_EXT:
4413  appendStringInfoString(&buffer, "statistics object");
4414  break;
4415 
4416  case OCLASS_TSPARSER:
4417  appendStringInfoString(&buffer, "text search parser");
4418  break;
4419 
4420  case OCLASS_TSDICT:
4421  appendStringInfoString(&buffer, "text search dictionary");
4422  break;
4423 
4424  case OCLASS_TSTEMPLATE:
4425  appendStringInfoString(&buffer, "text search template");
4426  break;
4427 
4428  case OCLASS_TSCONFIG:
4429  appendStringInfoString(&buffer, "text search configuration");
4430  break;
4431 
4432  case OCLASS_ROLE:
4433  appendStringInfoString(&buffer, "role");
4434  break;
4435 
4436  case OCLASS_DATABASE:
4437  appendStringInfoString(&buffer, "database");
4438  break;
4439 
4440  case OCLASS_TBLSPACE:
4441  appendStringInfoString(&buffer, "tablespace");
4442  break;
4443 
4444  case OCLASS_FDW:
4445  appendStringInfoString(&buffer, "foreign-data wrapper");
4446  break;
4447 
4448  case OCLASS_FOREIGN_SERVER:
4449  appendStringInfoString(&buffer, "server");
4450  break;
4451 
4452  case OCLASS_USER_MAPPING:
4453  appendStringInfoString(&buffer, "user mapping");
4454  break;
4455 
4456  case OCLASS_DEFACL:
4457  appendStringInfoString(&buffer, "default acl");
4458  break;
4459 
4460  case OCLASS_EXTENSION:
4461  appendStringInfoString(&buffer, "extension");
4462  break;
4463 
4464  case OCLASS_EVENT_TRIGGER:
4465  appendStringInfoString(&buffer, "event trigger");
4466  break;
4467 
4468  case OCLASS_POLICY:
4469  appendStringInfoString(&buffer, "policy");
4470  break;
4471 
4472  case OCLASS_PUBLICATION:
4473  appendStringInfoString(&buffer, "publication");
4474  break;
4475 
4477  appendStringInfoString(&buffer, "publication relation");
4478  break;
4479 
4480  case OCLASS_SUBSCRIPTION:
4481  appendStringInfoString(&buffer, "subscription");
4482  break;
4483 
4484  case OCLASS_TRANSFORM:
4485  appendStringInfoString(&buffer, "transform");
4486  break;
4487 
4488  /*
4489  * There's intentionally no default: case here; we want the
4490  * compiler to warn if a new OCLASS hasn't been handled above.
4491  */
4492  }
4493 
4494  /* the result can never be empty */
4495  Assert(buffer.len > 0);
4496 
4497  return buffer.data;
4498 }
ObjectClass getObjectClass(const ObjectAddress *object)
Definition: dependency.c:2740
static void getRelationTypeDescription(StringInfo buffer, Oid relid, int32 objectSubId, bool missing_ok)
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:176
static void getConstraintTypeDescription(StringInfo buffer, Oid constroid, bool missing_ok)
void initStringInfo(StringInfo str)
Definition: stringinfo.c:59
#define Assert(condition)
Definition: c.h:804
static void getProcedureTypeDescription(StringInfo buffer, Oid procid, bool missing_ok)

◆ is_objectclass_supported()

bool is_objectclass_supported ( Oid  class_id)

Definition at line 2758 of file objectaddress.c.

References lengthof.

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

2759 {
2760  int index;
2761 
2762  for (index = 0; index < lengthof(ObjectProperty); index++)
2763  {
2764  if (ObjectProperty[index].class_oid == class_id)
2765  return true;
2766  }
2767 
2768  return false;
2769 }
#define lengthof(array)
Definition: c.h:734
Definition: type.h:89
static const ObjectPropertyType ObjectProperty[]

◆ read_objtype_from_string()

int read_objtype_from_string ( const char *  objtype)

Definition at line 2629 of file objectaddress.c.

References ereport, errcode(), errmsg(), ERROR, i, lengthof, ObjectTypeMap, object_type_map::tm_name, and object_type_map::tm_type.

Referenced by pg_get_object_address().

2630 {
2631  int i;
2632 
2633  for (i = 0; i < lengthof(ObjectTypeMap); i++)
2634  {
2635  if (strcmp(ObjectTypeMap[i].tm_name, objtype) == 0)
2636  return ObjectTypeMap[i].tm_type;
2637  }
2638  ereport(ERROR,
2639  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2640  errmsg("unrecognized object type \"%s\"", objtype)));
2641 
2642  return -1; /* keep compiler quiet */
2643 }
int errcode(int sqlerrcode)
Definition: elog.c:698
#define lengthof(array)
Definition: c.h:734
#define ERROR
Definition: elog.h:46
static const struct object_type_map ObjectTypeMap[]
#define ereport(elevel,...)
Definition: elog.h:157
int errmsg(const char *fmt,...)
Definition: elog.c:909
int i

◆ strlist_to_textarray()

struct ArrayType* strlist_to_textarray ( List list)

Definition at line 5882 of file objectaddress.c.

References ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate, construct_md_array(), CStringGetTextDatum, CurrentMemoryContext, lfirst, list_length(), MemoryContextDelete(), MemoryContextSwitchTo(), name, and palloc().

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

5883 {
5884  ArrayType *arr;
5885  Datum *datums;
5886  bool *nulls;
5887  int j = 0;
5888  ListCell *cell;
5889  MemoryContext memcxt;
5890  MemoryContext oldcxt;
5891  int lb[1];
5892 
5893  /* Work in a temp context; easier than individually pfree'ing the Datums */
5895  "strlist to array",
5897  oldcxt = MemoryContextSwitchTo(memcxt);
5898 
5899  datums = (Datum *) palloc(sizeof(Datum) * list_length(list));
5900  nulls = palloc(sizeof(bool) * list_length(list));
5901 
5902  foreach(cell, list)
5903  {
5904  char *name = lfirst(cell);
5905 
5906  if (name)
5907  {
5908  nulls[j] = false;
5909  datums[j++] = CStringGetTextDatum(name);
5910  }
5911  else
5912  nulls[j] = true;
5913  }
5914 
5915  MemoryContextSwitchTo(oldcxt);
5916 
5917  lb[0] = 1;
5918  arr = construct_md_array(datums, nulls, 1, &j,
5919  lb, TEXTOID, -1, false, TYPALIGN_INT);
5920 
5921  MemoryContextDelete(memcxt);
5922 
5923  return arr;
5924 }
void MemoryContextDelete(MemoryContext context)
Definition: mcxt.c:218
#define AllocSetContextCreate
Definition: memutils.h:173
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:195
MemoryContext CurrentMemoryContext
Definition: mcxt.c:42
uintptr_t Datum
Definition: postgres.h:411
#define lfirst(lc)
Definition: pg_list.h:169
static int list_length(const List *l)
Definition: pg_list.h:149
const char * name
Definition: encode.c:561
void * palloc(Size size)
Definition: mcxt.c:1062
#define CStringGetTextDatum(s)
Definition: builtins.h:86
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:3354

Variable Documentation

◆ InvalidObjectAddress