|
|
|
@ -72,15 +72,19 @@
|
|
|
|
|
#include "utils/tqual.h"
|
|
|
|
|
|
|
|
|
|
static ObjectAddress get_object_address_unqualified(ObjectType objtype,
|
|
|
|
|
List *qualname);
|
|
|
|
|
static Relation get_relation_by_qualified_name(ObjectType objtype,
|
|
|
|
|
List *objname, LOCKMODE lockmode);
|
|
|
|
|
List *qualname, bool missing_ok);
|
|
|
|
|
static ObjectAddress get_relation_by_qualified_name(ObjectType objtype,
|
|
|
|
|
List *objname, Relation *relp,
|
|
|
|
|
LOCKMODE lockmode, bool missing_ok);
|
|
|
|
|
static ObjectAddress get_object_address_relobject(ObjectType objtype,
|
|
|
|
|
List *objname, Relation *relp);
|
|
|
|
|
List *objname, Relation *relp, bool missing_ok);
|
|
|
|
|
static ObjectAddress get_object_address_attribute(ObjectType objtype,
|
|
|
|
|
List *objname, Relation *relp, LOCKMODE lockmode);
|
|
|
|
|
List *objname, Relation *relp,
|
|
|
|
|
LOCKMODE lockmode, bool missing_ok);
|
|
|
|
|
static ObjectAddress get_object_address_type(ObjectType objtype,
|
|
|
|
|
List *objname, bool missing_ok);
|
|
|
|
|
static ObjectAddress get_object_address_opcf(ObjectType objtype, List *objname,
|
|
|
|
|
List *objargs);
|
|
|
|
|
List *objargs, bool missing_ok);
|
|
|
|
|
static bool object_exists(ObjectAddress address);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -106,7 +110,7 @@ static bool object_exists(ObjectAddress address);
|
|
|
|
|
*/
|
|
|
|
|
ObjectAddress
|
|
|
|
|
get_object_address(ObjectType objtype, List *objname, List *objargs,
|
|
|
|
|
Relation *relp, LOCKMODE lockmode)
|
|
|
|
|
Relation *relp, LOCKMODE lockmode, bool missing_ok)
|
|
|
|
|
{
|
|
|
|
|
ObjectAddress address;
|
|
|
|
|
Relation relation = NULL;
|
|
|
|
@ -121,21 +125,22 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
|
|
|
|
|
case OBJECT_TABLE:
|
|
|
|
|
case OBJECT_VIEW:
|
|
|
|
|
case OBJECT_FOREIGN_TABLE:
|
|
|
|
|
relation =
|
|
|
|
|
get_relation_by_qualified_name(objtype, objname, lockmode);
|
|
|
|
|
address.classId = RelationRelationId;
|
|
|
|
|
address.objectId = RelationGetRelid(relation);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
address =
|
|
|
|
|
get_relation_by_qualified_name(objtype, objname,
|
|
|
|
|
&relation, lockmode,
|
|
|
|
|
missing_ok);
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_COLUMN:
|
|
|
|
|
address =
|
|
|
|
|
get_object_address_attribute(objtype, objname, &relation,
|
|
|
|
|
lockmode);
|
|
|
|
|
get_object_address_attribute(objtype, objname,
|
|
|
|
|
&relation, lockmode,
|
|
|
|
|
missing_ok);
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_RULE:
|
|
|
|
|
case OBJECT_TRIGGER:
|
|
|
|
|
case OBJECT_CONSTRAINT:
|
|
|
|
|
address = get_object_address_relobject(objtype, objname, &relation);
|
|
|
|
|
address = get_object_address_relobject(objtype, objname,
|
|
|
|
|
&relation, missing_ok);
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_DATABASE:
|
|
|
|
|
case OBJECT_EXTENSION:
|
|
|
|
@ -145,23 +150,23 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
|
|
|
|
|
case OBJECT_LANGUAGE:
|
|
|
|
|
case OBJECT_FDW:
|
|
|
|
|
case OBJECT_FOREIGN_SERVER:
|
|
|
|
|
address = get_object_address_unqualified(objtype, objname);
|
|
|
|
|
address = get_object_address_unqualified(objtype,
|
|
|
|
|
objname, missing_ok);
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_TYPE:
|
|
|
|
|
case OBJECT_DOMAIN:
|
|
|
|
|
address.classId = TypeRelationId;
|
|
|
|
|
address.objectId =
|
|
|
|
|
typenameTypeId(NULL, makeTypeNameFromNameList(objname));
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
address = get_object_address_type(objtype, objname, missing_ok);
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_AGGREGATE:
|
|
|
|
|
address.classId = ProcedureRelationId;
|
|
|
|
|
address.objectId = LookupAggNameTypeNames(objname, objargs, false);
|
|
|
|
|
address.objectId =
|
|
|
|
|
LookupAggNameTypeNames(objname, objargs, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_FUNCTION:
|
|
|
|
|
address.classId = ProcedureRelationId;
|
|
|
|
|
address.objectId = LookupFuncNameTypeNames(objname, objargs, false);
|
|
|
|
|
address.objectId =
|
|
|
|
|
LookupFuncNameTypeNames(objname, objargs, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_OPERATOR:
|
|
|
|
@ -171,22 +176,23 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
|
|
|
|
|
LookupOperNameTypeNames(NULL, objname,
|
|
|
|
|
(TypeName *) linitial(objargs),
|
|
|
|
|
(TypeName *) lsecond(objargs),
|
|
|
|
|
false, -1);
|
|
|
|
|
missing_ok, -1);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_COLLATION:
|
|
|
|
|
address.classId = CollationRelationId;
|
|
|
|
|
address.objectId = get_collation_oid(objname, false);
|
|
|
|
|
address.objectId = get_collation_oid(objname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_CONVERSION:
|
|
|
|
|
address.classId = ConversionRelationId;
|
|
|
|
|
address.objectId = get_conversion_oid(objname, false);
|
|
|
|
|
address.objectId = get_conversion_oid(objname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_OPCLASS:
|
|
|
|
|
case OBJECT_OPFAMILY:
|
|
|
|
|
address = get_object_address_opcf(objtype, objname, objargs);
|
|
|
|
|
address = get_object_address_opcf(objtype,
|
|
|
|
|
objname, objargs, missing_ok);
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_LARGEOBJECT:
|
|
|
|
|
Assert(list_length(objname) == 1);
|
|
|
|
@ -194,10 +200,13 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
|
|
|
|
|
address.objectId = oidparse(linitial(objname));
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
if (!LargeObjectExists(address.objectId))
|
|
|
|
|
{
|
|
|
|
|
if (!missing_ok)
|
|
|
|
|
ereport(ERROR,
|
|
|
|
|
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
|
|
|
|
errmsg("large object %u does not exist",
|
|
|
|
|
address.objectId)));
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_CAST:
|
|
|
|
|
{
|
|
|
|
@ -208,28 +217,28 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
|
|
|
|
|
|
|
|
|
|
address.classId = CastRelationId;
|
|
|
|
|
address.objectId =
|
|
|
|
|
get_cast_oid(sourcetypeid, targettypeid, false);
|
|
|
|
|
get_cast_oid(sourcetypeid, targettypeid, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_TSPARSER:
|
|
|
|
|
address.classId = TSParserRelationId;
|
|
|
|
|
address.objectId = get_ts_parser_oid(objname, false);
|
|
|
|
|
address.objectId = get_ts_parser_oid(objname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_TSDICTIONARY:
|
|
|
|
|
address.classId = TSDictionaryRelationId;
|
|
|
|
|
address.objectId = get_ts_dict_oid(objname, false);
|
|
|
|
|
address.objectId = get_ts_dict_oid(objname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_TSTEMPLATE:
|
|
|
|
|
address.classId = TSTemplateRelationId;
|
|
|
|
|
address.objectId = get_ts_template_oid(objname, false);
|
|
|
|
|
address.objectId = get_ts_template_oid(objname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_TSCONFIGURATION:
|
|
|
|
|
address.classId = TSConfigRelationId;
|
|
|
|
|
address.objectId = get_ts_config_oid(objname, false);
|
|
|
|
|
address.objectId = get_ts_config_oid(objname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
@ -240,6 +249,15 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If we could not find the supplied object, return without locking.
|
|
|
|
|
*/
|
|
|
|
|
if (!OidIsValid(address.objectId))
|
|
|
|
|
{
|
|
|
|
|
Assert(missing_ok);
|
|
|
|
|
return address;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If we're dealing with a relation or attribute, then the relation is
|
|
|
|
|
* already locked. If we're dealing with any other type of object, we
|
|
|
|
@ -267,7 +285,8 @@ get_object_address(ObjectType objtype, List *objname, List *objargs,
|
|
|
|
|
* unqualified name.
|
|
|
|
|
*/
|
|
|
|
|
static ObjectAddress
|
|
|
|
|
get_object_address_unqualified(ObjectType objtype, List *qualname)
|
|
|
|
|
get_object_address_unqualified(ObjectType objtype,
|
|
|
|
|
List *qualname, bool missing_ok)
|
|
|
|
|
{
|
|
|
|
|
const char *name;
|
|
|
|
|
ObjectAddress address;
|
|
|
|
@ -323,42 +342,42 @@ get_object_address_unqualified(ObjectType objtype, List *qualname)
|
|
|
|
|
{
|
|
|
|
|
case OBJECT_DATABASE:
|
|
|
|
|
address.classId = DatabaseRelationId;
|
|
|
|
|
address.objectId = get_database_oid(name, false);
|
|
|
|
|
address.objectId = get_database_oid(name, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_EXTENSION:
|
|
|
|
|
address.classId = ExtensionRelationId;
|
|
|
|
|
address.objectId = get_extension_oid(name, false);
|
|
|
|
|
address.objectId = get_extension_oid(name, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_TABLESPACE:
|
|
|
|
|
address.classId = TableSpaceRelationId;
|
|
|
|
|
address.objectId = get_tablespace_oid(name, false);
|
|
|
|
|
address.objectId = get_tablespace_oid(name, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_ROLE:
|
|
|
|
|
address.classId = AuthIdRelationId;
|
|
|
|
|
address.objectId = get_role_oid(name, false);
|
|
|
|
|
address.objectId = get_role_oid(name, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_SCHEMA:
|
|
|
|
|
address.classId = NamespaceRelationId;
|
|
|
|
|
address.objectId = get_namespace_oid(name, false);
|
|
|
|
|
address.objectId = get_namespace_oid(name, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_LANGUAGE:
|
|
|
|
|
address.classId = LanguageRelationId;
|
|
|
|
|
address.objectId = get_language_oid(name, false);
|
|
|
|
|
address.objectId = get_language_oid(name, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_FDW:
|
|
|
|
|
address.classId = ForeignDataWrapperRelationId;
|
|
|
|
|
address.objectId = get_foreign_data_wrapper_oid(name, false);
|
|
|
|
|
address.objectId = get_foreign_data_wrapper_oid(name, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_FOREIGN_SERVER:
|
|
|
|
|
address.classId = ForeignServerRelationId;
|
|
|
|
|
address.objectId = get_foreign_server_oid(name, false);
|
|
|
|
|
address.objectId = get_foreign_server_oid(name, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
@ -375,13 +394,23 @@ get_object_address_unqualified(ObjectType objtype, List *qualname)
|
|
|
|
|
/*
|
|
|
|
|
* Locate a relation by qualified name.
|
|
|
|
|
*/
|
|
|
|
|
static Relation
|
|
|
|
|
static ObjectAddress
|
|
|
|
|
get_relation_by_qualified_name(ObjectType objtype, List *objname,
|
|
|
|
|
LOCKMODE lockmode)
|
|
|
|
|
Relation *relp, LOCKMODE lockmode,
|
|
|
|
|
bool missing_ok)
|
|
|
|
|
{
|
|
|
|
|
Relation relation;
|
|
|
|
|
ObjectAddress address;
|
|
|
|
|
|
|
|
|
|
address.classId = RelationRelationId;
|
|
|
|
|
address.objectId = InvalidOid;
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
|
|
|
|
|
relation = relation_openrv_extended(makeRangeVarFromNameList(objname),
|
|
|
|
|
lockmode, missing_ok);
|
|
|
|
|
if (!relation)
|
|
|
|
|
return address;
|
|
|
|
|
|
|
|
|
|
relation = relation_openrv(makeRangeVarFromNameList(objname), lockmode);
|
|
|
|
|
switch (objtype)
|
|
|
|
|
{
|
|
|
|
|
case OBJECT_INDEX:
|
|
|
|
@ -424,7 +453,11 @@ get_relation_by_qualified_name(ObjectType objtype, List *objname,
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return relation;
|
|
|
|
|
/* Done */
|
|
|
|
|
address.objectId = RelationGetRelid(relation);
|
|
|
|
|
*relp = relation;
|
|
|
|
|
|
|
|
|
|
return address;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -435,7 +468,8 @@ get_relation_by_qualified_name(ObjectType objtype, List *objname,
|
|
|
|
|
* mode for the object itself, not the relation to which it is attached.
|
|
|
|
|
*/
|
|
|
|
|
static ObjectAddress
|
|
|
|
|
get_object_address_relobject(ObjectType objtype, List *objname, Relation *relp)
|
|
|
|
|
get_object_address_relobject(ObjectType objtype, List *objname,
|
|
|
|
|
Relation *relp, bool missing_ok)
|
|
|
|
|
{
|
|
|
|
|
ObjectAddress address;
|
|
|
|
|
Relation relation = NULL;
|
|
|
|
@ -461,9 +495,9 @@ get_object_address_relobject(ObjectType objtype, List *objname, Relation *relp)
|
|
|
|
|
if (objtype != OBJECT_RULE)
|
|
|
|
|
elog(ERROR, "must specify relation and object name");
|
|
|
|
|
address.classId = RewriteRelationId;
|
|
|
|
|
address.objectId = get_rewrite_oid_without_relid(depname, &reloid);
|
|
|
|
|
address.objectId =
|
|
|
|
|
get_rewrite_oid_without_relid(depname, &reloid, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
relation = heap_open(reloid, AccessShareLock);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -480,17 +514,18 @@ get_object_address_relobject(ObjectType objtype, List *objname, Relation *relp)
|
|
|
|
|
{
|
|
|
|
|
case OBJECT_RULE:
|
|
|
|
|
address.classId = RewriteRelationId;
|
|
|
|
|
address.objectId = get_rewrite_oid(reloid, depname, false);
|
|
|
|
|
address.objectId = get_rewrite_oid(reloid, depname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_TRIGGER:
|
|
|
|
|
address.classId = TriggerRelationId;
|
|
|
|
|
address.objectId = get_trigger_oid(reloid, depname, false);
|
|
|
|
|
address.objectId = get_trigger_oid(reloid, depname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_CONSTRAINT:
|
|
|
|
|
address.classId = ConstraintRelationId;
|
|
|
|
|
address.objectId = get_constraint_oid(reloid, depname, false);
|
|
|
|
|
address.objectId =
|
|
|
|
|
get_constraint_oid(reloid, depname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
@ -512,13 +547,15 @@ get_object_address_relobject(ObjectType objtype, List *objname, Relation *relp)
|
|
|
|
|
*/
|
|
|
|
|
static ObjectAddress
|
|
|
|
|
get_object_address_attribute(ObjectType objtype, List *objname,
|
|
|
|
|
Relation *relp, LOCKMODE lockmode)
|
|
|
|
|
Relation *relp, LOCKMODE lockmode,
|
|
|
|
|
bool missing_ok)
|
|
|
|
|
{
|
|
|
|
|
ObjectAddress address;
|
|
|
|
|
List *relname;
|
|
|
|
|
Oid reloid;
|
|
|
|
|
Relation relation;
|
|
|
|
|
const char *attname;
|
|
|
|
|
AttrNumber attnum;
|
|
|
|
|
|
|
|
|
|
/* Extract relation name and open relation. */
|
|
|
|
|
attname = strVal(lfirst(list_tail(objname)));
|
|
|
|
@ -527,24 +564,77 @@ get_object_address_attribute(ObjectType objtype, List *objname,
|
|
|
|
|
reloid = RelationGetRelid(relation);
|
|
|
|
|
|
|
|
|
|
/* Look up attribute and construct return value. */
|
|
|
|
|
address.classId = RelationRelationId;
|
|
|
|
|
address.objectId = reloid;
|
|
|
|
|
address.objectSubId = get_attnum(reloid, attname);
|
|
|
|
|
if (address.objectSubId == InvalidAttrNumber)
|
|
|
|
|
attnum = get_attnum(reloid, attname);
|
|
|
|
|
if (attnum == InvalidAttrNumber)
|
|
|
|
|
{
|
|
|
|
|
if (!missing_ok)
|
|
|
|
|
ereport(ERROR,
|
|
|
|
|
(errcode(ERRCODE_UNDEFINED_COLUMN),
|
|
|
|
|
errmsg("column \"%s\" of relation \"%s\" does not exist",
|
|
|
|
|
attname, RelationGetRelationName(relation))));
|
|
|
|
|
attname, NameListToString(relname))));
|
|
|
|
|
|
|
|
|
|
address.classId = RelationRelationId;
|
|
|
|
|
address.objectId = InvalidOid;
|
|
|
|
|
address.objectSubId = InvalidAttrNumber;
|
|
|
|
|
return address;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
address.classId = RelationRelationId;
|
|
|
|
|
address.objectId = reloid;
|
|
|
|
|
address.objectSubId = attnum;
|
|
|
|
|
|
|
|
|
|
*relp = relation;
|
|
|
|
|
return address;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Find the ObjectAddress for a type or domain
|
|
|
|
|
*/
|
|
|
|
|
static ObjectAddress
|
|
|
|
|
get_object_address_type(ObjectType objtype,
|
|
|
|
|
List *objname, bool missing_ok)
|
|
|
|
|
{
|
|
|
|
|
ObjectAddress address;
|
|
|
|
|
TypeName *typename;
|
|
|
|
|
Type tup;
|
|
|
|
|
typename = makeTypeNameFromNameList(objname);
|
|
|
|
|
|
|
|
|
|
address.classId = TypeRelationId;
|
|
|
|
|
address.objectId = InvalidOid;
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
|
|
|
|
|
tup = LookupTypeName(NULL, typename, NULL);
|
|
|
|
|
if (!HeapTupleIsValid(tup))
|
|
|
|
|
{
|
|
|
|
|
if (!missing_ok)
|
|
|
|
|
ereport(ERROR,
|
|
|
|
|
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
|
|
|
|
errmsg("type \"%s\" does not exist",
|
|
|
|
|
TypeNameToString(typename))));
|
|
|
|
|
return address;
|
|
|
|
|
}
|
|
|
|
|
address.objectId = typeTypeId(tup);
|
|
|
|
|
|
|
|
|
|
if (objtype == OBJECT_DOMAIN)
|
|
|
|
|
{
|
|
|
|
|
if (((Form_pg_type) GETSTRUCT(tup))->typtype != TYPTYPE_DOMAIN)
|
|
|
|
|
ereport(ERROR,
|
|
|
|
|
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
|
|
|
|
errmsg("\"%s\" is not a domain",
|
|
|
|
|
TypeNameToString(typename))));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReleaseSysCache(tup);
|
|
|
|
|
|
|
|
|
|
return address;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Find the ObjectAddress for an opclass or opfamily.
|
|
|
|
|
*/
|
|
|
|
|
static ObjectAddress
|
|
|
|
|
get_object_address_opcf(ObjectType objtype, List *objname, List *objargs)
|
|
|
|
|
get_object_address_opcf(ObjectType objtype,
|
|
|
|
|
List *objname, List *objargs, bool missing_ok)
|
|
|
|
|
{
|
|
|
|
|
Oid amoid;
|
|
|
|
|
ObjectAddress address;
|
|
|
|
@ -556,12 +646,12 @@ get_object_address_opcf(ObjectType objtype, List *objname, List *objargs)
|
|
|
|
|
{
|
|
|
|
|
case OBJECT_OPCLASS:
|
|
|
|
|
address.classId = OperatorClassRelationId;
|
|
|
|
|
address.objectId = get_opclass_oid(amoid, objname, false);
|
|
|
|
|
address.objectId = get_opclass_oid(amoid, objname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
case OBJECT_OPFAMILY:
|
|
|
|
|
address.classId = OperatorFamilyRelationId;
|
|
|
|
|
address.objectId = get_opfamily_oid(amoid, objname, false);
|
|
|
|
|
address.objectId = get_opfamily_oid(amoid, objname, missing_ok);
|
|
|
|
|
address.objectSubId = 0;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|