|
|
|
|
@ -1325,6 +1325,8 @@ get_object_address_relobject(ObjectType objtype, List *objname, |
|
|
|
|
Relation relation = NULL; |
|
|
|
|
int nnames; |
|
|
|
|
const char *depname; |
|
|
|
|
List *relname; |
|
|
|
|
Oid reloid; |
|
|
|
|
|
|
|
|
|
/* Extract name of dependent object. */ |
|
|
|
|
depname = strVal(llast(objname)); |
|
|
|
|
@ -1332,88 +1334,58 @@ get_object_address_relobject(ObjectType objtype, List *objname, |
|
|
|
|
/* Separate relation name from dependent object name. */ |
|
|
|
|
nnames = list_length(objname); |
|
|
|
|
if (nnames < 2) |
|
|
|
|
{ |
|
|
|
|
Oid reloid; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* For compatibility with very old releases, we sometimes allow users |
|
|
|
|
* to attempt to specify a rule without mentioning the relation name. |
|
|
|
|
* If there's only rule by that name in the entire database, this will |
|
|
|
|
* work. But objects other than rules don't get this special |
|
|
|
|
* treatment. |
|
|
|
|
*/ |
|
|
|
|
if (objtype != OBJECT_RULE) |
|
|
|
|
elog(ERROR, "must specify relation and object name"); |
|
|
|
|
address.classId = RewriteRelationId; |
|
|
|
|
address.objectId = |
|
|
|
|
get_rewrite_oid_without_relid(depname, &reloid, missing_ok); |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Caller is expecting to get back the relation, even though we didn't |
|
|
|
|
* end up using it to find the rule. |
|
|
|
|
*/ |
|
|
|
|
if (OidIsValid(address.objectId)) |
|
|
|
|
relation = heap_open(reloid, AccessShareLock); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
List *relname; |
|
|
|
|
Oid reloid; |
|
|
|
|
ereport(ERROR, |
|
|
|
|
(errcode(ERRCODE_SYNTAX_ERROR), |
|
|
|
|
errmsg("must specify relation and object name"))); |
|
|
|
|
|
|
|
|
|
/* Extract relation name and open relation. */ |
|
|
|
|
relname = list_truncate(list_copy(objname), nnames - 1); |
|
|
|
|
relation = heap_openrv_extended(makeRangeVarFromNameList(relname), |
|
|
|
|
AccessShareLock, |
|
|
|
|
missing_ok); |
|
|
|
|
/* Extract relation name and open relation. */ |
|
|
|
|
relname = list_truncate(list_copy(objname), nnames - 1); |
|
|
|
|
relation = heap_openrv_extended(makeRangeVarFromNameList(relname), |
|
|
|
|
AccessShareLock, |
|
|
|
|
missing_ok); |
|
|
|
|
|
|
|
|
|
reloid = relation ? RelationGetRelid(relation) : InvalidOid; |
|
|
|
|
reloid = relation ? RelationGetRelid(relation) : InvalidOid; |
|
|
|
|
|
|
|
|
|
switch (objtype) |
|
|
|
|
{ |
|
|
|
|
case OBJECT_RULE: |
|
|
|
|
address.classId = RewriteRelationId; |
|
|
|
|
address.objectId = relation ? |
|
|
|
|
get_rewrite_oid(reloid, depname, missing_ok) : InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
break; |
|
|
|
|
case OBJECT_TRIGGER: |
|
|
|
|
address.classId = TriggerRelationId; |
|
|
|
|
address.objectId = relation ? |
|
|
|
|
get_trigger_oid(reloid, depname, missing_ok) : InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
break; |
|
|
|
|
case OBJECT_TABCONSTRAINT: |
|
|
|
|
address.classId = ConstraintRelationId; |
|
|
|
|
address.objectId = relation ? |
|
|
|
|
get_relation_constraint_oid(reloid, depname, missing_ok) : |
|
|
|
|
InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
break; |
|
|
|
|
case OBJECT_POLICY: |
|
|
|
|
address.classId = PolicyRelationId; |
|
|
|
|
address.objectId = relation ? |
|
|
|
|
get_relation_policy_oid(reloid, depname, missing_ok) : |
|
|
|
|
InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
elog(ERROR, "unrecognized objtype: %d", (int) objtype); |
|
|
|
|
/* placate compiler, which doesn't know elog won't return */ |
|
|
|
|
address.classId = InvalidOid; |
|
|
|
|
address.objectId = InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
} |
|
|
|
|
switch (objtype) |
|
|
|
|
{ |
|
|
|
|
case OBJECT_RULE: |
|
|
|
|
address.classId = RewriteRelationId; |
|
|
|
|
address.objectId = relation ? |
|
|
|
|
get_rewrite_oid(reloid, depname, missing_ok) : InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
break; |
|
|
|
|
case OBJECT_TRIGGER: |
|
|
|
|
address.classId = TriggerRelationId; |
|
|
|
|
address.objectId = relation ? |
|
|
|
|
get_trigger_oid(reloid, depname, missing_ok) : InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
break; |
|
|
|
|
case OBJECT_TABCONSTRAINT: |
|
|
|
|
address.classId = ConstraintRelationId; |
|
|
|
|
address.objectId = relation ? |
|
|
|
|
get_relation_constraint_oid(reloid, depname, missing_ok) : |
|
|
|
|
InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
break; |
|
|
|
|
case OBJECT_POLICY: |
|
|
|
|
address.classId = PolicyRelationId; |
|
|
|
|
address.objectId = relation ? |
|
|
|
|
get_relation_policy_oid(reloid, depname, missing_ok) : |
|
|
|
|
InvalidOid; |
|
|
|
|
address.objectSubId = 0; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
elog(ERROR, "unrecognized objtype: %d", (int) objtype); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Avoid relcache leak when object not found. */ |
|
|
|
|
if (!OidIsValid(address.objectId)) |
|
|
|
|
{ |
|
|
|
|
if (relation != NULL) |
|
|
|
|
heap_close(relation, AccessShareLock); |
|
|
|
|
/* Avoid relcache leak when object not found. */ |
|
|
|
|
if (!OidIsValid(address.objectId)) |
|
|
|
|
{ |
|
|
|
|
if (relation != NULL) |
|
|
|
|
heap_close(relation, AccessShareLock); |
|
|
|
|
|
|
|
|
|
relation = NULL; /* department of accident prevention */ |
|
|
|
|
return address; |
|
|
|
|
} |
|
|
|
|
relation = NULL; /* department of accident prevention */ |
|
|
|
|
return address; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Done. */ |
|
|
|
|
|