PostgreSQL Source Code  git master
objectaddress.c File Reference
#include "postgres.h"
#include "access/htup_details.h"
#include "access/sysattr.h"
#include "catalog/catalog.h"
#include "catalog/indexing.h"
#include "catalog/objectaddress.h"
#include "catalog/pg_am.h"
#include "catalog/pg_amop.h"
#include "catalog/pg_amproc.h"
#include "catalog/pg_attrdef.h"
#include "catalog/pg_authid.h"
#include "catalog/pg_cast.h"
#include "catalog/pg_default_acl.h"
#include "catalog/pg_event_trigger.h"
#include "catalog/pg_collation.h"
#include "catalog/pg_constraint.h"
#include "catalog/pg_constraint_fn.h"
#include "catalog/pg_conversion.h"
#include "catalog/pg_database.h"
#include "catalog/pg_extension.h"
#include "catalog/pg_foreign_data_wrapper.h"
#include "catalog/pg_foreign_server.h"
#include "catalog/pg_language.h"
#include "catalog/pg_largeobject.h"
#include "catalog/pg_largeobject_metadata.h"
#include "catalog/pg_namespace.h"
#include "catalog/pg_opclass.h"
#include "catalog/pg_opfamily.h"
#include "catalog/pg_operator.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_policy.h"
#include "catalog/pg_publication.h"
#include "catalog/pg_publication_rel.h"
#include "catalog/pg_rewrite.h"
#include "catalog/pg_statistic_ext.h"
#include "catalog/pg_subscription.h"
#include "catalog/pg_tablespace.h"
#include "catalog/pg_transform.h"
#include "catalog/pg_trigger.h"
#include "catalog/pg_ts_config.h"
#include "catalog/pg_ts_dict.h"
#include "catalog/pg_ts_parser.h"
#include "catalog/pg_ts_template.h"
#include "catalog/pg_type.h"
#include "catalog/pg_user_mapping.h"
#include "commands/dbcommands.h"
#include "commands/defrem.h"
#include "commands/event_trigger.h"
#include "commands/extension.h"
#include "commands/policy.h"
#include "commands/proclang.h"
#include "commands/tablespace.h"
#include "commands/trigger.h"
#include "foreign/foreign.h"
#include "funcapi.h"
#include "miscadmin.h"
#include "nodes/makefuncs.h"
#include "parser/parse_func.h"
#include "parser/parse_oper.h"
#include "parser/parse_type.h"
#include "rewrite/rewriteSupport.h"
#include "storage/large_object.h"
#include "storage/lmgr.h"
#include "storage/sinval.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
#include "utils/lsyscache.h"
#include "utils/memutils.h"
#include "utils/regproc.h"
#include "utils/syscache.h"
#include "utils/tqual.h"
Include dependency graph for objectaddress.c:

Go to the source code of this file.

Data Structures

struct  ObjectPropertyType
 
struct  object_type_map
 

Functions

static ObjectAddress get_object_address_unqualified (ObjectType objtype, Value *strval, bool missing_ok)
 
static ObjectAddress get_relation_by_qualified_name (ObjectType objtype, List *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
 
static ObjectAddress get_object_address_relobject (ObjectType objtype, List *object, Relation *relp, bool missing_ok)
 
static ObjectAddress get_object_address_attribute (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)
 
static ObjectAddress get_object_address_type (ObjectType objtype, TypeName *typename, bool missing_ok)
 
static ObjectAddress get_object_address_opcf (ObjectType objtype, List *object, bool missing_ok)
 
static ObjectAddress get_object_address_opf_member (ObjectType objtype, List *object, bool missing_ok)
 
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)
 
static ObjectAddress get_object_address_defacl (List *object, bool missing_ok)
 
static const ObjectPropertyTypeget_object_property_data (Oid class_id)
 
static void getRelationDescription (StringInfo buffer, Oid relid)
 
static void getOpFamilyDescription (StringInfo buffer, Oid opfid)
 
static void getRelationTypeDescription (StringInfo buffer, Oid relid, int32 objectSubId)
 
static void getProcedureTypeDescription (StringInfo buffer, Oid procid)
 
static void getConstraintTypeDescription (StringInfo buffer, Oid constroid)
 
static void getOpFamilyIdentity (StringInfo buffer, Oid opfid, List **object)
 
static void getRelationIdentity (StringInfo buffer, Oid relid, List **object)
 
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)
 
static Listtextarray_to_strvaluelist (ArrayType *arr)
 
Datum pg_get_object_address (PG_FUNCTION_ARGS)
 
void check_object_ownership (Oid roleid, ObjectType objtype, ObjectAddress address, Node *object, Relation relation)
 
Oid get_object_namespace (const ObjectAddress *address)
 
int read_objtype_from_string (const char *objtype)
 
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_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)
 
AclObjectKind get_object_aclkind (Oid class_id)
 
bool get_object_namensp_unique (Oid class_id)
 
bool is_objectclass_supported (Oid class_id)
 
HeapTuple get_catalog_object_by_oid (Relation catalog, Oid objectId)
 
char * getObjectDescription (const ObjectAddress *object)
 
char * getObjectDescriptionOids (Oid classid, Oid objid)
 
Datum pg_describe_object (PG_FUNCTION_ARGS)
 
Datum pg_identify_object (PG_FUNCTION_ARGS)
 
Datum pg_identify_object_as_address (PG_FUNCTION_ARGS)
 
char * getObjectTypeDescription (const ObjectAddress *object)
 
char * getObjectIdentity (const ObjectAddress *object)
 
char * getObjectIdentityParts (const ObjectAddress *object, List **objname, List **objargs)
 
ArrayTypestrlist_to_textarray (List *list)
 

Variables

static const ObjectPropertyType ObjectProperty []
 
static const struct object_type_map ObjectTypeMap []
 
const ObjectAddress InvalidObjectAddress
 

Function Documentation

◆ check_object_ownership()

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

Definition at line 2227 of file objectaddress.c.

References ACL_KIND_CLASS, ACL_KIND_COLLATION, ACL_KIND_CONVERSION, ACL_KIND_DATABASE, ACL_KIND_EVENT_TRIGGER, ACL_KIND_EXTENSION, ACL_KIND_FDW, ACL_KIND_FOREIGN_SERVER, ACL_KIND_LANGUAGE, ACL_KIND_NAMESPACE, ACL_KIND_OPCLASS, ACL_KIND_OPER, ACL_KIND_OPFAMILY, ACL_KIND_PROC, ACL_KIND_PUBLICATION, ACL_KIND_SUBSCRIPTION, ACL_KIND_TABLESPACE, ACL_KIND_TSCONFIGURATION, ACL_KIND_TSDICTIONARY, aclcheck_error(), aclcheck_error_type(), ACLCHECK_NOT_OWNER, castNode, elog, ereport, errcode(), errmsg(), ERROR, format_type_be(), has_createrole_privilege(), 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, 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, strVal, superuser_arg(), and typenameTypeId().

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

2229 {
2230  switch (objtype)
2231  {
2232  case OBJECT_INDEX:
2233  case OBJECT_SEQUENCE:
2234  case OBJECT_TABLE:
2235  case OBJECT_VIEW:
2236  case OBJECT_MATVIEW:
2237  case OBJECT_FOREIGN_TABLE:
2238  case OBJECT_COLUMN:
2239  case OBJECT_RULE:
2240  case OBJECT_TRIGGER:
2241  case OBJECT_POLICY:
2242  case OBJECT_TABCONSTRAINT:
2243  if (!pg_class_ownercheck(RelationGetRelid(relation), roleid))
2245  RelationGetRelationName(relation));
2246  break;
2247  case OBJECT_DATABASE:
2248  if (!pg_database_ownercheck(address.objectId, roleid))
2250  strVal((Value *) object));
2251  break;
2252  case OBJECT_TYPE:
2253  case OBJECT_DOMAIN:
2254  case OBJECT_ATTRIBUTE:
2255  case OBJECT_DOMCONSTRAINT:
2256  if (!pg_type_ownercheck(address.objectId, roleid))
2258  break;
2259  case OBJECT_AGGREGATE:
2260  case OBJECT_FUNCTION:
2261  case OBJECT_PROCEDURE:
2262  case OBJECT_ROUTINE:
2263  if (!pg_proc_ownercheck(address.objectId, roleid))
2265  NameListToString((castNode(ObjectWithArgs, object))->objname));
2266  break;
2267  case OBJECT_OPERATOR:
2268  if (!pg_oper_ownercheck(address.objectId, roleid))
2270  NameListToString((castNode(ObjectWithArgs, object))->objname));
2271  break;
2272  case OBJECT_SCHEMA:
2273  if (!pg_namespace_ownercheck(address.objectId, roleid))
2275  strVal((Value *) object));
2276  break;
2277  case OBJECT_COLLATION:
2278  if (!pg_collation_ownercheck(address.objectId, roleid))
2280  NameListToString(castNode(List, object)));
2281  break;
2282  case OBJECT_CONVERSION:
2283  if (!pg_conversion_ownercheck(address.objectId, roleid))
2285  NameListToString(castNode(List, object)));
2286  break;
2287  case OBJECT_EXTENSION:
2288  if (!pg_extension_ownercheck(address.objectId, roleid))
2290  strVal((Value *) object));
2291  break;
2292  case OBJECT_FDW:
2293  if (!pg_foreign_data_wrapper_ownercheck(address.objectId, roleid))
2295  strVal((Value *) object));
2296  break;
2297  case OBJECT_FOREIGN_SERVER:
2298  if (!pg_foreign_server_ownercheck(address.objectId, roleid))
2300  strVal((Value *) object));
2301  break;
2302  case OBJECT_EVENT_TRIGGER:
2303  if (!pg_event_trigger_ownercheck(address.objectId, roleid))
2305  strVal((Value *) object));
2306  break;
2307  case OBJECT_LANGUAGE:
2308  if (!pg_language_ownercheck(address.objectId, roleid))
2310  strVal((Value *) object));
2311  break;
2312  case OBJECT_OPCLASS:
2313  if (!pg_opclass_ownercheck(address.objectId, roleid))
2315  NameListToString(castNode(List, object)));
2316  break;
2317  case OBJECT_OPFAMILY:
2318  if (!pg_opfamily_ownercheck(address.objectId, roleid))
2320  NameListToString(castNode(List, object)));
2321  break;
2322  case OBJECT_LARGEOBJECT:
2323  if (!lo_compat_privileges &&
2324  !pg_largeobject_ownercheck(address.objectId, roleid))
2325  ereport(ERROR,
2326  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2327  errmsg("must be owner of large object %u",
2328  address.objectId)));
2329  break;
2330  case OBJECT_CAST:
2331  {
2332  /* We can only check permissions on the source/target types */
2333  TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
2334  TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
2335  Oid sourcetypeid = typenameTypeId(NULL, sourcetype);
2336  Oid targettypeid = typenameTypeId(NULL, targettype);
2337 
2338  if (!pg_type_ownercheck(sourcetypeid, roleid)
2339  && !pg_type_ownercheck(targettypeid, roleid))
2340  ereport(ERROR,
2341  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2342  errmsg("must be owner of type %s or type %s",
2343  format_type_be(sourcetypeid),
2344  format_type_be(targettypeid))));
2345  }
2346  break;
2347  case OBJECT_PUBLICATION:
2348  if (!pg_publication_ownercheck(address.objectId, roleid))
2350  strVal((Value *) object));
2351  break;
2352  case OBJECT_SUBSCRIPTION:
2353  if (!pg_subscription_ownercheck(address.objectId, roleid))
2355  strVal((Value *) object));
2356  break;
2357  case OBJECT_TRANSFORM:
2358  {
2359  TypeName *typename = linitial_node(TypeName, castNode(List, object));
2360  Oid typeid = typenameTypeId(NULL, typename);
2361 
2362  if (!pg_type_ownercheck(typeid, roleid))
2364  }
2365  break;
2366  case OBJECT_TABLESPACE:
2367  if (!pg_tablespace_ownercheck(address.objectId, roleid))
2369  strVal((Value *) object));
2370  break;
2371  case OBJECT_TSDICTIONARY:
2372  if (!pg_ts_dict_ownercheck(address.objectId, roleid))
2374  NameListToString(castNode(List, object)));
2375  break;
2377  if (!pg_ts_config_ownercheck(address.objectId, roleid))
2379  NameListToString(castNode(List, object)));
2380  break;
2381  case OBJECT_ROLE:
2382 
2383  /*
2384  * We treat roles as being "owned" by those with CREATEROLE priv,
2385  * except that superusers are only owned by superusers.
2386  */
2387  if (superuser_arg(address.objectId))
2388  {
2389  if (!superuser_arg(roleid))
2390  ereport(ERROR,
2391  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2392  errmsg("must be superuser")));
2393  }
2394  else
2395  {
2396  if (!has_createrole_privilege(roleid))
2397  ereport(ERROR,
2398  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2399  errmsg("must have CREATEROLE privilege")));
2400  }
2401  break;
2402  case OBJECT_TSPARSER:
2403  case OBJECT_TSTEMPLATE:
2404  case OBJECT_ACCESS_METHOD:
2405  /* We treat these object types as being owned by superusers */
2406  if (!superuser_arg(roleid))
2407  ereport(ERROR,
2408  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2409  errmsg("must be superuser")));
2410  break;
2411  case OBJECT_STATISTIC_EXT:
2412  if (!pg_statistics_object_ownercheck(address.objectId, roleid))
2414  break;
2415  default:
2416  elog(ERROR, "unrecognized object type: %d",
2417  (int) objtype);
2418  }
2419 }
bool has_createrole_privilege(Oid roleid)
Definition: aclchk.c:5229
bool pg_collation_ownercheck(Oid coll_oid, Oid roleid)
Definition: aclchk.c:5048
bool lo_compat_privileges
Definition: inv_api.c:57
bool pg_largeobject_ownercheck(Oid lobj_oid, Oid roleid)
Definition: aclchk.c:4737
bool pg_ts_dict_ownercheck(Oid dict_oid, Oid roleid)
Definition: aclchk.c:4887
bool pg_language_ownercheck(Oid lan_oid, Oid roleid)
Definition: aclchk.c:4708
#define castNode(_type_, nodeptr)
Definition: nodes.h:581
bool pg_ts_config_ownercheck(Oid cfg_oid, Oid roleid)
Definition: aclchk.c:4914
bool pg_foreign_server_ownercheck(Oid srv_oid, Oid roleid)
Definition: aclchk.c:4968
bool pg_publication_ownercheck(Oid pub_oid, Oid roleid)
Definition: aclchk.c:5142
#define strVal(v)
Definition: value.h:54
bool pg_oper_ownercheck(Oid oper_oid, Oid roleid)
Definition: aclchk.c:4656
int errcode(int sqlerrcode)
Definition: elog.c:575
char * format_type_be(Oid type_oid)
Definition: format_type.c:94
bool pg_namespace_ownercheck(Oid nsp_oid, Oid roleid)
Definition: aclchk.c:4780
unsigned int Oid
Definition: postgres_ext.h:31
bool pg_type_ownercheck(Oid type_oid, Oid roleid)
Definition: aclchk.c:4630
#define linitial_node(type, l)
Definition: pg_list.h:114
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
Definition: aclchk.c:3515
#define ERROR
Definition: elog.h:43
bool pg_event_trigger_ownercheck(Oid et_oid, Oid roleid)
Definition: aclchk.c:4995
bool pg_extension_ownercheck(Oid ext_oid, Oid roleid)
Definition: aclchk.c:5100
void aclcheck_error(AclResult aclerr, AclObjectKind objectkind, const char *objectname)
Definition: aclchk.c:3457
#define RelationGetRelationName(relation)
Definition: rel.h:445
bool pg_tablespace_ownercheck(Oid spc_oid, Oid roleid)
Definition: aclchk.c:4806
bool pg_opfamily_ownercheck(Oid opf_oid, Oid roleid)
Definition: aclchk.c:4860
#define ereport(elevel, rest)
Definition: elog.h:122
bool pg_database_ownercheck(Oid db_oid, Oid roleid)
Definition: aclchk.c:5022
bool superuser_arg(Oid roleid)
Definition: superuser.c:57
char * NameListToString(List *names)
Definition: namespace.c:3063
#define lsecond_node(type, l)
Definition: pg_list.h:119
bool pg_opclass_ownercheck(Oid opc_oid, Oid roleid)
Definition: aclchk.c:4833
bool pg_conversion_ownercheck(Oid conv_oid, Oid roleid)
Definition: aclchk.c:5074
Definition: value.h:42
bool pg_class_ownercheck(Oid class_oid, Oid roleid)
Definition: aclchk.c:4604
bool pg_foreign_data_wrapper_ownercheck(Oid srv_oid, Oid roleid)
Definition: aclchk.c:4941
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define elog
Definition: elog.h:219
Definition: pg_list.h:45
#define RelationGetRelid(relation)
Definition: rel.h:425
bool pg_proc_ownercheck(Oid proc_oid, Oid roleid)
Definition: aclchk.c:4682
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
Definition: parse_type.c:274
bool pg_subscription_ownercheck(Oid sub_oid, Oid roleid)
Definition: aclchk.c:5168
bool pg_statistics_object_ownercheck(Oid stat_oid, Oid roleid)
Definition: aclchk.c:5194

◆ get_catalog_object_by_oid()

HeapTuple get_catalog_object_by_oid ( Relation  catalog,
Oid  objectId 
)

Definition at line 2615 of file objectaddress.c.

References Assert, BTEqualStrategyNumber, get_object_catcache_oid(), get_object_oid_index(), heap_copytuple(), HeapTupleIsValid, ObjectIdAttributeNumber, 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().

2616 {
2617  HeapTuple tuple;
2618  Oid classId = RelationGetRelid(catalog);
2619  int oidCacheId = get_object_catcache_oid(classId);
2620 
2621  if (oidCacheId > 0)
2622  {
2623  tuple = SearchSysCacheCopy1(oidCacheId, ObjectIdGetDatum(objectId));
2624  if (!HeapTupleIsValid(tuple)) /* should not happen */
2625  return NULL;
2626  }
2627  else
2628  {
2629  Oid oidIndexId = get_object_oid_index(classId);
2630  SysScanDesc scan;
2631  ScanKeyData skey;
2632 
2633  Assert(OidIsValid(oidIndexId));
2634 
2635  ScanKeyInit(&skey,
2637  BTEqualStrategyNumber, F_OIDEQ,
2638  ObjectIdGetDatum(objectId));
2639 
2640  scan = systable_beginscan(catalog, oidIndexId, true,
2641  NULL, 1, &skey);
2642  tuple = systable_getnext(scan);
2643  if (!HeapTupleIsValid(tuple))
2644  {
2645  systable_endscan(scan);
2646  return NULL;
2647  }
2648  tuple = heap_copytuple(tuple);
2649 
2650  systable_endscan(scan);
2651  }
2652 
2653  return tuple;
2654 }
HeapTuple heap_copytuple(HeapTuple tuple)
Definition: heaptuple.c:611
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:499
#define ObjectIdAttributeNumber
Definition: sysattr.h:22
Oid get_object_oid_index(Oid class_id)
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:586
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition: genam.c:328
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:416
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
int get_object_catcache_oid(Oid class_id)
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define Assert(condition)
Definition: c.h:680
#define SearchSysCacheCopy1(cacheId, key1)
Definition: syscache.h:173
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
#define RelationGetRelid(relation)
Definition: rel.h:425
#define BTEqualStrategyNumber
Definition: stratnum.h:31

◆ get_object_aclkind()

AclObjectKind get_object_aclkind ( Oid  class_id)

Definition at line 2543 of file objectaddress.c.

References ObjectPropertyType::acl_kind, and get_object_property_data().

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

2544 {
2545  const ObjectPropertyType *prop = get_object_property_data(class_id);
2546 
2547  return prop->acl_kind;
2548 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AclObjectKind acl_kind

◆ get_object_address()

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

Definition at line 798 of file objectaddress.c.

References Assert, castNode, CastRelationId, ObjectAddress::classId, CollationRelationId, ConstraintRelationId, ConversionRelationId, 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(), LargeObjectRelationId, 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(), OperatorRelationId, ProcedureRelationId, RelationRelationId, SharedInvalidMessageCounter, StatisticExtRelationId, strVal, TransformRelationId, TSConfigRelationId, TSDictionaryRelationId, TSParserRelationId, TSTemplateRelationId, UnlockDatabaseObject(), and UnlockSharedObject().

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

800 {
801  ObjectAddress address;
802  ObjectAddress old_address = {InvalidOid, InvalidOid, 0};
803  Relation relation = NULL;
804  uint64 inval_count;
805 
806  /* Some kind of lock must be taken. */
807  Assert(lockmode != NoLock);
808 
809  for (;;)
810  {
811  /*
812  * Remember this value, so that, after looking up the object name and
813  * locking it, we can check whether any invalidation messages have
814  * been processed that might require a do-over.
815  */
816  inval_count = SharedInvalidMessageCounter;
817 
818  /* Look up object address. */
819  switch (objtype)
820  {
821  case OBJECT_INDEX:
822  case OBJECT_SEQUENCE:
823  case OBJECT_TABLE:
824  case OBJECT_VIEW:
825  case OBJECT_MATVIEW:
827  address =
828  get_relation_by_qualified_name(objtype, castNode(List, object),
829  &relation, lockmode,
830  missing_ok);
831  break;
832  case OBJECT_COLUMN:
833  address =
834  get_object_address_attribute(objtype, castNode(List, object),
835  &relation, lockmode,
836  missing_ok);
837  break;
838  case OBJECT_DEFAULT:
839  address =
840  get_object_address_attrdef(objtype, castNode(List, object),
841  &relation, lockmode,
842  missing_ok);
843  break;
844  case OBJECT_RULE:
845  case OBJECT_TRIGGER:
847  case OBJECT_POLICY:
848  address = get_object_address_relobject(objtype, castNode(List, object),
849  &relation, missing_ok);
850  break;
852  {
853  List *objlist;
854  ObjectAddress domaddr;
855  char *constrname;
856 
857  objlist = castNode(List, object);
859  linitial_node(TypeName, objlist),
860  missing_ok);
861  constrname = strVal(lsecond(objlist));
862 
863  address.classId = ConstraintRelationId;
864  address.objectId = get_domain_constraint_oid(domaddr.objectId,
865  constrname, missing_ok);
866  address.objectSubId = 0;
867 
868  }
869  break;
870  case OBJECT_DATABASE:
871  case OBJECT_EXTENSION:
872  case OBJECT_TABLESPACE:
873  case OBJECT_ROLE:
874  case OBJECT_SCHEMA:
875  case OBJECT_LANGUAGE:
876  case OBJECT_FDW:
880  case OBJECT_PUBLICATION:
881  case OBJECT_SUBSCRIPTION:
882  address = get_object_address_unqualified(objtype,
883  (Value *) object, missing_ok);
884  break;
885  case OBJECT_TYPE:
886  case OBJECT_DOMAIN:
887  address = get_object_address_type(objtype, castNode(TypeName, object), missing_ok);
888  break;
889  case OBJECT_AGGREGATE:
890  case OBJECT_FUNCTION:
891  case OBJECT_PROCEDURE:
892  case OBJECT_ROUTINE:
893  address.classId = ProcedureRelationId;
894  address.objectId = LookupFuncWithArgs(objtype, castNode(ObjectWithArgs, object), missing_ok);
895  address.objectSubId = 0;
896  break;
897  case OBJECT_OPERATOR:
898  address.classId = OperatorRelationId;
899  address.objectId = LookupOperWithArgs(castNode(ObjectWithArgs, object), missing_ok);
900  address.objectSubId = 0;
901  break;
902  case OBJECT_COLLATION:
903  address.classId = CollationRelationId;
904  address.objectId = get_collation_oid(castNode(List, object), missing_ok);
905  address.objectSubId = 0;
906  break;
907  case OBJECT_CONVERSION:
908  address.classId = ConversionRelationId;
909  address.objectId = get_conversion_oid(castNode(List, object), missing_ok);
910  address.objectSubId = 0;
911  break;
912  case OBJECT_OPCLASS:
913  case OBJECT_OPFAMILY:
914  address = get_object_address_opcf(objtype, castNode(List, object), missing_ok);
915  break;
916  case OBJECT_AMOP:
917  case OBJECT_AMPROC:
918  address = get_object_address_opf_member(objtype, castNode(List, object), missing_ok);
919  break;
920  case OBJECT_LARGEOBJECT:
921  address.classId = LargeObjectRelationId;
922  address.objectId = oidparse(object);
923  address.objectSubId = 0;
924  if (!LargeObjectExists(address.objectId))
925  {
926  if (!missing_ok)
927  ereport(ERROR,
928  (errcode(ERRCODE_UNDEFINED_OBJECT),
929  errmsg("large object %u does not exist",
930  address.objectId)));
931  }
932  break;
933  case OBJECT_CAST:
934  {
935  TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
936  TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
937  Oid sourcetypeid;
938  Oid targettypeid;
939 
940  sourcetypeid = LookupTypeNameOid(NULL, sourcetype, missing_ok);
941  targettypeid = LookupTypeNameOid(NULL, targettype, missing_ok);
942  address.classId = CastRelationId;
943  address.objectId =
944  get_cast_oid(sourcetypeid, targettypeid, missing_ok);
945  address.objectSubId = 0;
946  }
947  break;
948  case OBJECT_TRANSFORM:
949  {
950  TypeName *typename = linitial_node(TypeName, castNode(List, object));
951  char *langname = strVal(lsecond(castNode(List, object)));
952  Oid type_id = LookupTypeNameOid(NULL, typename, missing_ok);
953  Oid lang_id = get_language_oid(langname, missing_ok);
954 
955  address.classId = TransformRelationId;
956  address.objectId =
957  get_transform_oid(type_id, lang_id, missing_ok);
958  address.objectSubId = 0;
959  }
960  break;
961  case OBJECT_TSPARSER:
962  address.classId = TSParserRelationId;
963  address.objectId = get_ts_parser_oid(castNode(List, object), missing_ok);
964  address.objectSubId = 0;
965  break;
966  case OBJECT_TSDICTIONARY:
968  address.objectId = get_ts_dict_oid(castNode(List, object), missing_ok);
969  address.objectSubId = 0;
970  break;
971  case OBJECT_TSTEMPLATE:
972  address.classId = TSTemplateRelationId;
973  address.objectId = get_ts_template_oid(castNode(List, object), missing_ok);
974  address.objectSubId = 0;
975  break;
977  address.classId = TSConfigRelationId;
978  address.objectId = get_ts_config_oid(castNode(List, object), missing_ok);
979  address.objectSubId = 0;
980  break;
981  case OBJECT_USER_MAPPING:
982  address = get_object_address_usermapping(castNode(List, object),
983  missing_ok);
984  break;
987  &relation,
988  missing_ok);
989  break;
990  case OBJECT_DEFACL:
991  address = get_object_address_defacl(castNode(List, object),
992  missing_ok);
993  break;
996  address.objectId = get_statistics_object_oid(castNode(List, object),
997  missing_ok);
998  address.objectSubId = 0;
999  break;
1000  default:
1001  elog(ERROR, "unrecognized objtype: %d", (int) objtype);
1002  /* placate compiler, in case it thinks elog might return */
1003  address.classId = InvalidOid;
1004  address.objectId = InvalidOid;
1005  address.objectSubId = 0;
1006  }
1007 
1008  /*
1009  * If we could not find the supplied object, return without locking.
1010  */
1011  if (!OidIsValid(address.objectId))
1012  {
1013  Assert(missing_ok);
1014  return address;
1015  }
1016 
1017  /*
1018  * If we're retrying, see if we got the same answer as last time. If
1019  * so, we're done; if not, we locked the wrong thing, so give up our
1020  * lock.
1021  */
1022  if (OidIsValid(old_address.classId))
1023  {
1024  if (old_address.classId == address.classId
1025  && old_address.objectId == address.objectId
1026  && old_address.objectSubId == address.objectSubId)
1027  break;
1028  if (old_address.classId != RelationRelationId)
1029  {
1030  if (IsSharedRelation(old_address.classId))
1031  UnlockSharedObject(old_address.classId,
1032  old_address.objectId,
1033  0, lockmode);
1034  else
1035  UnlockDatabaseObject(old_address.classId,
1036  old_address.objectId,
1037  0, lockmode);
1038  }
1039  }
1040 
1041  /*
1042  * If we're dealing with a relation or attribute, then the relation is
1043  * already locked. Otherwise, we lock it now.
1044  */
1045  if (address.classId != RelationRelationId)
1046  {
1047  if (IsSharedRelation(address.classId))
1048  LockSharedObject(address.classId, address.objectId, 0,
1049  lockmode);
1050  else
1051  LockDatabaseObject(address.classId, address.objectId, 0,
1052  lockmode);
1053  }
1054 
1055  /*
1056  * At this point, we've resolved the name to an OID and locked the
1057  * corresponding database object. However, it's possible that by the
1058  * time we acquire the lock on the object, concurrent DDL has modified
1059  * the database in such a way that the name we originally looked up no
1060  * longer resolves to that OID.
1061  *
1062  * We can be certain that this isn't an issue if (a) no shared
1063  * invalidation messages have been processed or (b) we've locked a
1064  * relation somewhere along the line. All the relation name lookups
1065  * in this module ultimately use RangeVarGetRelid() to acquire a
1066  * relation lock, and that function protects against the same kinds of
1067  * races we're worried about here. Even when operating on a
1068  * constraint, rule, or trigger, we still acquire AccessShareLock on
1069  * the relation, which is enough to freeze out any concurrent DDL.
1070  *
1071  * In all other cases, however, it's possible that the name we looked
1072  * up no longer refers to the object we locked, so we retry the lookup
1073  * and see whether we get the same answer.
1074  */
1075  if (inval_count == SharedInvalidMessageCounter || relation != NULL)
1076  break;
1077  old_address = address;
1078  }
1079 
1080  /* Return the object address and the relation. */
1081  *relp = relation;
1082  return address;
1083 }
Oid LookupOperWithArgs(ObjectWithArgs *oper, bool noError)
Definition: parse_oper.c:140
#define OperatorRelationId
Definition: pg_operator.h:32
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
#define TransformRelationId
Definition: pg_transform.h:25
static ObjectAddress get_object_address_attribute(ObjectType objtype, List *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
#define castNode(_type_, nodeptr)
Definition: nodes.h:581
#define ProcedureRelationId
Definition: pg_proc.h:33
#define RelationRelationId
Definition: pg_class.h:29
Oid get_language_oid(const char *langname, bool missing_ok)
Definition: proclang.c:553
#define strVal(v)
Definition: value.h:54
int errcode(int sqlerrcode)
Definition: elog.c:575
Oid get_ts_config_oid(List *names, bool missing_ok)
Definition: namespace.c:2639
unsigned int Oid
Definition: postgres_ext.h:31
#define linitial_node(type, l)
Definition: pg_list.h:114
static ObjectAddress get_object_address_unqualified(ObjectType objtype, Value *strval, bool missing_ok)
#define OidIsValid(objectId)
Definition: c.h:586
#define lsecond(l)
Definition: pg_list.h:116
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)
#define TSConfigRelationId
Definition: pg_ts_config.h:31
Oid get_ts_dict_oid(List *names, bool missing_ok)
Definition: namespace.c:2386
Oid get_transform_oid(Oid type_id, Oid lang_id, bool missing_ok)
#define ERROR
Definition: elog.h:43
void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:918
#define TSDictionaryRelationId
Definition: pg_ts_dict.h:31
Oid get_statistics_object_oid(List *names, bool missing_ok)
Definition: namespace.c:2138
Oid get_ts_template_oid(List *names, bool missing_ok)
Definition: namespace.c:2513
#define NoLock
Definition: lockdefs.h:34
Oid LookupFuncWithArgs(ObjectType objtype, ObjectWithArgs *func, bool noError)
Definition: parse_func.c:2028
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:856
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)
#define ereport(elevel, rest)
Definition: elog.h:122
void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:877
#define lsecond_node(type, l)
Definition: pg_list.h:119
bool IsSharedRelation(Oid relationId)
Definition: catalog.c:220
#define TSParserRelationId
Definition: pg_ts_parser.h:31
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:897
uint64 SharedInvalidMessageCounter
Definition: sinval.c:26
#define CollationRelationId
Definition: pg_collation.h:30
#define InvalidOid
Definition: postgres_ext.h:36
Oid get_ts_parser_oid(List *names, bool missing_ok)
Definition: namespace.c:2260
#define Assert(condition)
Definition: c.h:680
#define StatisticExtRelationId
Definition: value.h:42
static ObjectAddress get_object_address_opf_member(ObjectType objtype, List *object, bool missing_ok)
#define CastRelationId
Definition: pg_cast.h:31
Oid get_conversion_oid(List *name, bool missing_ok)
Definition: namespace.c:3547
bool LargeObjectExists(Oid loid)
int errmsg(const char *fmt,...)
Definition: elog.c:797
Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok)
#define ConstraintRelationId
Definition: pg_constraint.h:29
#define elog
Definition: elog.h:219
#define LargeObjectRelationId
Oid get_collation_oid(List *name, bool missing_ok)
Definition: namespace.c:3493
Definition: pg_list.h:45
#define ConversionRelationId
Definition: pg_conversion.h:38
#define TSTemplateRelationId
Oid LookupTypeNameOid(ParseState *pstate, const TypeName *typeName, bool missing_ok)
Definition: parse_type.c:215

◆ get_object_address_attrdef()

static ObjectAddress get_object_address_attrdef ( ObjectType  objtype,
List object,
Relation relp,
LOCKMODE  lockmode,
bool  missing_ok 
)
static

Definition at line 1412 of file objectaddress.c.

References AccessShareLock, Anum_pg_attrdef_adnum, Anum_pg_attrdef_adrelid, AttrDefaultIndexId, AttrDefaultRelationId, BTEqualStrategyNumber, ObjectAddress::classId, tupleDesc::constr, ereport, errcode(), errmsg(), ERROR, get_attnum(), HeapTupleGetOid, HeapTupleIsValid, Int16GetDatum, InvalidAttrNumber, InvalidOid, list_copy(), list_length(), list_truncate(), llast, makeRangeVarFromNameList(), NameListToString(), ObjectAddress::objectId, ObjectIdGetDatum, ObjectAddress::objectSubId, OidIsValid, relation_close(), relation_open(), relation_openrv(), RelationGetDescr, RelationGetRelid, ScanKeyInit(), strVal, systable_beginscan(), systable_endscan(), and systable_getnext().

Referenced by get_object_address().

1415 {
1416  ObjectAddress address;
1417  List *relname;
1418  Oid reloid;
1419  Relation relation;
1420  const char *attname;
1421  AttrNumber attnum;
1422  TupleDesc tupdesc;
1423  Oid defoid;
1424 
1425  /* Extract relation name and open relation. */
1426  if (list_length(object) < 2)
1427  ereport(ERROR,
1428  (errcode(ERRCODE_SYNTAX_ERROR),
1429  errmsg("column name must be qualified")));
1430  attname = strVal(llast(object));
1431  relname = list_truncate(list_copy(object), list_length(object) - 1);
1432  /* XXX no missing_ok support here */
1433  relation = relation_openrv(makeRangeVarFromNameList(relname), lockmode);
1434  reloid = RelationGetRelid(relation);
1435 
1436  tupdesc = RelationGetDescr(relation);
1437 
1438  /* Look up attribute number and scan pg_attrdef to find its tuple */
1439  attnum = get_attnum(reloid, attname);
1440  defoid = InvalidOid;
1441  if (attnum != InvalidAttrNumber && tupdesc->constr != NULL)
1442  {
1443  Relation attrdef;
1444  ScanKeyData keys[2];
1445  SysScanDesc scan;
1446  HeapTuple tup;
1447 
1449  ScanKeyInit(&keys[0],
1452  F_OIDEQ,
1453  ObjectIdGetDatum(reloid));
1454  ScanKeyInit(&keys[1],
1457  F_INT2EQ,
1458  Int16GetDatum(attnum));
1459  scan = systable_beginscan(attrdef, AttrDefaultIndexId, true,
1460  NULL, 2, keys);
1461  if (HeapTupleIsValid(tup = systable_getnext(scan)))
1462  defoid = HeapTupleGetOid(tup);
1463 
1464  systable_endscan(scan);
1465  relation_close(attrdef, AccessShareLock);
1466  }
1467  if (!OidIsValid(defoid))
1468  {
1469  if (!missing_ok)
1470  ereport(ERROR,
1471  (errcode(ERRCODE_UNDEFINED_COLUMN),
1472  errmsg("default value for column \"%s\" of relation \"%s\" does not exist",
1473  attname, NameListToString(relname))));
1474 
1475  address.classId = AttrDefaultRelationId;
1476  address.objectId = InvalidOid;
1477  address.objectSubId = InvalidAttrNumber;
1478  relation_close(relation, lockmode);
1479  return address;
1480  }
1481 
1482  address.classId = AttrDefaultRelationId;
1483  address.objectId = defoid;
1484  address.objectSubId = 0;
1485 
1486  *relp = relation;
1487  return address;
1488 }
Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
Definition: heapam.c:1198
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:499
#define RelationGetDescr(relation)
Definition: rel.h:437
#define llast(l)
Definition: pg_list.h:131
#define Int16GetDatum(X)
Definition: postgres.h:457
List * list_truncate(List *list, int new_size)
Definition: list.c:350
#define AccessShareLock
Definition: lockdefs.h:36
List * list_copy(const List *oldlist)
Definition: list.c:1160
#define strVal(v)
Definition: value.h:54
int errcode(int sqlerrcode)
Definition: elog.c:575
void relation_close(Relation relation, LOCKMODE lockmode)
Definition: heapam.c:1266
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:3023
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:586
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition: genam.c:328
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:416
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
#define AttrDefaultIndexId
Definition: indexing.h:87
AttrNumber get_attnum(Oid relid, const char *attname)
Definition: lsyscache.c:821
#define ereport(elevel, rest)
Definition: elog.h:122
char * NameListToString(List *names)
Definition: namespace.c:3063
#define InvalidOid
Definition: postgres_ext.h:36
#define Anum_pg_attrdef_adrelid
Definition: pg_attrdef.h:54
#define Anum_pg_attrdef_adnum
Definition: pg_attrdef.h:55
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
TupleConstr * constr
Definition: tupdesc.h:84
static int list_length(const List *l)
Definition: pg_list.h:89
#define InvalidAttrNumber
Definition: attnum.h:23
int errmsg(const char *fmt,...)
Definition: elog.c:797
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
Relation relation_open(Oid relationId, LOCKMODE lockmode)
Definition: heapam.c:1120
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:700
#define AttrDefaultRelationId
Definition: pg_attrdef.h:29
Definition: pg_list.h:45
int16 AttrNumber
Definition: attnum.h:21
#define RelationGetRelid(relation)
Definition: rel.h:425
#define BTEqualStrategyNumber
Definition: stratnum.h:31

◆ get_object_address_attribute()

static ObjectAddress get_object_address_attribute ( ObjectType  objtype,
List object,
Relation relp,
LOCKMODE  lockmode,
bool  missing_ok 
)
static

Definition at line 1361 of file objectaddress.c.

References ObjectAddress::classId, ereport, errcode(), errmsg(), ERROR, get_attnum(), InvalidAttrNumber, InvalidOid, lfirst, list_copy(), list_length(), list_tail(), list_truncate(), makeRangeVarFromNameList(), NameListToString(), ObjectAddress::objectId, ObjectAddress::objectSubId, relation_close(), relation_openrv(), RelationGetRelid, RelationRelationId, and strVal.

Referenced by get_object_address().

1364 {
1365  ObjectAddress address;
1366  List *relname;
1367  Oid reloid;
1368  Relation relation;
1369  const char *attname;
1370  AttrNumber attnum;
1371 
1372  /* Extract relation name and open relation. */
1373  if (list_length(object) < 2)
1374  ereport(ERROR,
1375  (errcode(ERRCODE_SYNTAX_ERROR),
1376  errmsg("column name must be qualified")));
1377  attname = strVal(lfirst(list_tail(object)));
1378  relname = list_truncate(list_copy(object), list_length(object) - 1);
1379  /* XXX no missing_ok support here */
1380  relation = relation_openrv(makeRangeVarFromNameList(relname), lockmode);
1381  reloid = RelationGetRelid(relation);
1382 
1383  /* Look up attribute and construct return value. */
1384  attnum = get_attnum(reloid, attname);
1385  if (attnum == InvalidAttrNumber)
1386  {
1387  if (!missing_ok)
1388  ereport(ERROR,
1389  (errcode(ERRCODE_UNDEFINED_COLUMN),
1390  errmsg("column \"%s\" of relation \"%s\" does not exist",
1391  attname, NameListToString(relname))));
1392 
1393  address.classId = RelationRelationId;
1394  address.objectId = InvalidOid;
1395  address.objectSubId = InvalidAttrNumber;
1396  relation_close(relation, lockmode);
1397  return address;
1398  }
1399 
1400  address.classId = RelationRelationId;
1401  address.objectId = reloid;
1402  address.objectSubId = attnum;
1403 
1404  *relp = relation;
1405  return address;
1406 }
Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
Definition: heapam.c:1198
#define RelationRelationId
Definition: pg_class.h:29
List * list_truncate(List *list, int new_size)
Definition: list.c:350
List * list_copy(const List *oldlist)
Definition: list.c:1160
#define strVal(v)
Definition: value.h:54
int errcode(int sqlerrcode)
Definition: elog.c:575
void relation_close(Relation relation, LOCKMODE lockmode)
Definition: heapam.c:1266
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:3023
unsigned int Oid
Definition: postgres_ext.h:31
static ListCell * list_tail(List *l)
Definition: pg_list.h:83
#define ERROR
Definition: elog.h:43
AttrNumber get_attnum(Oid relid, const char *attname)
Definition: lsyscache.c:821
#define ereport(elevel, rest)
Definition: elog.h:122
char * NameListToString(List *names)
Definition: namespace.c:3063
#define InvalidOid
Definition: postgres_ext.h:36
#define lfirst(lc)
Definition: pg_list.h:106
static int list_length(const List *l)
Definition: pg_list.h:89
#define InvalidAttrNumber
Definition: attnum.h:23
int errmsg(const char *fmt,...)
Definition: elog.c:797
Definition: pg_list.h:45
int16 AttrNumber
Definition: attnum.h:21
#define RelationGetRelid(relation)
Definition: rel.h:425

◆ get_object_address_defacl()

static ObjectAddress get_object_address_defacl ( List object,
bool  missing_ok 
)
static

Definition at line 1804 of file objectaddress.c.

References AUTHNAME, CharGetDatum, CStringGetDatum, DEFACLOBJ_FUNCTION, DEFACLOBJ_NAMESPACE, DEFACLOBJ_RELATION, DEFACLOBJ_SEQUENCE, DEFACLOBJ_TYPE, DEFACLROLENSPOBJ, DefaultAclRelationId, ereport, errcode(), errhint(), errmsg(), ERROR, get_namespace_oid(), HeapTupleGetOid, HeapTupleIsValid, InvalidOid, linitial, list_length(), lsecond, lthird, ObjectAddressSet, ObjectAddress::objectId, ObjectIdGetDatum, ReleaseSysCache(), SearchSysCache1(), SearchSysCache3(), strVal, and username.

Referenced by get_object_address().

1805 {
1806  HeapTuple tp;
1807  Oid userid;
1808  Oid schemaid;
1809  char *username;
1810  char *schema;
1811  char objtype;
1812  char *objtype_str;
1813  ObjectAddress address;
1814 
1816 
1817  /*
1818  * First figure out the textual attributes so that they can be used for
1819  * error reporting.
1820  */
1821  username = strVal(lsecond(object));
1822  if (list_length(object) >= 3)
1823  schema = (char *) strVal(lthird(object));
1824  else
1825  schema = NULL;
1826 
1827  /*
1828  * Decode defaclobjtype. Only first char is considered; the rest of the
1829  * string, if any, is blissfully ignored.
1830  */
1831  objtype = ((char *) strVal(linitial(object)))[0];
1832  switch (objtype)
1833  {
1834  case DEFACLOBJ_RELATION:
1835  objtype_str = "tables";
1836  break;
1837  case DEFACLOBJ_SEQUENCE:
1838  objtype_str = "sequences";
1839  break;
1840  case DEFACLOBJ_FUNCTION:
1841  objtype_str = "functions";
1842  break;
1843  case DEFACLOBJ_TYPE:
1844  objtype_str = "types";
1845  break;
1846  case DEFACLOBJ_NAMESPACE:
1847  objtype_str = "schemas";
1848  break;
1849  default:
1850  ereport(ERROR,
1851  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1852  errmsg("unrecognized default ACL object type \"%c\"", objtype),
1853  errhint("Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\".",
1859  }
1860 
1861  /*
1862  * Look up user ID. Behave as "default ACL not found" if the user doesn't
1863  * exist.
1864  */
1866  CStringGetDatum(username));
1867  if (!HeapTupleIsValid(tp))
1868  goto not_found;
1869  userid = HeapTupleGetOid(tp);
1870  ReleaseSysCache(tp);
1871 
1872  /*
1873  * If a schema name was given, look up its OID. If it doesn't exist,
1874  * behave as "default ACL not found".
1875  */
1876  if (schema)
1877  {
1878  schemaid = get_namespace_oid(schema, true);
1879  if (schemaid == InvalidOid)
1880  goto not_found;
1881  }
1882  else
1883  schemaid = InvalidOid;
1884 
1885  /* Finally, look up the pg_default_acl object */
1887  ObjectIdGetDatum(userid),
1888  ObjectIdGetDatum(schemaid),
1889  CharGetDatum(objtype));
1890  if (!HeapTupleIsValid(tp))
1891  goto not_found;
1892 
1893  address.objectId = HeapTupleGetOid(tp);
1894  ReleaseSysCache(tp);
1895 
1896  return address;
1897 
1898 not_found:
1899  if (!missing_ok)
1900  {
1901  if (schema)
1902  ereport(ERROR,
1903  (errcode(ERRCODE_UNDEFINED_OBJECT),
1904  errmsg("default ACL for user \"%s\" in schema \"%s\" on %s does not exist",
1905  username, schema, objtype_str)));
1906  else
1907  ereport(ERROR,
1908  (errcode(ERRCODE_UNDEFINED_OBJECT),
1909  errmsg("default ACL for user \"%s\" on %s does not exist",
1910  username, objtype_str)));
1911  }
1912  return address;
1913 }
Oid get_namespace_oid(const char *nspname, bool missing_ok)
Definition: namespace.c:3005
int errhint(const char *fmt,...)
Definition: elog.c:987
#define strVal(v)
Definition: value.h:54
int errcode(int sqlerrcode)
Definition: elog.c:575
unsigned int Oid
Definition: postgres_ext.h:31
#define lsecond(l)
Definition: pg_list.h:116
#define DefaultAclRelationId
#define linitial(l)
Definition: pg_list.h:111
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
HeapTuple SearchSysCache3(int cacheId, Datum key1, Datum key2, Datum key3)
Definition: syscache.c:1134
#define DEFACLOBJ_SEQUENCE
#define CStringGetDatum(X)
Definition: postgres.h:584
#define ereport(elevel, rest)
Definition: elog.h:122
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
#define DEFACLOBJ_TYPE
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
static char * username
Definition: initdb.c:132
#define InvalidOid
Definition: postgres_ext.h:36
#define DEFACLOBJ_NAMESPACE
#define DEFACLOBJ_RELATION
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define DEFACLOBJ_FUNCTION
static int list_length(const List *l)
Definition: pg_list.h:89
#define ObjectAddressSet(addr, class_id, object_id)
Definition: objectaddress.h:40
#define CharGetDatum(X)
Definition: postgres.h:422
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define lthird(l)
Definition: pg_list.h:121
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:700

◆ get_object_address_opcf()

static ObjectAddress get_object_address_opcf ( ObjectType  objtype,
List object,
bool  missing_ok 
)
static

Definition at line 1533 of file objectaddress.c.

References ObjectAddress::classId, elog, ERROR, get_index_am_oid(), get_opclass_oid(), get_opfamily_oid(), InvalidOid, linitial, list_copy_tail(), OBJECT_OPCLASS, OBJECT_OPFAMILY, ObjectAddress::objectId, ObjectAddress::objectSubId, OperatorClassRelationId, OperatorFamilyRelationId, and strVal.

Referenced by get_object_address(), and get_object_address_opf_member().

1534 {
1535  Oid amoid;
1536  ObjectAddress address;
1537 
1538  /* XXX no missing_ok support here */
1539  amoid = get_index_am_oid(strVal(linitial(object)), false);
1540  object = list_copy_tail(object, 1);
1541 
1542  switch (objtype)
1543  {
1544  case OBJECT_OPCLASS:
1545  address.classId = OperatorClassRelationId;
1546  address.objectId = get_opclass_oid(amoid, object, missing_ok);
1547  address.objectSubId = 0;
1548  break;
1549  case OBJECT_OPFAMILY:
1551  address.objectId = get_opfamily_oid(amoid, object, missing_ok);
1552  address.objectSubId = 0;
1553  break;
1554  default:
1555  elog(ERROR, "unrecognized objtype: %d", (int) objtype);
1556  /* placate compiler, which doesn't know elog won't return */
1557  address.classId = InvalidOid;
1558  address.objectId = InvalidOid;
1559  address.objectSubId = 0;
1560  }
1561 
1562  return address;
1563 }
#define OperatorClassRelationId
Definition: pg_opclass.h:49
#define OperatorFamilyRelationId
Definition: pg_opfamily.h:29
#define strVal(v)
Definition: value.h:54
Oid get_opclass_oid(Oid amID, List *opclassname, bool missing_ok)
Definition: opclasscmds.c:221
List * list_copy_tail(const List *oldlist, int nskip)
Definition: list.c:1203
unsigned int Oid
Definition: postgres_ext.h:31
#define linitial(l)
Definition: pg_list.h:111
#define ERROR
Definition: elog.h:43
Oid get_index_am_oid(const char *amname, bool missing_ok)
Definition: amcmds.c:183
#define InvalidOid
Definition: postgres_ext.h:36
Oid get_opfamily_oid(Oid amID, List *opfamilyname, bool missing_ok)
Definition: opclasscmds.c:142
#define elog
Definition: elog.h:219

◆ get_object_address_opf_member()

static ObjectAddress get_object_address_opf_member ( ObjectType  objtype,
List object,
bool  missing_ok 
)
static

Definition at line 1571 of file objectaddress.c.

References AccessMethodOperatorRelationId, AccessMethodProcedureRelationId, AMOPSTRATEGY, AMPROCNUM, elog, ereport, errcode(), errmsg(), ERROR, get_object_address_opcf(), get_object_address_type(), getObjectDescription(), HeapTupleGetOid, HeapTupleIsValid, i, Int16GetDatum, InvalidOid, lfirst_node, linitial, list_copy(), list_length(), list_truncate(), llast, lsecond, OBJECT_AMOP, OBJECT_AMPROC, OBJECT_OPFAMILY, OBJECT_TYPE, ObjectAddressSet, ObjectAddress::objectId, ObjectIdGetDatum, ReleaseSysCache(), SearchSysCache4(), strVal, and TypeNameToString().

Referenced by get_object_address().

1573 {
1574  ObjectAddress famaddr;
1575  ObjectAddress address;
1576  ListCell *cell;
1577  List *copy;
1578  TypeName *typenames[2];
1579  Oid typeoids[2];
1580  int membernum;
1581  int i;
1582 
1583  /*
1584  * The last element of the object list contains the strategy or procedure
1585  * number. We need to strip that out before getting the opclass/family
1586  * address. The rest can be used directly by get_object_address_opcf().
1587  */
1588  membernum = atoi(strVal(llast(linitial(object))));
1589  copy = list_truncate(list_copy(linitial(object)), list_length(linitial(object)) - 1);
1590 
1591  /* no missing_ok support here */
1592  famaddr = get_object_address_opcf(OBJECT_OPFAMILY, copy, false);
1593 
1594  /* find out left/right type names and OIDs */
1595  i = 0;
1596  foreach(cell, lsecond(object))
1597  {
1598  ObjectAddress typaddr;
1599 
1600  typenames[i] = lfirst_node(TypeName, cell);
1601  typaddr = get_object_address_type(OBJECT_TYPE, typenames[i], missing_ok);
1602  typeoids[i] = typaddr.objectId;
1603  if (++i >= 2)
1604  break;
1605  }
1606 
1607  switch (objtype)
1608  {
1609  case OBJECT_AMOP:
1610  {
1611  HeapTuple tp;
1612 
1614  InvalidOid);
1615 
1617  ObjectIdGetDatum(famaddr.objectId),
1618  ObjectIdGetDatum(typeoids[0]),
1619  ObjectIdGetDatum(typeoids[1]),
1620  Int16GetDatum(membernum));
1621  if (!HeapTupleIsValid(tp))
1622  {
1623  if (!missing_ok)
1624  ereport(ERROR,
1625  (errcode(ERRCODE_UNDEFINED_OBJECT),
1626  errmsg("operator %d (%s, %s) of %s does not exist",
1627  membernum,
1628  TypeNameToString(typenames[0]),
1629  TypeNameToString(typenames[1]),
1630  getObjectDescription(&famaddr))));
1631  }
1632  else
1633  {
1634  address.objectId = HeapTupleGetOid(tp);
1635  ReleaseSysCache(tp);
1636  }
1637  }
1638  break;
1639 
1640  case OBJECT_AMPROC:
1641  {
1642  HeapTuple tp;
1643 
1645  InvalidOid);
1646 
1648  ObjectIdGetDatum(famaddr.objectId),
1649  ObjectIdGetDatum(typeoids[0]),
1650  ObjectIdGetDatum(typeoids[1]),
1651  Int16GetDatum(membernum));
1652  if (!HeapTupleIsValid(tp))
1653  {
1654  if (!missing_ok)
1655  ereport(ERROR,
1656  (errcode(ERRCODE_UNDEFINED_OBJECT),
1657  errmsg("function %d (%s, %s) of %s does not exist",
1658  membernum,
1659  TypeNameToString(typenames[0]),
1660  TypeNameToString(typenames[1]),
1661  getObjectDescription(&famaddr))));
1662  }
1663  else
1664  {
1665  address.objectId = HeapTupleGetOid(tp);
1666  ReleaseSysCache(tp);
1667  }
1668  }
1669  break;
1670  default:
1671  elog(ERROR, "unrecognized objtype: %d", (int) objtype);
1672  }
1673 
1674  return address;
1675 }
char * TypeNameToString(const TypeName *typeName)
Definition: parse_type.c:459
#define llast(l)
Definition: pg_list.h:131
#define Int16GetDatum(X)
Definition: postgres.h:457
List * list_truncate(List *list, int new_size)
Definition: list.c:350
List * list_copy(const List *oldlist)
Definition: list.c:1160
#define strVal(v)
Definition: value.h:54
int errcode(int sqlerrcode)
Definition: elog.c:575
unsigned int Oid
Definition: postgres_ext.h:31
#define lsecond(l)
Definition: pg_list.h:116
char * getObjectDescription(const ObjectAddress *object)
#define AccessMethodOperatorRelationId
Definition: pg_amop.h:54
#define linitial(l)
Definition: pg_list.h:111
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
#define lfirst_node(type, lc)
Definition: pg_list.h:109
static ObjectAddress get_object_address_type(ObjectType objtype, TypeName *typename, bool missing_ok)
static ObjectAddress get_object_address_opcf(ObjectType objtype, List *object, bool missing_ok)
HeapTuple SearchSysCache4(int cacheId, Datum key1, Datum key2, Datum key3, Datum key4)
Definition: syscache.c:1145
#define ereport(elevel, rest)
Definition: elog.h:122
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
#define InvalidOid
Definition: postgres_ext.h:36
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
static int list_length(const List *l)
Definition: pg_list.h:89
#define ObjectAddressSet(addr, class_id, object_id)
Definition: objectaddress.h:40
int errmsg(const char *fmt,...)
Definition: elog.c:797
int i
#define elog
Definition: elog.h:219
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:700
#define AccessMethodProcedureRelationId
Definition: pg_amproc.h:43
Definition: pg_list.h:45

◆ get_object_address_publication_rel()

static ObjectAddress get_object_address_publication_rel ( List object,
Relation relp,
bool  missing_ok 
)
static

Definition at line 1752 of file objectaddress.c.

References AccessShareLock, ereport, errcode(), errmsg(), ERROR, GetPublicationByName(), GetSysCacheOid2, InvalidOid, linitial, lsecond, makeRangeVarFromNameList(), ObjectAddressSet, ObjectAddress::objectId, ObjectIdGetDatum, Publication::oid, OidIsValid, PUBLICATIONRELMAP, PublicationRelRelationId, relation_close(), relation_openrv_extended(), RelationGetRelationName, RelationGetRelid, and strVal.

Referenced by get_object_address().

1754 {
1755  ObjectAddress address;
1756  Relation relation;
1757  List *relname;
1758  char *pubname;
1759  Publication *pub;
1760 
1762 
1763  relname = linitial(object);
1765  AccessShareLock, missing_ok);
1766  if (!relation)
1767  return address;
1768 
1769  /* fetch publication name from input list */
1770  pubname = strVal(lsecond(object));
1771 
1772  /* Now look up the pg_publication tuple */
1773  pub = GetPublicationByName(pubname, missing_ok);
1774  if (!pub)
1775  {
1776  relation_close(relation, AccessShareLock);
1777  return address;
1778  }
1779 
1780  /* Find the publication relation mapping in syscache. */
1781  address.objectId =
1784  ObjectIdGetDatum(pub->oid));
1785  if (!OidIsValid(address.objectId))
1786  {
1787  if (!missing_ok)
1788  ereport(ERROR,
1789  (errcode(ERRCODE_UNDEFINED_OBJECT),
1790  errmsg("publication relation \"%s\" in publication \"%s\" does not exist",
1791  RelationGetRelationName(relation), pubname)));
1792  relation_close(relation, AccessShareLock);
1793  return address;
1794  }
1795 
1796  *relp = relation;
1797  return address;
1798 }
#define AccessShareLock
Definition: lockdefs.h:36
#define strVal(v)
Definition: value.h:54
int errcode(int sqlerrcode)
Definition: elog.c:575
void relation_close(Relation relation, LOCKMODE lockmode)
Definition: heapam.c:1266
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:3023
#define OidIsValid(objectId)
Definition: c.h:586
Publication * GetPublicationByName(const char *pubname, bool missing_ok)
#define lsecond(l)
Definition: pg_list.h:116
#define GetSysCacheOid2(cacheId, key1, key2)
Definition: syscache.h:193
#define PublicationRelRelationId
#define linitial(l)
Definition: pg_list.h:111
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
#define RelationGetRelationName(relation)
Definition: rel.h:445
#define ereport(elevel, rest)
Definition: elog.h:122
#define InvalidOid
Definition: postgres_ext.h:36
#define ObjectAddressSet(addr, class_id, object_id)
Definition: objectaddress.h:40
int errmsg(const char *fmt,...)
Definition: elog.c:797
Definition: pg_list.h:45
#define RelationGetRelid(relation)
Definition: rel.h:425
Relation relation_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: heapam.c:1233

◆ get_object_address_relobject()

static ObjectAddress get_object_address_relobject ( ObjectType  objtype,
List object,
Relation relp,
bool  missing_ok 
)
static

Definition at line 1282 of file objectaddress.c.

References AccessShareLock, ObjectAddress::classId, ConstraintRelationId, elog, ereport, errcode(), errmsg(), ERROR, get_relation_constraint_oid(), get_relation_policy_oid(), get_rewrite_oid(), get_trigger_oid(), heap_close, heap_openrv_extended(), InvalidOid, list_copy(), list_length(), list_truncate(), llast, makeRangeVarFromNameList(), OBJECT_POLICY, OBJECT_RULE, OBJECT_TABCONSTRAINT, OBJECT_TRIGGER, ObjectAddress::objectId, ObjectAddress::objectSubId, OidIsValid, PolicyRelationId, RelationGetRelid, RewriteRelationId, strVal, and TriggerRelationId.

Referenced by get_object_address().

1284 {
1285  ObjectAddress address;
1286  Relation relation = NULL;
1287  int nnames;
1288  const char *depname;
1289  List *relname;
1290  Oid reloid;
1291 
1292  /* Extract name of dependent object. */
1293  depname = strVal(llast(object));
1294 
1295  /* Separate relation name from dependent object name. */
1296  nnames = list_length(object);
1297  if (nnames < 2)
1298  ereport(ERROR,
1299  (errcode(ERRCODE_SYNTAX_ERROR),
1300  errmsg("must specify relation and object name")));
1301 
1302  /* Extract relation name and open relation. */
1303  relname = list_truncate(list_copy(object), nnames - 1);
1304  relation = heap_openrv_extended(makeRangeVarFromNameList(relname),
1306  missing_ok);
1307 
1308  reloid = relation ? RelationGetRelid(relation) : InvalidOid;
1309 
1310  switch (objtype)
1311  {
1312  case OBJECT_RULE:
1313  address.classId = RewriteRelationId;
1314  address.objectId = relation ?
1315  get_rewrite_oid(reloid, depname, missing_ok) : InvalidOid;
1316  address.objectSubId = 0;
1317  break;
1318  case OBJECT_TRIGGER:
1319  address.classId = TriggerRelationId;
1320  address.objectId = relation ?
1321  get_trigger_oid(reloid, depname, missing_ok) : InvalidOid;
1322  address.objectSubId = 0;
1323  break;
1324  case OBJECT_TABCONSTRAINT:
1325  address.classId = ConstraintRelationId;
1326  address.objectId = relation ?
1327  get_relation_constraint_oid(reloid, depname, missing_ok) :
1328  InvalidOid;
1329  address.objectSubId = 0;
1330  break;
1331  case OBJECT_POLICY:
1332  address.classId = PolicyRelationId;
1333  address.objectId = relation ?
1334  get_relation_policy_oid(reloid, depname, missing_ok) :
1335  InvalidOid;
1336  address.objectSubId = 0;
1337  break;
1338  default:
1339  elog(ERROR, "unrecognized objtype: %d", (int) objtype);
1340  }
1341 
1342  /* Avoid relcache leak when object not found. */
1343  if (!OidIsValid(address.objectId))
1344  {
1345  if (relation != NULL)
1346  heap_close(relation, AccessShareLock);
1347 
1348  relation = NULL; /* department of accident prevention */
1349  return address;
1350  }
1351 
1352  /* Done. */
1353  *relp = relation;
1354  return address;
1355 }
Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok)
#define llast(l)
Definition: pg_list.h:131
List * list_truncate(List *list, int new_size)
Definition: list.c:350
#define AccessShareLock
Definition: lockdefs.h:36
List * list_copy(const List *oldlist)
Definition: list.c:1160
#define strVal(v)
Definition: value.h:54
int errcode(int sqlerrcode)
Definition: elog.c:575
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:3023
#define heap_close(r, l)
Definition: heapam.h:97
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:586
Relation heap_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: heapam.c:1347
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
#define InvalidOid
Definition: postgres_ext.h:36
#define PolicyRelationId
Definition: pg_policy.h:19
#define RewriteRelationId
Definition: pg_rewrite.h:32
Oid get_relation_policy_oid(Oid relid, const char *policy_name, bool missing_ok)
Definition: policy.c:1311
#define TriggerRelationId
Definition: pg_trigger.h:34
static int list_length(const List *l)
Definition: pg_list.h:89
Oid get_trigger_oid(Oid relid, const char *trigname, bool missing_ok)
Definition: trigger.c:1353
Oid get_rewrite_oid(Oid relid, const char *rulename, bool missing_ok)
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define ConstraintRelationId
Definition: pg_constraint.h:29
#define elog
Definition: elog.h:219
Definition: pg_list.h:45
#define RelationGetRelid(relation)
Definition: rel.h:425

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

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

Referenced by ExecAlterObjectDependsStmt().

1096 {
1097  if (rel)
1098  {
1099  object = lcons(makeString(rel->relname), object);
1100  if (rel->schemaname)
1101  object = lcons(makeString(rel->schemaname), object);
1102  if (rel->catalogname)
1103  object = lcons(makeString(rel->catalogname), object);
1104  }
1105 
1106  return get_object_address(objtype, (Node *) object,
1107  relp, lockmode, missing_ok);
1108 }
Value * makeString(char *str)
Definition: value.c:53
Definition: nodes.h:512
char * schemaname
Definition: primnodes.h:67
char * relname
Definition: primnodes.h:68
List * lcons(void *datum, List *list)
Definition: list.c:259
ObjectAddress get_object_address(ObjectType objtype, Node *object, Relation *relp, LOCKMODE lockmode, bool missing_ok)
char * catalogname
Definition: primnodes.h:66

◆ get_object_address_type()

static ObjectAddress get_object_address_type ( ObjectType  objtype,
TypeName typename,
bool  missing_ok 
)
static

Definition at line 1494 of file objectaddress.c.

References ObjectAddress::classId, ereport, errcode(), errmsg(), ERROR, GETSTRUCT, HeapTupleIsValid, InvalidOid, LookupTypeName(), OBJECT_DOMAIN, ObjectAddress::objectId, ObjectAddress::objectSubId, ReleaseSysCache(), TypeNameToString(), TypeRelationId, typeTypeId(), and TYPTYPE_DOMAIN.

Referenced by get_object_address(), and get_object_address_opf_member().

1495 {
1496  ObjectAddress address;
1497  Type tup;
1498 
1499  address.classId = TypeRelationId;
1500  address.objectId = InvalidOid;
1501  address.objectSubId = 0;
1502 
1503  tup = LookupTypeName(NULL, typename, NULL, missing_ok);
1504  if (!HeapTupleIsValid(tup))
1505  {
1506  if (!missing_ok)
1507  ereport(ERROR,
1508  (errcode(ERRCODE_UNDEFINED_OBJECT),
1509  errmsg("type \"%s\" does not exist",
1510  TypeNameToString(typename))));
1511  return address;
1512  }
1513  address.objectId = typeTypeId(tup);
1514 
1515  if (objtype == OBJECT_DOMAIN)
1516  {
1517  if (((Form_pg_type) GETSTRUCT(tup))->typtype != TYPTYPE_DOMAIN)
1518  ereport(ERROR,
1519  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1520  errmsg("\"%s\" is not a domain",
1521  TypeNameToString(typename))));
1522  }
1523 
1524  ReleaseSysCache(tup);
1525 
1526  return address;
1527 }
Type LookupTypeName(ParseState *pstate, const TypeName *typeName, int32 *typmod_p, bool missing_ok)
Definition: parse_type.c:57
#define TYPTYPE_DOMAIN
Definition: pg_type.h:722
#define GETSTRUCT(TUP)
Definition: htup_details.h:661
char * TypeNameToString(const TypeName *typeName)
Definition: parse_type.c:459
int errcode(int sqlerrcode)
Definition: elog.c:575
FormData_pg_type * Form_pg_type
Definition: pg_type.h:233
#define TypeRelationId
Definition: pg_type.h:34
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:122
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
#define InvalidOid
Definition: postgres_ext.h:36
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
int errmsg(const char *fmt,...)
Definition: elog.c:797
Oid typeTypeId(Type tp)
Definition: parse_type.c:571

◆ get_object_address_unqualified()

static ObjectAddress get_object_address_unqualified ( ObjectType  objtype,
Value strval,
bool  missing_ok 
)
static

Definition at line 1115 of file objectaddress.c.

References AccessMethodRelationId, AuthIdRelationId, ObjectAddress::classId, DatabaseRelationId, elog, ERROR, EventTriggerRelationId, ExtensionRelationId, ForeignDataWrapperRelationId, ForeignServerRelationId, get_am_oid(), get_database_oid(), get_event_trigger_oid(), get_extension_oid(), get_foreign_data_wrapper_oid(), get_foreign_server_oid(), get_language_oid(), get_namespace_oid(), get_publication_oid(), get_role_oid(), get_subscription_oid(), get_tablespace_oid(), InvalidOid, LanguageRelationId, name, NamespaceRelationId, OBJECT_ACCESS_METHOD, OBJECT_DATABASE, OBJECT_EVENT_TRIGGER, OBJECT_EXTENSION, OBJECT_FDW, OBJECT_FOREIGN_SERVER, OBJECT_LANGUAGE, OBJECT_PUBLICATION, OBJECT_ROLE, OBJECT_SCHEMA, OBJECT_SUBSCRIPTION, OBJECT_TABLESPACE, ObjectAddress::objectId, ObjectAddress::objectSubId, PublicationRelationId, strVal, SubscriptionRelationId, and TableSpaceRelationId.

Referenced by get_object_address().

1117 {
1118  const char *name;
1119  ObjectAddress address;
1120 
1121  name = strVal(strval);
1122 
1123  /* Translate name to OID. */
1124  switch (objtype)
1125  {
1126  case OBJECT_ACCESS_METHOD:
1127  address.classId = AccessMethodRelationId;
1128  address.objectId = get_am_oid(name, missing_ok);
1129  address.objectSubId = 0;
1130  break;
1131  case OBJECT_DATABASE:
1132  address.classId = DatabaseRelationId;
1133  address.objectId = get_database_oid(name, missing_ok);
1134  address.objectSubId = 0;
1135  break;
1136  case OBJECT_EXTENSION:
1137  address.classId = ExtensionRelationId;
1138  address.objectId = get_extension_oid(name, missing_ok);
1139  address.objectSubId = 0;
1140  break;
1141  case OBJECT_TABLESPACE:
1142  address.classId = TableSpaceRelationId;
1143  address.objectId = get_tablespace_oid(name, missing_ok);
1144  address.objectSubId = 0;
1145  break;
1146  case OBJECT_ROLE:
1147  address.classId = AuthIdRelationId;
1148  address.objectId = get_role_oid(name, missing_ok);
1149  address.objectSubId = 0;
1150  break;
1151  case OBJECT_SCHEMA:
1152  address.classId = NamespaceRelationId;
1153  address.objectId = get_namespace_oid(name, missing_ok);
1154  address.objectSubId = 0;
1155  break;
1156  case OBJECT_LANGUAGE:
1157  address.classId = LanguageRelationId;
1158  address.objectId = get_language_oid(name, missing_ok);
1159  address.objectSubId = 0;
1160  break;
1161  case OBJECT_FDW:
1163  address.objectId = get_foreign_data_wrapper_oid(name, missing_ok);
1164  address.objectSubId = 0;
1165  break;
1166  case OBJECT_FOREIGN_SERVER:
1167  address.classId = ForeignServerRelationId;
1168  address.objectId = get_foreign_server_oid(name, missing_ok);
1169  address.objectSubId = 0;
1170  break;
1171  case OBJECT_EVENT_TRIGGER:
1172  address.classId = EventTriggerRelationId;
1173  address.objectId = get_event_trigger_oid(name, missing_ok);
1174  address.objectSubId = 0;
1175  break;
1176  case OBJECT_PUBLICATION:
1177  address.classId = PublicationRelationId;
1178  address.objectId = get_publication_oid(name, missing_ok);
1179  address.objectSubId = 0;
1180  break;
1181  case OBJECT_SUBSCRIPTION:
1182  address.classId = SubscriptionRelationId;
1183  address.objectId = get_subscription_oid(name, missing_ok);
1184  address.objectSubId = 0;
1185  break;
1186  default:
1187  elog(ERROR, "unrecognized objtype: %d", (int) objtype);
1188  /* placate compiler, which doesn't know elog won't return */
1189  address.classId = InvalidOid;
1190  address.objectId = InvalidOid;
1191  address.objectSubId = 0;
1192  }
1193 
1194  return address;
1195 }
Oid get_tablespace_oid(const char *tablespacename, bool missing_ok)
Definition: tablespace.c:1380
#define NamespaceRelationId
Definition: pg_namespace.h:34
Oid get_namespace_oid(const char *nspname, bool missing_ok)
Definition: namespace.c:3005
Oid get_am_oid(const char *amname, bool missing_ok)
Definition: amcmds.c:193
#define DatabaseRelationId
Definition: pg_database.h:29
Oid get_language_oid(const char *langname, bool missing_ok)
Definition: proclang.c:553
#define strVal(v)
Definition: value.h:54
#define PublicationRelationId
Oid get_event_trigger_oid(const char *trigname, bool missing_ok)
Oid get_role_oid(const char *rolname, bool missing_ok)
Definition: acl.c:5116
#define AuthIdRelationId
Definition: pg_authid.h:42
Oid get_foreign_data_wrapper_oid(const char *fdwname, bool missing_ok)
Definition: foreign.c:659
#define ERROR
Definition: elog.h:43
#define SubscriptionRelationId
#define AccessMethodRelationId
Definition: pg_am.h:32
#define InvalidOid
Definition: postgres_ext.h:36
Oid get_database_oid(const char *dbname, bool missing_ok)
Definition: dbcommands.c:2009
#define ForeignServerRelationId
Oid get_subscription_oid(const char *subname, bool missing_ok)
#define EventTriggerRelationId
#define ForeignDataWrapperRelationId
const char * name
Definition: encode.c:521
#define TableSpaceRelationId
Definition: pg_tablespace.h:29
Oid get_extension_oid(const char *extname, bool missing_ok)
Definition: extension.c:135
Oid get_publication_oid(const char *pubname, bool missing_ok)
#define LanguageRelationId
Definition: pg_language.h:29
#define elog
Definition: elog.h:219
#define ExtensionRelationId
Definition: pg_extension.h:29
Oid get_foreign_server_oid(const char *servername, bool missing_ok)
Definition: foreign.c:680

◆ get_object_address_usermapping()

static ObjectAddress get_object_address_usermapping ( List object,
bool  missing_ok 
)
static

Definition at line 1681 of file objectaddress.c.

References AUTHNAME, CStringGetDatum, ereport, errcode(), errmsg(), ERROR, GetForeignServerByName(), HeapTupleGetOid, HeapTupleIsValid, InvalidOid, linitial, lsecond, ObjectAddressSet, ObjectAddress::objectId, ObjectIdGetDatum, ReleaseSysCache(), SearchSysCache1(), SearchSysCache2(), ForeignServer::serverid, strVal, UserMappingRelationId, and username.

Referenced by get_object_address().

1682 {
1683  ObjectAddress address;
1684  Oid userid;
1685  char *username;
1686  char *servername;
1687  ForeignServer *server;
1688  HeapTuple tp;
1689 
1691 
1692  /* fetch string names from input lists, for error messages */
1693  username = strVal(linitial(object));
1694  servername = strVal(lsecond(object));
1695 
1696  /* look up pg_authid OID of mapped user; InvalidOid if PUBLIC */
1697  if (strcmp(username, "public") == 0)
1698  userid = InvalidOid;
1699  else
1700  {
1702  CStringGetDatum(username));
1703  if (!HeapTupleIsValid(tp))
1704  {
1705  if (!missing_ok)
1706  ereport(ERROR,
1707  (errcode(ERRCODE_UNDEFINED_OBJECT),
1708  errmsg("user mapping for user \"%s\" on server \"%s\" does not exist",
1709  username, servername)));
1710  return address;
1711  }
1712  userid = HeapTupleGetOid(tp);
1713  ReleaseSysCache(tp);
1714  }
1715 
1716  /* Now look up the pg_user_mapping tuple */
1717  server = GetForeignServerByName(servername, true);
1718  if (!server)
1719  {
1720  if (!missing_ok)
1721  ereport(ERROR,
1722  (errcode(ERRCODE_UNDEFINED_OBJECT),
1723  errmsg("server \"%s\" does not exist", servername)));
1724  return address;
1725  }
1726  tp = SearchSysCache2(USERMAPPINGUSERSERVER,
1727  ObjectIdGetDatum(userid),
1728  ObjectIdGetDatum(server->serverid));
1729  if (!HeapTupleIsValid(tp))
1730  {
1731  if (!missing_ok)
1732  ereport(ERROR,
1733  (errcode(ERRCODE_UNDEFINED_OBJECT),
1734  errmsg("user mapping for user \"%s\" on server \"%s\" does not exist",
1735  username, servername)));
1736  return address;
1737  }
1738 
1739  address.objectId = HeapTupleGetOid(tp);
1740 
1741  ReleaseSysCache(tp);
1742 
1743  return address;
1744 }
#define strVal(v)
Definition: value.h:54
int errcode(int sqlerrcode)
Definition: elog.c:575
unsigned int Oid
Definition: postgres_ext.h:31
#define lsecond(l)
Definition: pg_list.h:116
#define linitial(l)
Definition: pg_list.h:111
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
#define CStringGetDatum(X)
Definition: postgres.h:584
ForeignServer * GetForeignServerByName(const char *srvname, bool missing_ok)
Definition: foreign.c:148
#define ereport(elevel, rest)
Definition: elog.h:122
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
static char * username
Definition: initdb.c:132
#define InvalidOid
Definition: postgres_ext.h:36
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
Definition: syscache.c:1123
#define ObjectAddressSet(addr, class_id, object_id)
Definition: objectaddress.h:40
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define UserMappingRelationId
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:700
Oid serverid
Definition: foreign.h:47

◆ get_object_attnum_acl()

AttrNumber get_object_attnum_acl ( Oid  class_id)

Definition at line 2535 of file objectaddress.c.

References ObjectPropertyType::attnum_acl, and get_object_property_data().

Referenced by AlterObjectOwner_internal().

2536 {
2537  const ObjectPropertyType *prop = get_object_property_data(class_id);
2538 
2539  return prop->attnum_acl;
2540 }
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 2511 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().

2512 {
2513  const ObjectPropertyType *prop = get_object_property_data(class_id);
2514 
2515  return prop->attnum_name;
2516 }
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 2519 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().

2520 {
2521  const ObjectPropertyType *prop = get_object_property_data(class_id);
2522 
2523  return prop->attnum_namespace;
2524 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AttrNumber attnum_namespace

◆ get_object_attnum_owner()

AttrNumber get_object_attnum_owner ( Oid  class_id)

Definition at line 2527 of file objectaddress.c.

References ObjectPropertyType::attnum_owner, and get_object_property_data().

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

2528 {
2529  const ObjectPropertyType *prop = get_object_property_data(class_id);
2530 
2531  return prop->attnum_owner;
2532 }
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 2503 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::name_catcache_id.

Referenced by AlterObjectNamespace_internal(), and AlterObjectRename_internal().

2504 {
2505  const ObjectPropertyType *prop = get_object_property_data(class_id);
2506 
2507  return prop->name_catcache_id;
2508 }
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 2495 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::oid_catcache_id.

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

2496 {
2497  const ObjectPropertyType *prop = get_object_property_data(class_id);
2498 
2499  return prop->oid_catcache_id;
2500 }
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 2551 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::is_nsp_name_unique.

Referenced by EventTriggerSQLDropAddObject(), and pg_identify_object().

2552 {
2553  const ObjectPropertyType *prop = get_object_property_data(class_id);
2554 
2555  return prop->is_nsp_name_unique;
2556 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_namespace()

Oid get_object_namespace ( const ObjectAddress address)

Definition at line 2428 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().

2429 {
2430  int cache;
2431  HeapTuple tuple;
2432  bool isnull;
2433  Oid oid;
2434  const ObjectPropertyType *property;
2435 
2436  /* If not owned by a namespace, just return InvalidOid. */
2437  property = get_object_property_data(address->classId);
2438  if (property->attnum_namespace == InvalidAttrNumber)
2439  return InvalidOid;
2440 
2441  /* Currently, we can only handle object types with system caches. */
2442  cache = property->oid_catcache_id;
2443  Assert(cache != -1);
2444 
2445  /* Fetch tuple from syscache and extract namespace attribute. */
2446  tuple = SearchSysCache1(cache, ObjectIdGetDatum(address->objectId));
2447  if (!HeapTupleIsValid(tuple))
2448  elog(ERROR, "cache lookup failed for cache %d oid %u",
2449  cache, address->objectId);
2450  oid = DatumGetObjectId(SysCacheGetAttr(cache,
2451  tuple,
2452  property->attnum_namespace,
2453  &isnull));
2454  Assert(!isnull);
2455  ReleaseSysCache(tuple);
2456 
2457  return oid;
2458 }
#define DatumGetObjectId(X)
Definition: postgres.h:506
unsigned int Oid
Definition: postgres_ext.h:31
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
static const ObjectPropertyType * get_object_property_data(Oid class_id)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition: syscache.c:1368
#define InvalidOid
Definition: postgres_ext.h:36
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define Assert(condition)
Definition: c.h:680
AttrNumber attnum_namespace
#define InvalidAttrNumber
Definition: attnum.h:23
#define elog
Definition: elog.h:219

◆ get_object_oid_index()

Oid get_object_oid_index ( Oid  class_id)

Definition at line 2487 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::oid_index_oid.

Referenced by get_catalog_object_by_oid().

2488 {
2489  const ObjectPropertyType *prop = get_object_property_data(class_id);
2490 
2491  return prop->oid_index_oid;
2492 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)

◆ get_object_property_data()

static const ObjectPropertyType * get_object_property_data ( Oid  class_id)
static

Definition at line 2580 of file objectaddress.c.

References ObjectPropertyType::class_oid, ereport, errmsg_internal(), ERROR, and lengthof.

Referenced by get_object_aclkind(), get_object_attnum_acl(), get_object_attnum_name(), get_object_attnum_namespace(), get_object_attnum_owner(), get_object_catcache_name(), get_object_catcache_oid(), get_object_namensp_unique(), get_object_namespace(), and get_object_oid_index().

2581 {
2582  static const ObjectPropertyType *prop_last = NULL;
2583  int index;
2584 
2585  /*
2586  * A shortcut to speed up multiple consecutive lookups of a particular
2587  * object class.
2588  */
2589  if (prop_last && prop_last->class_oid == class_id)
2590  return prop_last;
2591 
2592  for (index = 0; index < lengthof(ObjectProperty); index++)
2593  {
2594  if (ObjectProperty[index].class_oid == class_id)
2595  {
2596  prop_last = &ObjectProperty[index];
2597  return &ObjectProperty[index];
2598  }
2599  }
2600 
2601  ereport(ERROR,
2602  (errmsg_internal("unrecognized class ID: %u", class_id)));
2603 
2604  return NULL; /* keep MSC compiler happy */
2605 }
#define lengthof(array)
Definition: c.h:610
Definition: type.h:89
#define ERROR
Definition: elog.h:43
static const ObjectPropertyType ObjectProperty[]
#define ereport(elevel, rest)
Definition: elog.h:122
int errmsg_internal(const char *fmt,...)
Definition: elog.c:827

◆ get_relation_by_qualified_name()

static ObjectAddress get_relation_by_qualified_name ( ObjectType  objtype,
List object,
Relation relp,
LOCKMODE  lockmode,
bool  missing_ok 
)
static

Definition at line 1201 of file objectaddress.c.

References ObjectAddress::classId, elog, ereport, errcode(), errmsg(), ERROR, InvalidOid, makeRangeVarFromNameList(), OBJECT_FOREIGN_TABLE, OBJECT_INDEX, OBJECT_MATVIEW, OBJECT_SEQUENCE, OBJECT_TABLE, OBJECT_VIEW, ObjectAddress::objectId, ObjectAddress::objectSubId, RelationData::rd_rel, relation_openrv_extended(), RelationGetRelationName, RelationGetRelid, RelationRelationId, RELKIND_FOREIGN_TABLE, RELKIND_INDEX, RELKIND_MATVIEW, RELKIND_PARTITIONED_TABLE, RELKIND_RELATION, RELKIND_SEQUENCE, and RELKIND_VIEW.

Referenced by get_object_address().

1204 {
1205  Relation relation;
1206  ObjectAddress address;
1207 
1208  address.classId = RelationRelationId;
1209  address.objectId = InvalidOid;
1210  address.objectSubId = 0;
1211 
1213  lockmode, missing_ok);
1214  if (!relation)
1215  return address;
1216 
1217  switch (objtype)
1218  {
1219  case OBJECT_INDEX:
1220  if (relation->rd_rel->relkind != RELKIND_INDEX)
1221  ereport(ERROR,
1222  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1223  errmsg("\"%s\" is not an index",
1224  RelationGetRelationName(relation))));
1225  break;
1226  case OBJECT_SEQUENCE:
1227  if (relation->rd_rel->relkind != RELKIND_SEQUENCE)
1228  ereport(ERROR,
1229  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1230  errmsg("\"%s\" is not a sequence",
1231  RelationGetRelationName(relation))));
1232  break;
1233  case OBJECT_TABLE:
1234  if (relation->rd_rel->relkind != RELKIND_RELATION &&
1235  relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
1236  ereport(ERROR,
1237  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1238  errmsg("\"%s\" is not a table",
1239  RelationGetRelationName(relation))));
1240  break;
1241  case OBJECT_VIEW:
1242  if (relation->rd_rel->relkind != RELKIND_VIEW)
1243  ereport(ERROR,
1244  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1245  errmsg("\"%s\" is not a view",
1246  RelationGetRelationName(relation))));
1247  break;
1248  case OBJECT_MATVIEW:
1249  if (relation->rd_rel->relkind != RELKIND_MATVIEW)
1250  ereport(ERROR,
1251  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1252  errmsg("\"%s\" is not a materialized view",
1253  RelationGetRelationName(relation))));
1254  break;
1255  case OBJECT_FOREIGN_TABLE:
1256  if (relation->rd_rel->relkind != RELKIND_FOREIGN_TABLE)
1257  ereport(ERROR,
1258  (errcode(ERRCODE_WRONG_OBJECT_TYPE),
1259  errmsg("\"%s\" is not a foreign table",
1260  RelationGetRelationName(relation))));
1261  break;
1262  default:
1263  elog(ERROR, "unrecognized objtype: %d", (int) objtype);
1264  break;
1265  }
1266 
1267  /* Done. */
1268  address.objectId = RelationGetRelid(relation);
1269  *relp = relation;
1270 
1271  return address;
1272 }
#define RelationRelationId
Definition: pg_class.h:29
#define RELKIND_MATVIEW
Definition: pg_class.h:165
int errcode(int sqlerrcode)
Definition: elog.c:575
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:3023
Form_pg_class rd_rel
Definition: rel.h:114
#define ERROR
Definition: elog.h:43
#define RelationGetRelationName(relation)
Definition: rel.h:445
#define RELKIND_FOREIGN_TABLE
Definition: pg_class.h:167
#define ereport(elevel, rest)
Definition: elog.h:122
#define RELKIND_PARTITIONED_TABLE
Definition: pg_class.h:168
#define InvalidOid
Definition: postgres_ext.h:36
int errmsg(const char *fmt,...)
Definition: elog.c:797
#define RELKIND_VIEW
Definition: pg_class.h:164
#define RELKIND_INDEX
Definition: pg_class.h:161
#define elog
Definition: elog.h:219
#define RELKIND_RELATION
Definition: pg_class.h:160
#define RELKIND_SEQUENCE
Definition: pg_class.h:162
#define RelationGetRelid(relation)
Definition: rel.h:425
Relation relation_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: heapam.c:1233

◆ getConstraintTypeDescription()

static void getConstraintTypeDescription ( StringInfo  buffer,
Oid  constroid 
)
static

Definition at line 3996 of file objectaddress.c.

References AccessShareLock, appendStringInfoString(), ConstraintRelationId, elog, ERROR, get_catalog_object_by_oid(), GETSTRUCT, heap_close, heap_open(), HeapTupleGetOid, HeapTupleIsValid, and OidIsValid.

Referenced by getObjectTypeDescription().

3997 {
3998  Relation constrRel;
3999  HeapTuple constrTup;
4000  Form_pg_constraint constrForm;
4001 
4003  constrTup = get_catalog_object_by_oid(constrRel, constroid);
4004  if (!HeapTupleIsValid(constrTup))
4005  elog(ERROR, "cache lookup failed for constraint %u", constroid);
4006 
4007  constrForm = (Form_pg_constraint) GETSTRUCT(constrTup);
4008 
4009  if (OidIsValid(constrForm->conrelid))
4010  appendStringInfoString(buffer, "table constraint");
4011  else if (OidIsValid(constrForm->contypid))
4012  appendStringInfoString(buffer, "domain constraint");
4013  else
4014  elog(ERROR, "invalid constraint %u", HeapTupleGetOid(constrTup));
4015 
4016  heap_close(constrRel, AccessShareLock);
4017 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:661
#define AccessShareLock
Definition: lockdefs.h:36
#define heap_close(r, l)
Definition: heapam.h:97
#define OidIsValid(objectId)
Definition: c.h:586
#define ERROR
Definition: elog.h:43
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:157
Relation heap_open(Oid relationId, LOCKMODE lockmode)
Definition: heapam.c:1290
FormData_pg_constraint * Form_pg_constraint
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
HeapTuple get_catalog_object_by_oid(Relation catalog, Oid objectId)
#define ConstraintRelationId
Definition: pg_constraint.h:29
#define elog
Definition: elog.h:219
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:700

◆ getObjectDescription()

char* getObjectDescription ( const ObjectAddress object)

Definition at line 2662 of file objectaddress.c.

References _, AccessMethodOperatorOidIndexId, AccessMethodOperatorRelationId, AccessMethodProcedureOidIndexId, AccessMethodProcedureRelationId, AccessShareLock, AMOID, appendStringInfo(), AttrDefaultOidIndexId, AttrDefaultRelationId, BTEqualStrategyNumber, buffer, CastOidIndexId, CastRelationId, CLAOID, ObjectAddress::classId, COLLOID, CONSTROID, CONVOID, StringInfoData::data, DEFACLOBJ_FUNCTION, DEFACLOBJ_NAMESPACE, DEFACLOBJ_RELATION, DEFACLOBJ_SEQUENCE, DEFACLOBJ_TYPE, DefaultAclOidIndexId, DefaultAclRelationId, elog, ERROR, EVENTTRIGGEROID, ForeignDataWrapper::fdwname, format_operator(), format_procedure(), format_type_be(), get_database_name(), get_extension_name(), get_language_name(), get_namespace_name(), get_publication_name(), get_rel_name(), get_relid_attribute_name(), get_subscription_name(), get_tablespace_name(), GetForeignDataWrapper(), GetForeignServer(), getObjectClass(), getObjectDescription(), getOpFamilyDescription(), getRelationDescription(), GETSTRUCT, GetUserNameFromId(), heap_close, heap_open(), HeapTupleIsValid, initStringInfo(), NameStr, ObjectAddress::objectId, ObjectIdAttributeNumber, 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(), PolicyOidIndexId, PolicyRelationId, PUBLICATIONREL, quote_qualified_identifier(), RelationRelationId, ReleaseSysCache(), RewriteOidIndexId, RewriteRelationId, ScanKeyInit(), SearchSysCache1(), ForeignServer::servername, STATEXTOID, systable_beginscan(), systable_endscan(), systable_getnext(), TRFOID, TriggerOidIndexId, TriggerRelationId, TSCONFIGOID, TSDICTOID, TSPARSEROID, TSTEMPLATEOID, and USERMAPPINGOID.

Referenced by AlterExtensionNamespace(), ATExecAlterColumnType(), changeDependencyFor(), 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().

2663 {
2665 
2666  initStringInfo(&buffer);
2667 
2668  switch (getObjectClass(object))
2669  {
2670  case OCLASS_CLASS:
2671  getRelationDescription(&buffer, object->objectId);
2672  if (object->objectSubId != 0)
2673  appendStringInfo(&buffer, _(" column %s"),
2675  object->objectSubId));
2676  break;
2677 
2678  case OCLASS_PROC:
2679  appendStringInfo(&buffer, _("function %s"),
2680  format_procedure(object->objectId));
2681  break;
2682 
2683  case OCLASS_TYPE:
2684  appendStringInfo(&buffer, _("type %s"),
2685  format_type_be(object->objectId));
2686  break;
2687 
2688  case OCLASS_CAST:
2689  {
2690  Relation castDesc;
2691  ScanKeyData skey[1];
2692  SysScanDesc rcscan;
2693  HeapTuple tup;
2694  Form_pg_cast castForm;
2695 
2697 
2698  ScanKeyInit(&skey[0],
2700  BTEqualStrategyNumber, F_OIDEQ,
2701  ObjectIdGetDatum(object->objectId));
2702 
2703  rcscan = systable_beginscan(castDesc, CastOidIndexId, true,
2704  NULL, 1, skey);
2705 
2706  tup = systable_getnext(rcscan);
2707 
2708  if (!HeapTupleIsValid(tup))
2709  elog(ERROR, "could not find tuple for cast %u",
2710  object->objectId);
2711 
2712  castForm = (Form_pg_cast) GETSTRUCT(tup);
2713 
2714  appendStringInfo(&buffer, _("cast from %s to %s"),
2715  format_type_be(castForm->castsource),
2716  format_type_be(castForm->casttarget));
2717 
2718  systable_endscan(rcscan);
2719  heap_close(castDesc, AccessShareLock);
2720  break;
2721  }
2722 
2723  case OCLASS_COLLATION:
2724  {
2725  HeapTuple collTup;
2726  Form_pg_collation coll;
2727 
2728  collTup = SearchSysCache1(COLLOID,
2729  ObjectIdGetDatum(object->objectId));
2730  if (!HeapTupleIsValid(collTup))
2731  elog(ERROR, "cache lookup failed for collation %u",
2732  object->objectId);
2733  coll = (Form_pg_collation) GETSTRUCT(collTup);
2734  appendStringInfo(&buffer, _("collation %s"),
2735  NameStr(coll->collname));
2736  ReleaseSysCache(collTup);
2737  break;
2738  }
2739 
2740  case OCLASS_CONSTRAINT:
2741  {
2742  HeapTuple conTup;
2743  Form_pg_constraint con;
2744 
2745  conTup = SearchSysCache1(CONSTROID,
2746  ObjectIdGetDatum(object->objectId));
2747  if (!HeapTupleIsValid(conTup))
2748  elog(ERROR, "cache lookup failed for constraint %u",
2749  object->objectId);
2750  con = (Form_pg_constraint) GETSTRUCT(conTup);
2751 
2752  if (OidIsValid(con->conrelid))
2753  {
2754  StringInfoData rel;
2755 
2756  initStringInfo(&rel);
2757  getRelationDescription(&rel, con->conrelid);
2758  appendStringInfo(&buffer, _("constraint %s on %s"),
2759  NameStr(con->conname), rel.data);
2760  pfree(rel.data);
2761  }
2762  else
2763  {
2764  appendStringInfo(&buffer, _("constraint %s"),
2765  NameStr(con->conname));
2766  }
2767 
2768  ReleaseSysCache(conTup);
2769  break;
2770  }
2771 
2772  case OCLASS_CONVERSION:
2773  {
2774  HeapTuple conTup;
2775 
2776  conTup = SearchSysCache1(CONVOID,
2777  ObjectIdGetDatum(object->objectId));
2778  if (!HeapTupleIsValid(conTup))
2779  elog(ERROR, "cache lookup failed for conversion %u",
2780  object->objectId);
2781  appendStringInfo(&buffer, _("conversion %s"),
2782  NameStr(((Form_pg_conversion) GETSTRUCT(conTup))->conname));
2783  ReleaseSysCache(conTup);
2784  break;
2785  }
2786 
2787  case OCLASS_DEFAULT:
2788  {
2789  Relation attrdefDesc;
2790  ScanKeyData skey[1];
2791  SysScanDesc adscan;
2792  HeapTuple tup;
2793  Form_pg_attrdef attrdef;
2794  ObjectAddress colobject;
2795 
2797 
2798  ScanKeyInit(&skey[0],
2800  BTEqualStrategyNumber, F_OIDEQ,
2801  ObjectIdGetDatum(object->objectId));
2802 
2803  adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndexId,
2804  true, NULL, 1, skey);
2805 
2806  tup = systable_getnext(adscan);
2807 
2808  if (!HeapTupleIsValid(tup))
2809  elog(ERROR, "could not find tuple for attrdef %u",
2810  object->objectId);
2811 
2812  attrdef = (Form_pg_attrdef) GETSTRUCT(tup);
2813 
2814  colobject.classId = RelationRelationId;
2815  colobject.objectId = attrdef->adrelid;
2816  colobject.objectSubId = attrdef->adnum;
2817 
2818  appendStringInfo(&buffer, _("default for %s"),
2819  getObjectDescription(&colobject));
2820 
2821  systable_endscan(adscan);
2822  heap_close(attrdefDesc, AccessShareLock);
2823  break;
2824  }
2825 
2826  case OCLASS_LANGUAGE:
2827  appendStringInfo(&buffer, _("language %s"),
2828  get_language_name(object->objectId, false));
2829  break;
2830 
2831  case OCLASS_LARGEOBJECT:
2832  appendStringInfo(&buffer, _("large object %u"),
2833  object->objectId);
2834  break;
2835 
2836  case OCLASS_OPERATOR:
2837  appendStringInfo(&buffer, _("operator %s"),
2838  format_operator(object->objectId));
2839  break;
2840 
2841  case OCLASS_OPCLASS:
2842  {
2843  HeapTuple opcTup;
2844  Form_pg_opclass opcForm;
2845  HeapTuple amTup;
2846  Form_pg_am amForm;
2847  char *nspname;
2848 
2849  opcTup = SearchSysCache1(CLAOID,
2850  ObjectIdGetDatum(object->objectId));
2851  if (!HeapTupleIsValid(opcTup))
2852  elog(ERROR, "cache lookup failed for opclass %u",
2853  object->objectId);
2854  opcForm = (Form_pg_opclass) GETSTRUCT(opcTup);
2855 
2856  amTup = SearchSysCache1(AMOID,
2857  ObjectIdGetDatum(opcForm->opcmethod));
2858  if (!HeapTupleIsValid(amTup))
2859  elog(ERROR, "cache lookup failed for access method %u",
2860  opcForm->opcmethod);
2861  amForm = (Form_pg_am) GETSTRUCT(amTup);
2862 
2863  /* Qualify the name if not visible in search path */
2864  if (OpclassIsVisible(object->objectId))
2865  nspname = NULL;
2866  else
2867  nspname = get_namespace_name(opcForm->opcnamespace);
2868 
2869  appendStringInfo(&buffer, _("operator class %s for access method %s"),
2871  NameStr(opcForm->opcname)),
2872  NameStr(amForm->amname));
2873 
2874  ReleaseSysCache(amTup);
2875  ReleaseSysCache(opcTup);
2876  break;
2877  }
2878 
2879  case OCLASS_OPFAMILY:
2880  getOpFamilyDescription(&buffer, object->objectId);
2881  break;
2882 
2883  case OCLASS_AM:
2884  {
2885  HeapTuple tup;
2886 
2887  tup = SearchSysCache1(AMOID,
2888  ObjectIdGetDatum(object->objectId));
2889  if (!HeapTupleIsValid(tup))
2890  elog(ERROR, "cache lookup failed for access method %u",
2891  object->objectId);
2892  appendStringInfo(&buffer, _("access method %s"),
2893  NameStr(((Form_pg_am) GETSTRUCT(tup))->amname));
2894  ReleaseSysCache(tup);
2895  break;
2896  }
2897 
2898  case OCLASS_AMOP:
2899  {
2900  Relation amopDesc;
2901  HeapTuple tup;
2902  ScanKeyData skey[1];
2903  SysScanDesc amscan;
2904  Form_pg_amop amopForm;
2905  StringInfoData opfam;
2906 
2908  AccessShareLock);
2909 
2910  ScanKeyInit(&skey[0],
2912  BTEqualStrategyNumber, F_OIDEQ,
2913  ObjectIdGetDatum(object->objectId));
2914 
2915  amscan = systable_beginscan(amopDesc, AccessMethodOperatorOidIndexId, true,
2916  NULL, 1, skey);
2917 
2918  tup = systable_getnext(amscan);
2919 
2920  if (!HeapTupleIsValid(tup))
2921  elog(ERROR, "could not find tuple for amop entry %u",
2922  object->objectId);
2923 
2924  amopForm = (Form_pg_amop) GETSTRUCT(tup);
2925 
2926  initStringInfo(&opfam);
2927  getOpFamilyDescription(&opfam, amopForm->amopfamily);
2928 
2929  /*------
2930  translator: %d is the operator strategy (a number), the
2931  first two %s's are data type names, the third %s is the
2932  description of the operator family, and the last %s is the
2933  textual form of the operator with arguments. */
2934  appendStringInfo(&buffer, _("operator %d (%s, %s) of %s: %s"),
2935  amopForm->amopstrategy,
2936  format_type_be(amopForm->amoplefttype),
2937  format_type_be(amopForm->amoprighttype),
2938  opfam.data,
2939  format_operator(amopForm->amopopr));
2940 
2941  pfree(opfam.data);
2942 
2943  systable_endscan(amscan);
2944  heap_close(amopDesc, AccessShareLock);
2945  break;
2946  }
2947 
2948  case OCLASS_AMPROC:
2949  {
2950  Relation amprocDesc;
2951  ScanKeyData skey[1];
2952  SysScanDesc amscan;
2953  HeapTuple tup;
2954  Form_pg_amproc amprocForm;
2955  StringInfoData opfam;
2956 
2958  AccessShareLock);
2959 
2960  ScanKeyInit(&skey[0],
2962  BTEqualStrategyNumber, F_OIDEQ,
2963  ObjectIdGetDatum(object->objectId));
2964 
2965  amscan = systable_beginscan(amprocDesc, AccessMethodProcedureOidIndexId, true,
2966  NULL, 1, skey);
2967 
2968  tup = systable_getnext(amscan);
2969 
2970  if (!HeapTupleIsValid(tup))
2971  elog(ERROR, "could not find tuple for amproc entry %u",
2972  object->objectId);
2973 
2974  amprocForm = (Form_pg_amproc) GETSTRUCT(tup);
2975 
2976  initStringInfo(&opfam);
2977  getOpFamilyDescription(&opfam, amprocForm->amprocfamily);
2978 
2979  /*------
2980  translator: %d is the function number, the first two %s's
2981  are data type names, the third %s is the description of the
2982  operator family, and the last %s is the textual form of the
2983  function with arguments. */
2984  appendStringInfo(&buffer, _("function %d (%s, %s) of %s: %s"),
2985  amprocForm->amprocnum,
2986  format_type_be(amprocForm->amproclefttype),
2987  format_type_be(amprocForm->amprocrighttype),
2988  opfam.data,
2989  format_procedure(amprocForm->amproc));
2990 
2991  pfree(opfam.data);
2992 
2993  systable_endscan(amscan);
2994  heap_close(amprocDesc, AccessShareLock);
2995  break;
2996  }
2997 
2998  case OCLASS_REWRITE:
2999  {
3000  Relation ruleDesc;
3001  ScanKeyData skey[1];
3002  SysScanDesc rcscan;
3003  HeapTuple tup;
3005 
3007 
3008  ScanKeyInit(&skey[0],
3010  BTEqualStrategyNumber, F_OIDEQ,
3011  ObjectIdGetDatum(object->objectId));
3012 
3013  rcscan = systable_beginscan(ruleDesc, RewriteOidIndexId, true,
3014  NULL, 1, skey);
3015 
3016  tup = systable_getnext(rcscan);
3017 
3018  if (!HeapTupleIsValid(tup))
3019  elog(ERROR, "could not find tuple for rule %u",
3020  object->objectId);
3021 
3022  rule = (Form_pg_rewrite) GETSTRUCT(tup);
3023 
3024  appendStringInfo(&buffer, _("rule %s on "),
3025  NameStr(rule->rulename));
3026  getRelationDescription(&buffer, rule->ev_class);
3027 
3028  systable_endscan(rcscan);
3029  heap_close(ruleDesc, AccessShareLock);
3030  break;
3031  }
3032 
3033  case OCLASS_TRIGGER:
3034  {
3035  Relation trigDesc;
3036  ScanKeyData skey[1];
3037  SysScanDesc tgscan;
3038  HeapTuple tup;
3039  Form_pg_trigger trig;
3040 
3042 
3043  ScanKeyInit(&skey[0],
3045  BTEqualStrategyNumber, F_OIDEQ,
3046  ObjectIdGetDatum(object->objectId));
3047 
3048  tgscan = systable_beginscan(trigDesc, TriggerOidIndexId, true,
3049  NULL, 1, skey);
3050 
3051  tup = systable_getnext(tgscan);
3052 
3053  if (!HeapTupleIsValid(tup))
3054  elog(ERROR, "could not find tuple for trigger %u",
3055  object->objectId);
3056 
3057  trig = (Form_pg_trigger) GETSTRUCT(tup);
3058 
3059  appendStringInfo(&buffer, _("trigger %s on "),
3060  NameStr(trig->tgname));
3061  getRelationDescription(&buffer, trig->tgrelid);
3062 
3063  systable_endscan(tgscan);
3064  heap_close(trigDesc, AccessShareLock);
3065  break;
3066  }
3067 
3068  case OCLASS_SCHEMA:
3069  {
3070  char *nspname;
3071 
3072  nspname = get_namespace_name(object->objectId);
3073  if (!nspname)
3074  elog(ERROR, "cache lookup failed for namespace %u",
3075  object->objectId);
3076  appendStringInfo(&buffer, _("schema %s"), nspname);
3077  break;
3078  }
3079 
3080  case OCLASS_STATISTIC_EXT:
3081  {
3082  HeapTuple stxTup;
3083  Form_pg_statistic_ext stxForm;
3084 
3085  stxTup = SearchSysCache1(STATEXTOID,
3086  ObjectIdGetDatum(object->objectId));
3087  if (!HeapTupleIsValid(stxTup))
3088  elog(ERROR, "could not find tuple for statistics object %u",
3089  object->objectId);
3090 
3091  stxForm = (Form_pg_statistic_ext) GETSTRUCT(stxTup);
3092 
3093  appendStringInfo(&buffer, _("statistics object %s"),
3094  NameStr(stxForm->stxname));
3095 
3096  ReleaseSysCache(stxTup);
3097  break;
3098  }
3099 
3100  case OCLASS_TSPARSER:
3101  {
3102  HeapTuple tup;
3103 
3105  ObjectIdGetDatum(object->objectId));
3106  if (!HeapTupleIsValid(tup))
3107  elog(ERROR, "cache lookup failed for text search parser %u",
3108  object->objectId);
3109  appendStringInfo(&buffer, _("text search parser %s"),
3110  NameStr(((Form_pg_ts_parser) GETSTRUCT(tup))->prsname));
3111  ReleaseSysCache(tup);
3112  break;
3113  }
3114 
3115  case OCLASS_TSDICT:
3116  {
3117  HeapTuple tup;
3118 
3119  tup = SearchSysCache1(TSDICTOID,
3120  ObjectIdGetDatum(object->objectId));
3121  if (!HeapTupleIsValid(tup))
3122  elog(ERROR, "cache lookup failed for text search dictionary %u",
3123  object->objectId);
3124  appendStringInfo(&buffer, _("text search dictionary %s"),
3125  NameStr(((Form_pg_ts_dict) GETSTRUCT(tup))->dictname));
3126  ReleaseSysCache(tup);
3127  break;
3128  }
3129 
3130  case OCLASS_TSTEMPLATE:
3131  {
3132  HeapTuple tup;
3133 
3135  ObjectIdGetDatum(object->objectId));
3136  if (!HeapTupleIsValid(tup))
3137  elog(ERROR, "cache lookup failed for text search template %u",
3138  object->objectId);
3139  appendStringInfo(&buffer, _("text search template %s"),
3140  NameStr(((Form_pg_ts_template) GETSTRUCT(tup))->tmplname));
3141  ReleaseSysCache(tup);
3142  break;
3143  }
3144 
3145  case OCLASS_TSCONFIG:
3146  {
3147  HeapTuple tup;
3148 
3150  ObjectIdGetDatum(object->objectId));
3151  if (!HeapTupleIsValid(tup))
3152  elog(ERROR, "cache lookup failed for text search configuration %u",
3153  object->objectId);
3154  appendStringInfo(&buffer, _("text search configuration %s"),
3155  NameStr(((Form_pg_ts_config) GETSTRUCT(tup))->cfgname));
3156  ReleaseSysCache(tup);
3157  break;
3158  }
3159 
3160  case OCLASS_ROLE:
3161  {
3162  appendStringInfo(&buffer, _("role %s"),
3163  GetUserNameFromId(object->objectId, false));
3164  break;
3165  }
3166 
3167  case OCLASS_DATABASE:
3168  {
3169  char *datname;
3170 
3171  datname = get_database_name(object->objectId);
3172  if (!datname)
3173  elog(ERROR, "cache lookup failed for database %u",
3174  object->objectId);
3175  appendStringInfo(&buffer, _("database %s"), datname);
3176  break;
3177  }
3178 
3179  case OCLASS_TBLSPACE:
3180  {
3181  char *tblspace;
3182 
3183  tblspace = get_tablespace_name(object->objectId);
3184  if (!tblspace)
3185  elog(ERROR, "cache lookup failed for tablespace %u",
3186  object->objectId);
3187  appendStringInfo(&buffer, _("tablespace %s"), tblspace);
3188  break;
3189  }
3190 
3191  case OCLASS_FDW:
3192  {
3193  ForeignDataWrapper *fdw;
3194 
3195  fdw = GetForeignDataWrapper(object->objectId);
3196  appendStringInfo(&buffer, _("foreign-data wrapper %s"), fdw->fdwname);
3197  break;
3198  }
3199 
3200  case OCLASS_FOREIGN_SERVER:
3201  {
3202  ForeignServer *srv;
3203 
3204  srv = GetForeignServer(object->objectId);
3205  appendStringInfo(&buffer, _("server %s"), srv->servername);
3206  break;
3207  }
3208 
3209  case OCLASS_USER_MAPPING:
3210  {
3211  HeapTuple tup;
3212  Oid useid;
3213  char *usename;
3214  Form_pg_user_mapping umform;
3215  ForeignServer *srv;
3216 
3218  ObjectIdGetDatum(object->objectId));
3219  if (!HeapTupleIsValid(tup))
3220  elog(ERROR, "cache lookup failed for user mapping %u",
3221  object->objectId);
3222  umform = (Form_pg_user_mapping) GETSTRUCT(tup);
3223  useid = umform->umuser;
3224  srv = GetForeignServer(umform->umserver);
3225 
3226  ReleaseSysCache(tup);
3227 
3228  if (OidIsValid(useid))
3229  usename = GetUserNameFromId(useid, false);
3230  else
3231  usename = "public";
3232 
3233  appendStringInfo(&buffer, _("user mapping for %s on server %s"), usename,
3234  srv->servername);
3235  break;
3236  }
3237 
3238  case OCLASS_DEFACL:
3239  {
3240  Relation defaclrel;
3241  ScanKeyData skey[1];
3242  SysScanDesc rcscan;
3243  HeapTuple tup;
3244  Form_pg_default_acl defacl;
3245 
3247 
3248  ScanKeyInit(&skey[0],
3250  BTEqualStrategyNumber, F_OIDEQ,
3251  ObjectIdGetDatum(object->objectId));
3252 
3253  rcscan = systable_beginscan(defaclrel, DefaultAclOidIndexId,
3254  true, NULL, 1, skey);
3255 
3256  tup = systable_getnext(rcscan);
3257 
3258  if (!HeapTupleIsValid(tup))
3259  elog(ERROR, "could not find tuple for default ACL %u",
3260  object->objectId);
3261 
3262  defacl = (Form_pg_default_acl) GETSTRUCT(tup);
3263 
3264  switch (defacl->defaclobjtype)
3265  {
3266  case DEFACLOBJ_RELATION:
3267  appendStringInfo(&buffer,
3268  _("default privileges on new relations belonging to role %s"),
3269  GetUserNameFromId(defacl->defaclrole, false));
3270  break;
3271  case DEFACLOBJ_SEQUENCE:
3272  appendStringInfo(&buffer,
3273  _("default privileges on new sequences belonging to role %s"),
3274  GetUserNameFromId(defacl->defaclrole, false));
3275  break;
3276  case DEFACLOBJ_FUNCTION:
3277  appendStringInfo(&buffer,
3278  _("default privileges on new functions belonging to role %s"),
3279  GetUserNameFromId(defacl->defaclrole, false));
3280  break;
3281  case DEFACLOBJ_TYPE:
3282  appendStringInfo(&buffer,
3283  _("default privileges on new types belonging to role %s"),
3284  GetUserNameFromId(defacl->defaclrole, false));
3285  break;
3286  case DEFACLOBJ_NAMESPACE:
3287  appendStringInfo(&buffer,
3288  _("default privileges on new schemas belonging to role %s"),
3289  GetUserNameFromId(defacl->defaclrole, false));
3290  break;
3291  default:
3292  /* shouldn't get here */
3293  appendStringInfo(&buffer,
3294  _("default privileges belonging to role %s"),
3295  GetUserNameFromId(defacl->defaclrole, false));
3296  break;
3297  }
3298 
3299  if (OidIsValid(defacl->defaclnamespace))
3300  {
3301  appendStringInfo(&buffer,
3302  _(" in schema %s"),
3303  get_namespace_name(defacl->defaclnamespace));
3304  }
3305 
3306  systable_endscan(rcscan);
3307  heap_close(defaclrel, AccessShareLock);
3308  break;
3309  }
3310 
3311  case OCLASS_EXTENSION:
3312  {
3313  char *extname;
3314 
3315  extname = get_extension_name(object->objectId);
3316  if (!extname)
3317  elog(ERROR, "cache lookup failed for extension %u",
3318  object->objectId);
3319  appendStringInfo(&buffer, _("extension %s"), extname);
3320  break;
3321  }
3322 
3323  case OCLASS_EVENT_TRIGGER:
3324  {
3325  HeapTuple tup;
3326 
3328  ObjectIdGetDatum(object->objectId));
3329  if (!HeapTupleIsValid(tup))
3330  elog(ERROR, "cache lookup failed for event trigger %u",
3331  object->objectId);
3332  appendStringInfo(&buffer, _("event trigger %s"),
3333  NameStr(((Form_pg_event_trigger) GETSTRUCT(tup))->evtname));
3334  ReleaseSysCache(tup);
3335  break;
3336  }
3337 
3338  case OCLASS_POLICY:
3339  {
3340  Relation policy_rel;
3341  ScanKeyData skey[1];
3342  SysScanDesc sscan;
3343  HeapTuple tuple;
3344  Form_pg_policy form_policy;
3345 
3347 
3348  ScanKeyInit(&skey[0],
3350  BTEqualStrategyNumber, F_OIDEQ,
3351  ObjectIdGetDatum(object->objectId));
3352 
3353  sscan = systable_beginscan(policy_rel, PolicyOidIndexId,
3354  true, NULL, 1, skey);
3355 
3356  tuple = systable_getnext(sscan);
3357 
3358  if (!HeapTupleIsValid(tuple))
3359  elog(ERROR, "could not find tuple for policy %u",
3360  object->objectId);
3361 
3362  form_policy = (Form_pg_policy) GETSTRUCT(tuple);
3363 
3364  appendStringInfo(&buffer, _("policy %s on "),
3365  NameStr(form_policy->polname));
3366  getRelationDescription(&buffer, form_policy->polrelid);
3367 
3368  systable_endscan(sscan);
3369  heap_close(policy_rel, AccessShareLock);
3370  break;
3371  }
3372 
3373  case OCLASS_PUBLICATION:
3374  {
3375  appendStringInfo(&buffer, _("publication %s"),
3376  get_publication_name(object->objectId));
3377  break;
3378  }
3379 
3381  {
3382  HeapTuple tup;
3383  char *pubname;
3384  Form_pg_publication_rel prform;
3385 
3387  ObjectIdGetDatum(object->objectId));
3388  if (!HeapTupleIsValid(tup))
3389  elog(ERROR, "cache lookup failed for publication table %u",
3390  object->objectId);
3391 
3392  prform = (Form_pg_publication_rel) GETSTRUCT(tup);
3393  pubname = get_publication_name(prform->prpubid);
3394 
3395  appendStringInfo(&buffer, _("publication table %s in publication %s"),
3396  get_rel_name(prform->prrelid), pubname);
3397  ReleaseSysCache(tup);
3398  break;
3399  }
3400 
3401  case OCLASS_SUBSCRIPTION:
3402  {
3403  appendStringInfo(&buffer, _("subscription %s"),
3404  get_subscription_name(object->objectId));
3405  break;
3406  }
3407 
3408  case OCLASS_TRANSFORM:
3409  {
3410  HeapTuple trfTup;
3411  Form_pg_transform trfForm;
3412 
3413  trfTup = SearchSysCache1(TRFOID,
3414  ObjectIdGetDatum(object->objectId));
3415  if (!HeapTupleIsValid(trfTup))
3416  elog(ERROR, "could not find tuple for transform %u",
3417  object->objectId);
3418 
3419  trfForm = (Form_pg_transform) GETSTRUCT(trfTup);
3420 
3421  appendStringInfo(&buffer, _("transform for %s language %s"),
3422  format_type_be(trfForm->trftype),
3423  get_language_name(trfForm->trflang, false));
3424 
3425  ReleaseSysCache(trfTup);
3426  break;
3427  }
3428 
3429  /*
3430  * There's intentionally no default: case here; we want the
3431  * compiler to warn if a new OCLASS hasn't been handled above.
3432  */
3433  }
3434 
3435  return buffer.data;
3436 }
#define RewriteOidIndexId
Definition: indexing.h:221
#define TriggerOidIndexId
Definition: indexing.h:251
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:499
#define GETSTRUCT(TUP)
Definition: htup_details.h:661
Definition: syscache.h:36
char * get_language_name(Oid langoid, bool missing_ok)
Definition: lsyscache.c:1018
FormData_pg_ts_config * Form_pg_ts_config
Definition: pg_ts_config.h:41
#define ObjectIdAttributeNumber
Definition: sysattr.h:22
char * fdwname
Definition: foreign.h:39
#define PolicyOidIndexId
Definition: indexing.h:327
FormData_pg_amproc * Form_pg_amproc
Definition: pg_amproc.h:59
#define RelationRelationId
Definition: pg_class.h:29
char * get_extension_name(Oid ext_oid)
Definition: extension.c:180
#define DefaultAclOidIndexId
Definition: indexing.h:307
#define AccessShareLock
Definition: lockdefs.h:36
static void getOpFamilyDescription(StringInfo buffer, Oid opfid)
#define AttrDefaultOidIndexId
Definition: indexing.h:89
#define AccessMethodOperatorOidIndexId
Definition: indexing.h:79
char * format_type_be(Oid type_oid)
Definition: format_type.c:94
char * format_operator(Oid operator_oid)
Definition: regproc.c:820
#define heap_close(r, l)
Definition: heapam.h:97
unsigned int Oid
Definition: postgres_ext.h:31
ObjectClass getObjectClass(const ObjectAddress *object)
Definition: dependency.c:2391
#define OidIsValid(objectId)
Definition: c.h:586
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
Definition: genam.c:328
#define DefaultAclRelationId
char * getObjectDescription(const ObjectAddress *object)
#define AccessMethodOperatorRelationId
Definition: pg_amop.h:54
Definition: localtime.c:78
#define AccessMethodProcedureOidIndexId
Definition: indexing.h:84
HeapTuple systable_getnext(SysScanDesc sysscan)
Definition: genam.c:416
ForeignDataWrapper * GetForeignDataWrapper(Oid fdwid)
Definition: foreign.c:35
void pfree(void *pointer)
Definition: mcxt.c:936
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:78
FormData_pg_transform * Form_pg_transform
Definition: pg_transform.h:35
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
char * get_database_name(Oid dbid)
Definition: dbcommands.c:2056
FormData_pg_user_mapping * Form_pg_user_mapping
FormData_pg_ts_dict * Form_pg_ts_dict
Definition: pg_ts_dict.h:45
#define DEFACLOBJ_SEQUENCE
FormData_pg_default_acl * Form_pg_default_acl
char * get_namespace_name(Oid nspid)
Definition: lsyscache.c:3066
#define CastOidIndexId
Definition: indexing.h:107
FormData_pg_cast * Form_pg_cast
Definition: pg_cast.h:42
void initStringInfo(StringInfo str)
Definition: stringinfo.c:46
FormData_pg_attrdef * Form_pg_attrdef
Definition: pg_attrdef.h:47
char * quote_qualified_identifier(const char *qualifier, const char *ident)
Definition: ruleutils.c:10498
char * get_relid_attribute_name(Oid relid, AttrNumber attnum)
Definition: lsyscache.c:801
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:1112
#define DEFACLOBJ_TYPE
ForeignServer * GetForeignServer(Oid serverid)
Definition: foreign.c:93
char * get_publication_name(Oid pubid)
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1160
FormData_pg_ts_parser * Form_pg_ts_parser
Definition: pg_ts_parser.h:44
FormData_pg_conversion * Form_pg_conversion
Definition: pg_conversion.h:56
Relation heap_open(Oid relationId, LOCKMODE lockmode)
Definition: heapam.c:1290
bool OpclassIsVisible(Oid opcid)
Definition: namespace.c:1793
FormData_pg_policy * Form_pg_policy
Definition: pg_policy.h:40
#define PolicyRelationId
Definition: pg_policy.h:19
#define DEFACLOBJ_NAMESPACE
#define RewriteRelationId
Definition: pg_rewrite.h:32
char * format_procedure(Oid procedure_oid)
Definition: regproc.c:323
#define DEFACLOBJ_RELATION
static void getRelationDescription(StringInfo buffer, Oid relid)
FormData_pg_constraint * Form_pg_constraint
FormData_pg_event_trigger * Form_pg_event_trigger
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
char * GetUserNameFromId(Oid roleid, bool noerr)
Definition: miscinit.c:692
#define DEFACLOBJ_FUNCTION
#define TriggerRelationId
Definition: pg_trigger.h:34
WalTimeSample buffer[LAG_TRACKER_BUFFER_SIZE]
Definition: walsender.c:215
#define CastRelationId
Definition: pg_cast.h:31
FormData_pg_trigger * Form_pg_trigger
Definition: pg_trigger.h:72
FormData_pg_collation * Form_pg_collation
Definition: pg_collation.h:52
FormData_pg_rewrite * Form_pg_rewrite
Definition: pg_rewrite.h:53
FormData_pg_am * Form_pg_am
Definition: pg_am.h:46
FormData_pg_amop * Form_pg_amop
Definition: pg_amop.h:77
char * get_tablespace_name(Oid spc_oid)
Definition: tablespace.c:1426
char * servername
Definition: foreign.h:50
FormData_pg_ts_template * Form_pg_ts_template
FormData_pg_publication_rel * Form_pg_publication_rel
#define NameStr(name)
Definition: c.h:557
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
#define elog
Definition: elog.h:219
#define AttrDefaultRelationId
Definition: pg_attrdef.h:29
FormData_pg_opclass * Form_pg_opclass
Definition: pg_opclass.h:68
#define AccessMethodProcedureRelationId
Definition: pg_amproc.h:43
char * get_rel_name(Oid relid)
Definition: lsyscache.c:1745
#define _(x)
Definition: elog.c:84
#define BTEqualStrategyNumber
Definition: stratnum.h:31
FormData_pg_statistic_ext * Form_pg_statistic_ext
char * get_subscription_name(Oid subid)

◆ getObjectDescriptionOids()

char* getObjectDescriptionOids ( Oid  classid,
Oid  objid 
)

Definition at line 3442 of file objectaddress.c.

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

Referenced by AlterObjectNamespace_internal(), and AlterObjectRename_internal().

3443 {
3444  ObjectAddress address;
3445 
3446  address.classId = classid;
3447  address.objectId = objid;
3448  address.objectSubId = 0;
3449 
3450  return getObjectDescription(&address);
3451 }
char * getObjectDescription(const ObjectAddress *object)

◆ getObjectIdentity()

◆ getObjectIdentityParts()

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

Definition at line 4065 of file objectaddress.c.

References _, AccessMethodOperatorOidIndexId, AccessMethodOperatorRelationId, AccessMethodProcedureOidIndexId, AccessMethodProcedureRelationId, AccessShareLock, AMOID, appendStringInfo(), appendStringInfoString(), Assert, AttrDefaultOidIndexId, AttrDefaultRelationId, BTEqualStrategyNumber, buffer, CastRelationId, CLAOID, ObjectAddress::classId, COLLOID, CONSTROID, CONVOID, StringInfoData::data, DEFACLOBJ_FUNCTION, DEFACLOBJ_NAMESPACE, DEFACLOBJ_RELATION, DEFACLOBJ_SEQUENCE, DEFACLOBJ_TYPE, DefaultAclOidIndexId, DefaultAclRelationId, elog, ERROR, EVENTTRIGGEROID, ForeignDataWrapper::fdwname, format_operator_parts(), format_operator_qualified(), format_procedure_parts(), format_procedure_qualified(), format_type_be_qualified(), get_am_name(), get_catalog_object_by_oid(), get_database_name(), get_extension_name(), get_language_name(), get_namespace_name_or_temp(), get_publication_name(), get_rel_name(), get_relid_attribute_name(), get_subscription_name(), get_tablespace_name(), GetForeignDataWrapper(), GetForeignServer(), getObjectClass(), getObjectIdentityParts(), getOpFamilyIdentity(), getRelationIdentity(), GETSTRUCT, GetUserNameFromId(), heap_close, heap_open(), HeapTupleIsValid, initStringInfo(), LANGOID, lappend(), list_make1, list_make2, list_make3, NameStr, NIL, ObjectAddress::objectId, ObjectIdAttributeNumber, 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, PolicyRelationId, psprintf(), pstrdup(), PUBLICATIONREL, quote_identifier(), quote_qualified_identifier(), RelationRelationId, ReleaseSysCache(), RewriteRelationId, ScanKeyInit(), SearchSysCache1(), ForeignServer::servername, STATEXTOID, systable_beginscan(), systable_endscan(), systable_getnext(), TransformRelationId, TriggerRelationId, TSCONFIGOID, TSDICTOID, TSPARSEROID, TSTEMPLATEOID, TypeRelationId, USERMAPPINGOID, and username.

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

4067 {
4069 
4070  initStringInfo(&buffer);
4071 
4072  /*
4073  * Make sure that both objname and objargs were passed, or none was; and
4074  * initialize them to empty lists. For objname this is useless because it
4075  * will be initialized in all cases inside the switch; but we do it anyway
4076  * so that we can test below that no branch leaves it unset.
4077  */
4078  Assert(PointerIsValid(objname) == PointerIsValid(objargs));
4079  if (objname)
4080  {
4081  *objname = NIL;
4082  *objargs = NIL;
4083  }
4084 
4085  switch (getObjectClass(object))
4086  {
4087  case OCLASS_CLASS:
4088  getRelationIdentity(&buffer, object->objectId, objname);
4089  if (object->objectSubId != 0)
4090  {
4091  char *attr;
4092 
4093  attr = get_relid_attribute_name(object->objectId,
4094  object->objectSubId);
4095  appendStringInfo(&buffer, ".%s", quote_identifier(attr));
4096  if (objname)
4097  *objname = lappend(*objname, attr);
4098  }
4099  break;
4100 
4101  case OCLASS_PROC:
4102  appendStringInfoString(&buffer,
4104  if (objname)
4105  format_procedure_parts(object->objectId, objname, objargs);
4106  break;
4107 
4108  case OCLASS_TYPE:
4109  {
4110  char *typeout;
4111 
4112  typeout = format_type_be_qualified(object->objectId);
4113  appendStringInfoString(&buffer, typeout);
4114  if (objname)
4115  *objname = list_make1(typeout);
4116  }
4117  break;
4118 
4119  case OCLASS_CAST:
4120  {
4121  Relation castRel;
4122  HeapTuple tup;
4123  Form_pg_cast castForm;
4124 
4126 
4127  tup = get_catalog_object_by_oid(castRel, object->objectId);
4128 
4129  if (!HeapTupleIsValid(tup))
4130  elog(ERROR, "could not find tuple for cast %u",
4131  object->objectId);
4132 
4133  castForm = (Form_pg_cast) GETSTRUCT(tup);
4134 
4135  appendStringInfo(&buffer, "(%s AS %s)",
4136  format_type_be_qualified(castForm->castsource),
4137  format_type_be_qualified(castForm->casttarget));
4138 
4139  if (objname)
4140  {
4141  *objname = list_make1(format_type_be_qualified(castForm->castsource));
4142  *objargs = list_make1(format_type_be_qualified(castForm->casttarget));
4143  }
4144 
4145  heap_close(castRel, AccessShareLock);
4146  break;
4147  }
4148 
4149  case OCLASS_COLLATION:
4150  {
4151  HeapTuple collTup;
4152  Form_pg_collation coll;
4153  char *schema;
4154 
4155  collTup = SearchSysCache1(COLLOID,
4156  ObjectIdGetDatum(object->objectId));
4157  if (!HeapTupleIsValid(collTup))
4158  elog(ERROR, "cache lookup failed for collation %u",
4159  object->objectId);
4160  coll = (Form_pg_collation) GETSTRUCT(collTup);
4161  schema = get_namespace_name_or_temp(coll->collnamespace);
4162  appendStringInfoString(&buffer,
4164  NameStr(coll->collname)));
4165  if (objname)
4166  *objname = list_make2(schema,
4167  pstrdup(NameStr(coll->collname)));
4168  ReleaseSysCache(collTup);
4169  break;
4170  }
4171 
4172  case OCLASS_CONSTRAINT:
4173  {
4174  HeapTuple conTup;
4175  Form_pg_constraint con;
4176 
4177  conTup = SearchSysCache1(CONSTROID,
4178  ObjectIdGetDatum(object->objectId));
4179  if (!HeapTupleIsValid(conTup))
4180  elog(ERROR, "cache lookup failed for constraint %u",
4181  object->objectId);
4182  con = (Form_pg_constraint) GETSTRUCT(conTup);
4183 
4184  if (OidIsValid(con->conrelid))
4185  {
4186  appendStringInfo(&buffer, "%s on ",
4187  quote_identifier(NameStr(con->conname)));
4188  getRelationIdentity(&buffer, con->conrelid, objname);
4189  if (objname)
4190  *objname = lappend(*objname, pstrdup(NameStr(con->conname)));
4191  }
4192  else
4193  {
4194  ObjectAddress domain;
4195 
4196  Assert(OidIsValid(con->contypid));
4197  domain.classId = TypeRelationId;
4198  domain.objectId = con->contypid;
4199  domain.objectSubId = 0;
4200 
4201  appendStringInfo(&buffer, "%s on %s",
4202  quote_identifier(NameStr(con->conname)),
4203  getObjectIdentityParts(&domain, objname, objargs));
4204 
4205  if (objname)
4206  *objargs = lappend(*objargs, pstrdup(NameStr(con->conname)));
4207  }
4208 
4209  ReleaseSysCache(conTup);
4210  break;
4211  }
4212 
4213  case OCLASS_CONVERSION:
4214  {
4215  HeapTuple conTup;
4216  Form_pg_conversion conForm;
4217  char *schema;
4218 
4219  conTup = SearchSysCache1(CONVOID,
4220  ObjectIdGetDatum(object->objectId));
4221  if (!HeapTupleIsValid(conTup))
4222  elog(ERROR, "cache lookup failed for conversion %u",
4223  object->objectId);
4224  conForm = (Form_pg_conversion) GETSTRUCT(conTup);
4225  schema = get_namespace_name_or_temp(conForm->connamespace);
4226  appendStringInfoString(&buffer,
4228  NameStr(conForm->conname)));
4229  if (objname)
4230  *objname = list_make2(schema,
4231  pstrdup(NameStr(conForm->conname)));
4232  ReleaseSysCache(conTup);
4233  break;
4234  }
4235 
4236  case OCLASS_DEFAULT:
4237  {
4238  Relation attrdefDesc;
4239  ScanKeyData skey[1];
4240  SysScanDesc adscan;
4241 
4242  HeapTuple tup;
4243  Form_pg_attrdef attrdef;
4244  ObjectAddress colobject;
4245 
4247 
4248  ScanKeyInit(&skey[0],
4250  BTEqualStrategyNumber, F_OIDEQ,
4251  ObjectIdGetDatum(object->objectId));
4252 
4253  adscan = systable_beginscan(attrdefDesc, AttrDefaultOidIndexId,
4254  true, NULL, 1, skey);
4255 
4256  tup = systable_getnext(adscan);
4257 
4258  if (!HeapTupleIsValid(tup))
4259  elog(ERROR, "could not find tuple for attrdef %u",
4260  object->objectId);
4261 
4262  attrdef = (Form_pg_attrdef) GETSTRUCT(tup);
4263 
4264  colobject.classId = RelationRelationId;
4265  colobject.objectId = attrdef->adrelid;
4266  colobject.objectSubId = attrdef->adnum;
4267 
4268  appendStringInfo(&buffer, "for %s",
4269  getObjectIdentityParts(&colobject,
4270  objname, objargs));
4271 
4272  systable_endscan(adscan);
4273  heap_close(attrdefDesc, AccessShareLock);
4274  break;
4275  }
4276 
4277  case OCLASS_LANGUAGE:
4278  {
4279  HeapTuple langTup;
4280  Form_pg_language langForm;
4281 
4282  langTup = SearchSysCache1(LANGOID,
4283  ObjectIdGetDatum(object->objectId));
4284  if (!HeapTupleIsValid(langTup))
4285  elog(ERROR, "cache lookup failed for language %u",
4286  object->objectId);
4287  langForm = (Form_pg_language) GETSTRUCT(langTup);
4288  appendStringInfoString(&buffer,
4289  quote_identifier(NameStr(langForm->lanname)));
4290  if (objname)
4291  *objname = list_make1(pstrdup(NameStr(langForm->lanname)));
4292  ReleaseSysCache(langTup);
4293  break;
4294  }
4295  case OCLASS_LARGEOBJECT:
4296  appendStringInfo(&buffer, "%u",
4297  object->objectId);
4298  if (objname)
4299  *objname = list_make1(psprintf("%u", object->objectId));
4300  break;
4301 
4302  case OCLASS_OPERATOR:
4303  appendStringInfoString(&buffer,
4305  if (objname)
4306  format_operator_parts(object->objectId, objname, objargs);
4307  break;
4308 
4309  case OCLASS_OPCLASS:
4310  {
4311  HeapTuple opcTup;
4312  Form_pg_opclass opcForm;
4313  HeapTuple amTup;
4314  Form_pg_am amForm;
4315  char *schema;
4316 
4317  opcTup = SearchSysCache1(CLAOID,
4318  ObjectIdGetDatum(object->objectId));
4319  if (!HeapTupleIsValid(opcTup))
4320  elog(ERROR, "cache lookup failed for opclass %u",
4321  object->objectId);
4322  opcForm = (Form_pg_opclass) GETSTRUCT(opcTup);
4323  schema = get_namespace_name_or_temp(opcForm->opcnamespace);
4324 
4325  amTup = SearchSysCache1(AMOID,
4326  ObjectIdGetDatum(opcForm->opcmethod));
4327  if (!HeapTupleIsValid(amTup))
4328  elog(ERROR, "cache lookup failed for access method %u",
4329  opcForm->opcmethod);
4330  amForm = (Form_pg_am) GETSTRUCT(amTup);
4331 
4332  appendStringInfo(&buffer, "%s USING %s",
4334  NameStr(opcForm->opcname)),
4335  quote_identifier(NameStr(amForm->amname)));
4336  if (objname)
4337  *objname = list_make3(pstrdup(NameStr(amForm->amname)),
4338  schema,
4339  pstrdup(NameStr(opcForm->opcname)));
4340 
4341  ReleaseSysCache(amTup);
4342  ReleaseSysCache(opcTup);
4343  break;
4344  }
4345 
4346  case OCLASS_OPFAMILY:
4347  getOpFamilyIdentity(&buffer, object->objectId, objname);
4348  break;
4349 
4350  case OCLASS_AM:
4351  {
4352  char *amname;
4353 
4354  amname = get_am_name(object->objectId);
4355  if (!amname)
4356  elog(ERROR, "cache lookup failed for access method %u",
4357  object->objectId);
4358  appendStringInfoString(&buffer, quote_identifier(amname));
4359  if (objname)
4360  *objname = list_make1(amname);
4361  }
4362  break;
4363 
4364  case OCLASS_AMOP:
4365  {
4366  Relation amopDesc;
4367  HeapTuple tup;
4368  ScanKeyData skey[1];
4369  SysScanDesc amscan;
4370  Form_pg_amop amopForm;
4371  StringInfoData opfam;
4372  char *ltype;
4373  char *rtype;
4374 
4376  AccessShareLock);
4377 
4378  ScanKeyInit(&skey[0],
4380  BTEqualStrategyNumber, F_OIDEQ,
4381  ObjectIdGetDatum(object->objectId));
4382 
4383  amscan = systable_beginscan(amopDesc, AccessMethodOperatorOidIndexId, true,
4384  NULL, 1, skey);
4385 
4386  tup = systable_getnext(amscan);
4387 
4388  if (!HeapTupleIsValid(tup))
4389  elog(ERROR, "could not find tuple for amop entry %u",
4390  object->objectId);
4391 
4392  amopForm = (Form_pg_amop) GETSTRUCT(tup);
4393 
4394  initStringInfo(&opfam);
4395  getOpFamilyIdentity(&opfam, amopForm->amopfamily, objname);
4396 
4397  ltype = format_type_be_qualified(amopForm->amoplefttype);
4398  rtype = format_type_be_qualified(amopForm->amoprighttype);
4399 
4400  if (objname)
4401  {
4402  *objname = lappend(*objname,
4403  psprintf("%d", amopForm->amopstrategy));
4404  *objargs = list_make2(ltype, rtype);
4405  }
4406 
4407  appendStringInfo(&buffer, "operator %d (%s, %s) of %s",
4408  amopForm->amopstrategy,
4409  ltype, rtype, opfam.data);
4410 
4411  pfree(opfam.data);
4412 
4413  systable_endscan(amscan);
4414  heap_close(amopDesc, AccessShareLock);
4415  break;
4416  }
4417 
4418  case OCLASS_AMPROC:
4419  {
4420  Relation amprocDesc;
4421  ScanKeyData skey[1];
4422  SysScanDesc amscan;
4423  HeapTuple tup;
4424  Form_pg_amproc amprocForm;
4425  StringInfoData opfam;
4426  char *ltype;
4427  char *rtype;
4428 
4430  AccessShareLock);
4431 
4432  ScanKeyInit(&skey[0],
4434  BTEqualStrategyNumber, F_OIDEQ,
4435  ObjectIdGetDatum(object->objectId));
4436 
4437  amscan = systable_beginscan(amprocDesc, AccessMethodProcedureOidIndexId, true,
4438  NULL, 1, skey);
4439 
4440  tup = systable_getnext(amscan);
4441 
4442  if (!HeapTupleIsValid(tup))
4443  elog(ERROR, "could not find tuple for amproc entry %u",
4444  object->objectId);
4445 
4446  amprocForm = (Form_pg_amproc) GETSTRUCT(tup);
4447 
4448  initStringInfo(&opfam);
4449  getOpFamilyIdentity(&opfam, amprocForm->amprocfamily, objname);
4450 
4451  ltype = format_type_be_qualified(amprocForm->amproclefttype);
4452  rtype = format_type_be_qualified(amprocForm->amprocrighttype);
4453 
4454  if (objname)
4455  {
4456  *objname = lappend(*objname,
4457  psprintf("%d", amprocForm->amprocnum));
4458  *objargs = list_make2(ltype, rtype);
4459  }
4460 
4461  appendStringInfo(&buffer, "function %d (%s, %s) of %s",
4462  amprocForm->amprocnum,
4463  ltype, rtype, opfam.data);
4464 
4465  pfree(opfam.data);
4466 
4467  systable_endscan(amscan);
4468  heap_close(amprocDesc, AccessShareLock);
4469  break;
4470  }
4471 
4472  case OCLASS_REWRITE:
4473  {
4474  Relation ruleDesc;
4475  HeapTuple tup;
4477 
4479 
4480  tup = get_catalog_object_by_oid(ruleDesc, object->objectId);
4481 
4482  if (!HeapTupleIsValid(tup))
4483  elog(ERROR, "could not find tuple for rule %u",
4484  object->objectId);
4485 
4486  rule = (Form_pg_rewrite) GETSTRUCT(tup);
4487 
4488  appendStringInfo(&buffer, "%s on ",
4489  quote_identifier(NameStr(rule->rulename)));
4490  getRelationIdentity(&buffer, rule->ev_class, objname);
4491  if (objname)
4492  *objname = lappend(*objname, pstrdup(NameStr(rule->rulename)));
4493 
4494  heap_close(ruleDesc, AccessShareLock);
4495  break;
4496  }
4497 
4498  case OCLASS_TRIGGER:
4499  {
4500  Relation trigDesc;
4501  HeapTuple tup;
4502  Form_pg_trigger trig;
4503 
4505 
4506  tup = get_catalog_object_by_oid(trigDesc, object->objectId);
4507 
4508  if (!HeapTupleIsValid(tup))
4509  elog(ERROR, "could not find tuple for trigger %u",
4510  object->objectId);
4511 
4512  trig = (Form_pg_trigger) GETSTRUCT(tup);
4513 
4514  appendStringInfo(&buffer, "%s on ",
4515  quote_identifier(NameStr(trig->tgname)));
4516  getRelationIdentity(&buffer, trig->tgrelid, objname);
4517  if (objname)
4518  *objname = lappend(*objname, pstrdup(NameStr(trig->tgname)));
4519 
4520  heap_close(trigDesc, AccessShareLock);
4521  break;
4522  }
4523 
4524  case OCLASS_SCHEMA:
4525  {
4526  char *nspname;
4527 
4528  nspname = get_namespace_name_or_temp(object->objectId);
4529  if (!nspname)
4530  elog(ERROR, "cache lookup failed for namespace %u",
4531  object->objectId);
4532  appendStringInfoString(&buffer,
4533  quote_identifier(nspname));
4534  if (objname)
4535  *objname = list_make1(nspname);
4536  break;
4537  }
4538 
4539  case OCLASS_STATISTIC_EXT:
4540  {
4541  HeapTuple tup;
4542  Form_pg_statistic_ext formStatistic;
4543  char *schema;
4544 
4546  ObjectIdGetDatum(object->objectId));
4547  if (!HeapTupleIsValid(tup))
4548  elog(ERROR, "cache lookup failed for statistics object %u",
4549  object->objectId);
4550  formStatistic = (Form_pg_statistic_ext) GETSTRUCT(tup);
4551  schema = get_namespace_name_or_temp(formStatistic->stxnamespace);
4552  appendStringInfoString(&buffer,
4554  NameStr(formStatistic->stxname)));
4555  if (objname)
4556  *objname = list_make2(schema,
4557  pstrdup(NameStr(formStatistic->stxname)));
4558  ReleaseSysCache(tup);
4559  }
4560  break;
4561 
4562  case OCLASS_TSPARSER:
4563  {
4564  HeapTuple tup;
4565  Form_pg_ts_parser formParser;
4566  char *schema;
4567 
4569  ObjectIdGetDatum(object->objectId));
4570  if (!HeapTupleIsValid(tup))
4571  elog(ERROR, "cache lookup failed for text search parser %u",
4572  object->objectId);
4573  formParser = (Form_pg_ts_parser) GETSTRUCT(tup);
4574  schema = get_namespace_name_or_temp(formParser->prsnamespace);
4575  appendStringInfoString(&buffer,
4577  NameStr(formParser->prsname)));
4578  if (objname)
4579  *objname = list_make2(schema,
4580  pstrdup(NameStr(formParser->prsname)));
4581  ReleaseSysCache(tup);
4582  break;
4583  }
4584 
4585  case OCLASS_TSDICT:
4586  {
4587  HeapTuple tup;
4588  Form_pg_ts_dict formDict;
4589  char *schema;
4590 
4591  tup = SearchSysCache1(TSDICTOID,
4592  ObjectIdGetDatum(object->objectId));
4593  if (!HeapTupleIsValid(tup))
4594  elog(ERROR, "cache lookup failed for text search dictionary %u",
4595  object->objectId);
4596  formDict = (Form_pg_ts_dict) GETSTRUCT(tup);
4597  schema = get_namespace_name_or_temp(formDict->dictnamespace);
4598  appendStringInfoString(&buffer,
4600  NameStr(formDict->dictname)));
4601  if (objname)
4602  *objname = list_make2(schema,
4603  pstrdup(NameStr(formDict->dictname)));
4604  ReleaseSysCache(tup);
4605  break;
4606  }
4607 
4608  case OCLASS_TSTEMPLATE:
4609  {
4610  HeapTuple tup;
4611  Form_pg_ts_template formTmpl;
4612  char *schema;
4613 
4615  ObjectIdGetDatum(object->objectId));
4616  if (!HeapTupleIsValid(tup))
4617  elog(ERROR, "cache lookup failed for text search template %u",
4618  object->objectId);
4619  formTmpl = (Form_pg_ts_template) GETSTRUCT(tup);
4620  schema = get_namespace_name_or_temp(formTmpl->tmplnamespace);
4621  appendStringInfoString(&buffer,
4623  NameStr(formTmpl->tmplname)));
4624  if (objname)
4625  *objname = list_make2(schema,
4626  pstrdup(NameStr(formTmpl->tmplname)));
4627  ReleaseSysCache(tup);
4628  break;
4629  }
4630 
4631  case OCLASS_TSCONFIG:
4632  {
4633  HeapTuple tup;
4634  Form_pg_ts_config formCfg;
4635  char *schema;
4636 
4638  ObjectIdGetDatum(object->objectId));
4639  if (!HeapTupleIsValid(tup))
4640  elog(ERROR, "cache lookup failed for text search configuration %u",
4641  object->objectId);
4642  formCfg = (Form_pg_ts_config) GETSTRUCT(tup);
4643  schema = get_namespace_name_or_temp(formCfg->cfgnamespace);
4644  appendStringInfoString(&buffer,
4646  NameStr(formCfg->cfgname)));
4647  if (objname)
4648  *objname = list_make2(schema,
4649  pstrdup(NameStr(formCfg->cfgname)));
4650  ReleaseSysCache(tup);
4651  break;
4652  }
4653 
4654  case OCLASS_ROLE:
4655  {
4656  char *username;
4657 
4658  username = GetUserNameFromId(object->objectId, false);
4659  if (objname)
4660  *objname = list_make1(username);
4661  appendStringInfoString(&buffer,
4662  quote_identifier(username));
4663  break;
4664  }
4665 
4666  case OCLASS_DATABASE:
4667  {
4668  char *datname;
4669 
4670  datname = get_database_name(object->objectId);
4671  if (!datname)
4672  elog(ERROR, "cache lookup failed for database %u",
4673  object->objectId);
4674  if (objname)
4675  *objname = list_make1(datname);
4676  appendStringInfoString(&buffer,
4677  quote_identifier(datname));
4678  break;
4679  }
4680 
4681  case OCLASS_TBLSPACE:
4682  {
4683  char *tblspace;
4684 
4685  tblspace = get_tablespace_name(object->objectId);
4686  if (!tblspace)
4687  elog(ERROR, "cache lookup failed for tablespace %u",
4688  object->objectId);
4689  if (objname)
4690  *objname = list_make1(tblspace);
4691  appendStringInfoString(&buffer,
4692  quote_identifier(tblspace));
4693  break;
4694  }
4695 
4696  case OCLASS_FDW:
4697  {
4698  ForeignDataWrapper *fdw;
4699 
4700  fdw = GetForeignDataWrapper(object->objectId);
4702  if (objname)
4703  *objname = list_make1(pstrdup(fdw->fdwname));
4704  break;
4705  }
4706 
4707  case OCLASS_FOREIGN_SERVER:
4708  {
4709  ForeignServer *srv;
4710 
4711  srv = GetForeignServer(object->objectId);
4712  appendStringInfoString(&buffer,
4714  if (objname)
4715  *objname = list_make1(pstrdup(srv->servername));
4716  break;
4717  }
4718 
4719  case OCLASS_USER_MAPPING:
4720  {
4721  HeapTuple tup;
4722  Oid useid;
4723  Form_pg_user_mapping umform;
4724  ForeignServer *srv;
4725  const char *usename;
4726 
4728  ObjectIdGetDatum(object->objectId));
4729  if (!HeapTupleIsValid(tup))
4730  elog(ERROR, "cache lookup failed for user mapping %u",
4731  object->objectId);
4732  umform = (Form_pg_user_mapping) GETSTRUCT(tup);
4733  useid = umform->umuser;
4734  srv = GetForeignServer(umform->umserver);
4735 
4736  ReleaseSysCache(tup);
4737 
4738  if (OidIsValid(useid))
4739  usename = GetUserNameFromId(useid, false);
4740  else
4741  usename = "public";
4742 
4743  if (objname)
4744  {
4745  *objname = list_make1(pstrdup(usename));
4746  *objargs = list_make1(pstrdup(srv->servername));
4747  }
4748 
4749  appendStringInfo(&buffer, "%s on server %s",
4750  quote_identifier(usename),
4751  srv->servername);
4752  break;
4753  }
4754 
4755  case OCLASS_DEFACL:
4756  {
4757  Relation defaclrel;
4758  ScanKeyData skey[1];
4759  SysScanDesc rcscan;
4760  HeapTuple tup;
4761  Form_pg_default_acl defacl;
4762  char *schema;
4763  char *username;
4764 
4765  defaclrel = heap_open(