PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
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 "libpq/be-fsstubs.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/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

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

Definition at line 2218 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(), NULL, 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_PUBLICATION, OBJECT_ROLE, 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_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().

2220 {
2221  switch (objtype)
2222  {
2223  case OBJECT_INDEX:
2224  case OBJECT_SEQUENCE:
2225  case OBJECT_TABLE:
2226  case OBJECT_VIEW:
2227  case OBJECT_MATVIEW:
2228  case OBJECT_FOREIGN_TABLE:
2229  case OBJECT_COLUMN:
2230  case OBJECT_RULE:
2231  case OBJECT_TRIGGER:
2232  case OBJECT_POLICY:
2233  case OBJECT_TABCONSTRAINT:
2234  if (!pg_class_ownercheck(RelationGetRelid(relation), roleid))
2236  RelationGetRelationName(relation));
2237  break;
2238  case OBJECT_DATABASE:
2239  if (!pg_database_ownercheck(address.objectId, roleid))
2241  strVal((Value *) object));
2242  break;
2243  case OBJECT_TYPE:
2244  case OBJECT_DOMAIN:
2245  case OBJECT_ATTRIBUTE:
2246  case OBJECT_DOMCONSTRAINT:
2247  if (!pg_type_ownercheck(address.objectId, roleid))
2249  break;
2250  case OBJECT_AGGREGATE:
2251  case OBJECT_FUNCTION:
2252  if (!pg_proc_ownercheck(address.objectId, roleid))
2254  NameListToString((castNode(ObjectWithArgs, object))->objname));
2255  break;
2256  case OBJECT_OPERATOR:
2257  if (!pg_oper_ownercheck(address.objectId, roleid))
2259  NameListToString((castNode(ObjectWithArgs, object))->objname));
2260  break;
2261  case OBJECT_SCHEMA:
2262  if (!pg_namespace_ownercheck(address.objectId, roleid))
2264  strVal((Value *) object));
2265  break;
2266  case OBJECT_COLLATION:
2267  if (!pg_collation_ownercheck(address.objectId, roleid))
2269  NameListToString(castNode(List, object)));
2270  break;
2271  case OBJECT_CONVERSION:
2272  if (!pg_conversion_ownercheck(address.objectId, roleid))
2274  NameListToString(castNode(List, object)));
2275  break;
2276  case OBJECT_EXTENSION:
2277  if (!pg_extension_ownercheck(address.objectId, roleid))
2279  strVal((Value *) object));
2280  break;
2281  case OBJECT_FDW:
2282  if (!pg_foreign_data_wrapper_ownercheck(address.objectId, roleid))
2284  strVal((Value *) object));
2285  break;
2286  case OBJECT_FOREIGN_SERVER:
2287  if (!pg_foreign_server_ownercheck(address.objectId, roleid))
2289  strVal((Value *) object));
2290  break;
2291  case OBJECT_EVENT_TRIGGER:
2292  if (!pg_event_trigger_ownercheck(address.objectId, roleid))
2294  strVal((Value *) object));
2295  break;
2296  case OBJECT_LANGUAGE:
2297  if (!pg_language_ownercheck(address.objectId, roleid))
2299  strVal((Value *) object));
2300  break;
2301  case OBJECT_OPCLASS:
2302  if (!pg_opclass_ownercheck(address.objectId, roleid))
2304  NameListToString(castNode(List, object)));
2305  break;
2306  case OBJECT_OPFAMILY:
2307  if (!pg_opfamily_ownercheck(address.objectId, roleid))
2309  NameListToString(castNode(List, object)));
2310  break;
2311  case OBJECT_LARGEOBJECT:
2312  if (!lo_compat_privileges &&
2313  !pg_largeobject_ownercheck(address.objectId, roleid))
2314  ereport(ERROR,
2315  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2316  errmsg("must be owner of large object %u",
2317  address.objectId)));
2318  break;
2319  case OBJECT_CAST:
2320  {
2321  /* We can only check permissions on the source/target types */
2322  TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
2323  TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
2324  Oid sourcetypeid = typenameTypeId(NULL, sourcetype);
2325  Oid targettypeid = typenameTypeId(NULL, targettype);
2326 
2327  if (!pg_type_ownercheck(sourcetypeid, roleid)
2328  && !pg_type_ownercheck(targettypeid, roleid))
2329  ereport(ERROR,
2330  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2331  errmsg("must be owner of type %s or type %s",
2332  format_type_be(sourcetypeid),
2333  format_type_be(targettypeid))));
2334  }
2335  break;
2336  case OBJECT_PUBLICATION:
2337  if (!pg_publication_ownercheck(address.objectId, roleid))
2339  strVal((Value *) object));
2340  break;
2341  case OBJECT_SUBSCRIPTION:
2342  if (!pg_subscription_ownercheck(address.objectId, roleid))
2344  strVal((Value *) object));
2345  break;
2346  case OBJECT_TRANSFORM:
2347  {
2348  TypeName *typename = linitial_node(TypeName, castNode(List, object));
2349  Oid typeid = typenameTypeId(NULL, typename);
2350 
2351  if (!pg_type_ownercheck(typeid, roleid))
2353  }
2354  break;
2355  case OBJECT_TABLESPACE:
2356  if (!pg_tablespace_ownercheck(address.objectId, roleid))
2358  strVal((Value *) object));
2359  break;
2360  case OBJECT_TSDICTIONARY:
2361  if (!pg_ts_dict_ownercheck(address.objectId, roleid))
2363  NameListToString(castNode(List, object)));
2364  break;
2366  if (!pg_ts_config_ownercheck(address.objectId, roleid))
2368  NameListToString(castNode(List, object)));
2369  break;
2370  case OBJECT_ROLE:
2371 
2372  /*
2373  * We treat roles as being "owned" by those with CREATEROLE priv,
2374  * except that superusers are only owned by superusers.
2375  */
2376  if (superuser_arg(address.objectId))
2377  {
2378  if (!superuser_arg(roleid))
2379  ereport(ERROR,
2380  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2381  errmsg("must be superuser")));
2382  }
2383  else
2384  {
2385  if (!has_createrole_privilege(roleid))
2386  ereport(ERROR,
2387  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2388  errmsg("must have CREATEROLE privilege")));
2389  }
2390  break;
2391  case OBJECT_TSPARSER:
2392  case OBJECT_TSTEMPLATE:
2393  case OBJECT_ACCESS_METHOD:
2394  /* We treat these object types as being owned by superusers */
2395  if (!superuser_arg(roleid))
2396  ereport(ERROR,
2397  (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2398  errmsg("must be superuser")));
2399  break;
2400  case OBJECT_STATISTIC_EXT:
2401  if (!pg_statistics_ownercheck(address.objectId, roleid))
2403  break;
2404  default:
2405  elog(ERROR, "unrecognized object type: %d",
2406  (int) objtype);
2407  }
2408 }
bool has_createrole_privilege(Oid roleid)
Definition: aclchk.c:5170
bool pg_collation_ownercheck(Oid coll_oid, Oid roleid)
Definition: aclchk.c:4990
bool pg_largeobject_ownercheck(Oid lobj_oid, Oid roleid)
Definition: aclchk.c:4679
bool pg_ts_dict_ownercheck(Oid dict_oid, Oid roleid)
Definition: aclchk.c:4829
bool pg_language_ownercheck(Oid lan_oid, Oid roleid)
Definition: aclchk.c:4650
#define castNode(_type_, nodeptr)
Definition: nodes.h:578
bool pg_ts_config_ownercheck(Oid cfg_oid, Oid roleid)
Definition: aclchk.c:4856
bool pg_foreign_server_ownercheck(Oid srv_oid, Oid roleid)
Definition: aclchk.c:4910
bool pg_publication_ownercheck(Oid pub_oid, Oid roleid)
Definition: aclchk.c:5084
#define strVal(v)
Definition: value.h:54
bool pg_oper_ownercheck(Oid oper_oid, Oid roleid)
Definition: aclchk.c:4598
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:4722
unsigned int Oid
Definition: postgres_ext.h:31
bool pg_type_ownercheck(Oid type_oid, Oid roleid)
Definition: aclchk.c:4572
#define linitial_node(type, l)
Definition: pg_list.h:114
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
Definition: aclchk.c:3457
bool lo_compat_privileges
Definition: be-fsstubs.c:57
#define ERROR
Definition: elog.h:43
bool pg_statistics_ownercheck(Oid stat_oid, Oid roleid)
Definition: aclchk.c:5136
bool pg_event_trigger_ownercheck(Oid et_oid, Oid roleid)
Definition: aclchk.c:4937
bool pg_extension_ownercheck(Oid ext_oid, Oid roleid)
Definition: aclchk.c:5042
void aclcheck_error(AclResult aclerr, AclObjectKind objectkind, const char *objectname)
Definition: aclchk.c:3399
#define RelationGetRelationName(relation)
Definition: rel.h:437
bool pg_tablespace_ownercheck(Oid spc_oid, Oid roleid)
Definition: aclchk.c:4748
bool pg_opfamily_ownercheck(Oid opf_oid, Oid roleid)
Definition: aclchk.c:4802
#define ereport(elevel, rest)
Definition: elog.h:122
bool pg_database_ownercheck(Oid db_oid, Oid roleid)
Definition: aclchk.c:4964
bool superuser_arg(Oid roleid)
Definition: superuser.c:57
char * NameListToString(List *names)
Definition: namespace.c:2953
#define lsecond_node(type, l)
Definition: pg_list.h:119
bool pg_opclass_ownercheck(Oid opc_oid, Oid roleid)
Definition: aclchk.c:4775
bool pg_conversion_ownercheck(Oid conv_oid, Oid roleid)
Definition: aclchk.c:5016
#define NULL
Definition: c.h:229
Definition: value.h:42
bool pg_class_ownercheck(Oid class_oid, Oid roleid)
Definition: aclchk.c:4546
bool pg_foreign_data_wrapper_ownercheck(Oid srv_oid, Oid roleid)
Definition: aclchk.c:4883
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:417
bool pg_proc_ownercheck(Oid proc_oid, Oid roleid)
Definition: aclchk.c:4624
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
Definition: parse_type.c:274
bool pg_subscription_ownercheck(Oid sub_oid, Oid roleid)
Definition: aclchk.c:5110
HeapTuple get_catalog_object_by_oid ( Relation  catalog,
Oid  objectId 
)

Definition at line 2604 of file objectaddress.c.

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

2605 {
2606  HeapTuple tuple;
2607  Oid classId = RelationGetRelid(catalog);
2608  int oidCacheId = get_object_catcache_oid(classId);
2609 
2610  if (oidCacheId > 0)
2611  {
2612  tuple = SearchSysCacheCopy1(oidCacheId, ObjectIdGetDatum(objectId));
2613  if (!HeapTupleIsValid(tuple)) /* should not happen */
2614  return NULL;
2615  }
2616  else
2617  {
2618  Oid oidIndexId = get_object_oid_index(classId);
2619  SysScanDesc scan;
2620  ScanKeyData skey;
2621 
2622  Assert(OidIsValid(oidIndexId));
2623 
2624  ScanKeyInit(&skey,
2626  BTEqualStrategyNumber, F_OIDEQ,
2627  ObjectIdGetDatum(objectId));
2628 
2629  scan = systable_beginscan(catalog, oidIndexId, true,
2630  NULL, 1, &skey);
2631  tuple = systable_getnext(scan);
2632  if (!HeapTupleIsValid(tuple))
2633  {
2634  systable_endscan(scan);
2635  return NULL;
2636  }
2637  tuple = heap_copytuple(tuple);
2638 
2639  systable_endscan(scan);
2640  }
2641 
2642  return tuple;
2643 }
HeapTuple heap_copytuple(HeapTuple tuple)
Definition: heaptuple.c:608
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:538
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 NULL
Definition: c.h:229
#define Assert(condition)
Definition: c.h:675
#define SearchSysCacheCopy1(cacheId, key1)
Definition: syscache.h:161
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
#define RelationGetRelid(relation)
Definition: rel.h:417
#define BTEqualStrategyNumber
Definition: stratnum.h:31
AclObjectKind get_object_aclkind ( Oid  class_id)

Definition at line 2532 of file objectaddress.c.

References ObjectPropertyType::acl_kind, and get_object_property_data().

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

2533 {
2534  const ObjectPropertyType *prop = get_object_property_data(class_id);
2535 
2536  return prop->acl_kind;
2537 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AclObjectKind acl_kind
ObjectAddress get_object_address ( ObjectType  objtype,
Node object,
Relation relp,
LOCKMODE  lockmode,
bool  missing_ok 
)

Definition at line 796 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_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(), LookupAggWithArgs(), LookupFuncWithArgs(), LookupOperWithArgs(), LookupTypeNameOid(), lsecond, lsecond_node, NoLock, NULL, 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_PUBLICATION, OBJECT_PUBLICATION_REL, OBJECT_ROLE, 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().

798 {
799  ObjectAddress address;
800  ObjectAddress old_address = {InvalidOid, InvalidOid, 0};
801  Relation relation = NULL;
802  uint64 inval_count;
803 
804  /* Some kind of lock must be taken. */
805  Assert(lockmode != NoLock);
806 
807  for (;;)
808  {
809  /*
810  * Remember this value, so that, after looking up the object name and
811  * locking it, we can check whether any invalidation messages have
812  * been processed that might require a do-over.
813  */
814  inval_count = SharedInvalidMessageCounter;
815 
816  /* Look up object address. */
817  switch (objtype)
818  {
819  case OBJECT_INDEX:
820  case OBJECT_SEQUENCE:
821  case OBJECT_TABLE:
822  case OBJECT_VIEW:
823  case OBJECT_MATVIEW:
825  address =
826  get_relation_by_qualified_name(objtype, castNode(List, object),
827  &relation, lockmode,
828  missing_ok);
829  break;
830  case OBJECT_COLUMN:
831  address =
832  get_object_address_attribute(objtype, castNode(List, object),
833  &relation, lockmode,
834  missing_ok);
835  break;
836  case OBJECT_DEFAULT:
837  address =
838  get_object_address_attrdef(objtype, castNode(List, object),
839  &relation, lockmode,
840  missing_ok);
841  break;
842  case OBJECT_RULE:
843  case OBJECT_TRIGGER:
845  case OBJECT_POLICY:
846  address = get_object_address_relobject(objtype, castNode(List, object),
847  &relation, missing_ok);
848  break;
850  {
851  List *objlist;
852  ObjectAddress domaddr;
853  char *constrname;
854 
855  objlist = castNode(List, object);
857  linitial_node(TypeName, objlist),
858  missing_ok);
859  constrname = strVal(lsecond(objlist));
860 
861  address.classId = ConstraintRelationId;
862  address.objectId = get_domain_constraint_oid(domaddr.objectId,
863  constrname, missing_ok);
864  address.objectSubId = 0;
865 
866  }
867  break;
868  case OBJECT_DATABASE:
869  case OBJECT_EXTENSION:
870  case OBJECT_TABLESPACE:
871  case OBJECT_ROLE:
872  case OBJECT_SCHEMA:
873  case OBJECT_LANGUAGE:
874  case OBJECT_FDW:
878  case OBJECT_PUBLICATION:
879  case OBJECT_SUBSCRIPTION:
880  address = get_object_address_unqualified(objtype,
881  (Value *) object, missing_ok);
882  break;
883  case OBJECT_TYPE:
884  case OBJECT_DOMAIN:
885  address = get_object_address_type(objtype, castNode(TypeName, object), missing_ok);
886  break;
887  case OBJECT_AGGREGATE:
888  address.classId = ProcedureRelationId;
889  address.objectId = LookupAggWithArgs(castNode(ObjectWithArgs, object), missing_ok);
890  address.objectSubId = 0;
891  break;
892  case OBJECT_FUNCTION:
893  address.classId = ProcedureRelationId;
894  address.objectId = LookupFuncWithArgs(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_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:578
#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:2529
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:538
#define lsecond(l)
Definition: pg_list.h:116
Oid get_statistics_oid(List *names, bool missing_ok)
Definition: namespace.c:2094
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:2276
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:892
#define TSDictionaryRelationId
Definition: pg_ts_dict.h:31
Oid get_ts_template_oid(List *names, bool missing_ok)
Definition: namespace.c:2403
#define NoLock
Definition: lockdefs.h:34
static ObjectAddress get_object_address_relobject(ObjectType objtype, List *object, Relation *relp, bool missing_ok)
void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:830
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
Oid LookupFuncWithArgs(ObjectWithArgs *func, bool noError)
Definition: parse_func.c:1971
void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:851
#define lsecond_node(type, l)
Definition: pg_list.h:119
Oid LookupAggWithArgs(ObjectWithArgs *agg, bool noError)
Definition: parse_func.c:2008
bool IsSharedRelation(Oid relationId)
Definition: catalog.c:219
#define TSParserRelationId
Definition: pg_ts_parser.h:31
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
Definition: lmgr.c:871
uint64 SharedInvalidMessageCounter
Definition: sinval.c:26
#define CollationRelationId
Definition: pg_collation.h:30
#define InvalidOid
Definition: postgres_ext.h:36
#define NULL
Definition: c.h:229
Oid get_ts_parser_oid(List *names, bool missing_ok)
Definition: namespace.c:2150
#define Assert(condition)
Definition: c.h:675
#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:3453
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:3380
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
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(), NULL, 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:1192
void systable_endscan(SysScanDesc sysscan)
Definition: genam.c:499
#define RelationGetDescr(relation)
Definition: rel.h:429
#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:1260
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:2913
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:538
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:2953
#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
#define NULL
Definition: c.h:229
TupleConstr * constr
Definition: tupdesc.h:76
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:1114
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:695
#define AttrDefaultRelationId
Definition: pg_attrdef.h:29
Definition: pg_list.h:45
int16 AttrNumber
Definition: attnum.h:21
#define RelationGetRelid(relation)
Definition: rel.h:417
#define BTEqualStrategyNumber
Definition: stratnum.h:31
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:1192
#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:1260
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:2913
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:2953
#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:417
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, NULL, 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 \"r\", \"S\", \"f\", \"T\" and \"s\".")));
1854  }
1855 
1856  /*
1857  * Look up user ID. Behave as "default ACL not found" if the user doesn't
1858  * exist.
1859  */
1861  CStringGetDatum(username));
1862  if (!HeapTupleIsValid(tp))
1863  goto not_found;
1864  userid = HeapTupleGetOid(tp);
1865  ReleaseSysCache(tp);
1866 
1867  /*
1868  * If a schema name was given, look up its OID. If it doesn't exist,
1869  * behave as "default ACL not found".
1870  */
1871  if (schema)
1872  {
1873  schemaid = get_namespace_oid(schema, true);
1874  if (schemaid == InvalidOid)
1875  goto not_found;
1876  }
1877  else
1878  schemaid = InvalidOid;
1879 
1880  /* Finally, look up the pg_default_acl object */
1882  ObjectIdGetDatum(userid),
1883  ObjectIdGetDatum(schemaid),
1884  CharGetDatum(objtype));
1885  if (!HeapTupleIsValid(tp))
1886  goto not_found;
1887 
1888  address.objectId = HeapTupleGetOid(tp);
1889  ReleaseSysCache(tp);
1890 
1891  return address;
1892 
1893 not_found:
1894  if (!missing_ok)
1895  {
1896  if (schema)
1897  ereport(ERROR,
1898  (errcode(ERRCODE_UNDEFINED_OBJECT),
1899  errmsg("default ACL for user \"%s\" in schema \"%s\" on %s does not exist",
1900  username, schema, objtype_str)));
1901  else
1902  ereport(ERROR,
1903  (errcode(ERRCODE_UNDEFINED_OBJECT),
1904  errmsg("default ACL for user \"%s\" on %s does not exist",
1905  username, objtype_str)));
1906  }
1907  return address;
1908 }
Oid get_namespace_oid(const char *nspname, bool missing_ok)
Definition: namespace.c:2895
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 SearchSysCache1(cacheId, key1)
Definition: syscache.h:152
#define linitial(l)
Definition: pg_list.h:111
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
#define ERROR
Definition: elog.h:43
#define DEFACLOBJ_SEQUENCE
#define CStringGetDatum(X)
Definition: postgres.h:584
#define ereport(elevel, rest)
Definition: elog.h:122
#define DEFACLOBJ_TYPE
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1116
static char * username
Definition: initdb.c:131
#define InvalidOid
Definition: postgres_ext.h:36
#define DEFACLOBJ_NAMESPACE
#define DEFACLOBJ_RELATION
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define NULL
Definition: c.h:229
#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 SearchSysCache3(cacheId, key1, key2, key3)
Definition: syscache.h:156
#define lthird(l)
Definition: pg_list.h:121
#define HeapTupleGetOid(tuple)
Definition: htup_details.h:695
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:220
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:141
#define elog
Definition: elog.h:219
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 SearchSysCache4(cacheId, key1, key2, key3, key4)
Definition: syscache.h:158
#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)
#define ereport(elevel, rest)
Definition: elog.h:122
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1116
#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:695
#define AccessMethodProcedureRelationId
Definition: pg_amproc.h:43
Definition: pg_list.h:45
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:1260
RangeVar * makeRangeVarFromNameList(List *names)
Definition: namespace.c:2913
#define OidIsValid(objectId)
Definition: c.h:538
Publication * GetPublicationByName(const char *pubname, bool missing_ok)
#define lsecond(l)
Definition: pg_list.h:116
#define GetSysCacheOid2(cacheId, key1, key2)
Definition: syscache.h:181
#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:437
#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:417
Relation relation_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: heapam.c:1227
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(), NULL, 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:2913
#define heap_close(r, l)
Definition: heapam.h:97
unsigned int Oid
Definition: postgres_ext.h:31
#define OidIsValid(objectId)
Definition: c.h:538
Relation heap_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: heapam.c:1341
#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
#define NULL
Definition: c.h:229
Oid get_relation_policy_oid(Oid relid, const char *policy_name, bool missing_ok)
Definition: policy.c:1310
#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:1275
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:417
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:509
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
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(), NULL, 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:656
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:1116
#define InvalidOid
Definition: postgres_ext.h:36
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define NULL
Definition: c.h:229
int errmsg(const char *fmt,...)
Definition: elog.c:797
Oid typeTypeId(Type tp)
Definition: parse_type.c:571
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:2895
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:5096
#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:134
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
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, USERMAPPINGUSERSERVER, 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  }
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 SearchSysCache1(cacheId, key1)
Definition: syscache.h:152
#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
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1116
static char * username
Definition: initdb.c:131
#define InvalidOid
Definition: postgres_ext.h:36
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#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:695
Oid serverid
Definition: foreign.h:47
#define SearchSysCache2(cacheId, key1, key2)
Definition: syscache.h:154
AttrNumber get_object_attnum_acl ( Oid  class_id)

Definition at line 2524 of file objectaddress.c.

References ObjectPropertyType::attnum_acl, and get_object_property_data().

Referenced by AlterObjectOwner_internal().

2525 {
2526  const ObjectPropertyType *prop = get_object_property_data(class_id);
2527 
2528  return prop->attnum_acl;
2529 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AttrNumber attnum_acl
AttrNumber get_object_attnum_name ( Oid  class_id)

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

2501 {
2502  const ObjectPropertyType *prop = get_object_property_data(class_id);
2503 
2504  return prop->attnum_name;
2505 }
AttrNumber attnum_name
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AttrNumber get_object_attnum_namespace ( Oid  class_id)

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

2509 {
2510  const ObjectPropertyType *prop = get_object_property_data(class_id);
2511 
2512  return prop->attnum_namespace;
2513 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
AttrNumber attnum_namespace
AttrNumber get_object_attnum_owner ( Oid  class_id)

Definition at line 2516 of file objectaddress.c.

References ObjectPropertyType::attnum_owner, and get_object_property_data().

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

2517 {
2518  const ObjectPropertyType *prop = get_object_property_data(class_id);
2519 
2520  return prop->attnum_owner;
2521 }
AttrNumber attnum_owner
static const ObjectPropertyType * get_object_property_data(Oid class_id)
int get_object_catcache_name ( Oid  class_id)

Definition at line 2492 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::name_catcache_id.

Referenced by AlterObjectNamespace_internal(), and AlterObjectRename_internal().

2493 {
2494  const ObjectPropertyType *prop = get_object_property_data(class_id);
2495 
2496  return prop->name_catcache_id;
2497 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
int get_object_catcache_oid ( Oid  class_id)

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

2485 {
2486  const ObjectPropertyType *prop = get_object_property_data(class_id);
2487 
2488  return prop->oid_catcache_id;
2489 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
bool get_object_namensp_unique ( Oid  class_id)

Definition at line 2540 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::is_nsp_name_unique.

Referenced by EventTriggerSQLDropAddObject(), and pg_identify_object().

2541 {
2542  const ObjectPropertyType *prop = get_object_property_data(class_id);
2543 
2544  return prop->is_nsp_name_unique;
2545 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
Oid get_object_namespace ( const ObjectAddress address)

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

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

Definition at line 2476 of file objectaddress.c.

References get_object_property_data(), and ObjectPropertyType::oid_index_oid.

Referenced by get_catalog_object_by_oid().

2477 {
2478  const ObjectPropertyType *prop = get_object_property_data(class_id);
2479 
2480  return prop->oid_index_oid;
2481 }
static const ObjectPropertyType * get_object_property_data(Oid class_id)
static const ObjectPropertyType * get_object_property_data ( Oid  class_id)
static

Definition at line 2569 of file objectaddress.c.

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

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().

2570 {
2571  static const ObjectPropertyType *prop_last = NULL;
2572  int index;
2573 
2574  /*
2575  * A shortcut to speed up multiple consecutive lookups of a particular
2576  * object class.
2577  */
2578  if (prop_last && prop_last->class_oid == class_id)
2579  return prop_last;
2580 
2581  for (index = 0; index < lengthof(ObjectProperty); index++)
2582  {
2583  if (ObjectProperty[index].class_oid == class_id)
2584  {
2585  prop_last = &ObjectProperty[index];
2586  return &ObjectProperty[index];
2587  }
2588  }
2589 
2590  ereport(ERROR,
2591  (errmsg_internal("unrecognized class ID: %u", class_id)));
2592 
2593  return NULL; /* keep MSC compiler happy */
2594 }
#define lengthof(array)
Definition: c.h:562
Definition: type.h:90
#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
#define NULL
Definition: c.h:229
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:2913
Form_pg_class rd_rel
Definition: rel.h:114
#define ERROR
Definition: elog.h:43
#define RelationGetRelationName(relation)
Definition: rel.h:437
#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:417
Relation relation_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok)
Definition: heapam.c:1227
static void getConstraintTypeDescription ( StringInfo  buffer,
Oid  constroid 
)
static

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

3967 {
3968  Relation constrRel;
3969  HeapTuple constrTup;
3970  Form_pg_constraint constrForm;
3971 
3973  constrTup = get_catalog_object_by_oid(constrRel, constroid);
3974  if (!HeapTupleIsValid(constrTup))
3975  elog(ERROR, "cache lookup failed for constraint %u", constroid);
3976 
3977  constrForm = (Form_pg_constraint) GETSTRUCT(constrTup);
3978 
3979  if (OidIsValid(constrForm->conrelid))
3980  appendStringInfoString(buffer, "table constraint");
3981  else if (OidIsValid(constrForm->contypid))
3982  appendStringInfoString(buffer, "domain constraint");
3983  else
3984  elog(ERROR, "invalid constraint %u", HeapTupleGetOid(constrTup));
3985 
3986  heap_close(constrRel, AccessShareLock);
3987 }
#define GETSTRUCT(TUP)
Definition: htup_details.h:656
#define AccessShareLock
Definition: lockdefs.h:36
#define heap_close(r, l)
Definition: heapam.h:97
#define OidIsValid(objectId)
Definition: c.h:538
#define ERROR
Definition: elog.h:43
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:189
Relation heap_open(Oid relationId, LOCKMODE lockmode)
Definition: heapam.c:1284
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:695
char* getObjectDescription ( const ObjectAddress object)

Definition at line 2651 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, NULL, 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_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, 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().

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

Definition at line 3413 of file objectaddress.c.

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

Referenced by AlterObjectNamespace_internal(), and AlterObjectRename_internal().

3414 {
3415  ObjectAddress address;
3416 
3417  address.classId = classid;
3418  address.objectId = objid;
3419  address.objectSubId = 0;
3420 
3421  return getObjectDescription(&address);
3422 }
char * getObjectDescription(const ObjectAddress *object)
char* getObjectIdentityParts ( const ObjectAddress object,
List **  objname,
List **  objargs 
)

Definition at line 4033 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, NULL, 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().

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