Relation relation = NULL;
int nnames;
const char *depname;
+ List *relname;
+ Oid reloid;
/* Extract name of dependent object. */
depname = strVal(llast(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. */
ReleaseSysCache(tuple);
return ruleoid;
}
-
-/*
- * Find rule oid, given only a rule name but no rel OID.
- *
- * If there's more than one, it's an error. If there aren't any, that's an
- * error, too. In general, this should be avoided - it is provided to support
- * syntax that is compatible with pre-7.3 versions of PG, where rule names
- * were unique across the entire database.
- */
-Oid
-get_rewrite_oid_without_relid(const char *rulename,
- Oid *reloid, bool missing_ok)
-{
- Relation RewriteRelation;
- HeapScanDesc scanDesc;
- ScanKeyData scanKeyData;
- HeapTuple htup;
- Oid ruleoid;
-
- /* Search pg_rewrite for such a rule */
- ScanKeyInit(&scanKeyData,
- Anum_pg_rewrite_rulename,
- BTEqualStrategyNumber, F_NAMEEQ,
- CStringGetDatum(rulename));
-
- RewriteRelation = heap_open(RewriteRelationId, AccessShareLock);
- scanDesc = heap_beginscan_catalog(RewriteRelation, 1, &scanKeyData);
-
- htup = heap_getnext(scanDesc, ForwardScanDirection);
- if (!HeapTupleIsValid(htup))
- {
- if (!missing_ok)
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("rule \"%s\" does not exist", rulename)));
- ruleoid = InvalidOid;
- }
- else
- {
- ruleoid = HeapTupleGetOid(htup);
- if (reloid != NULL)
- *reloid = ((Form_pg_rewrite) GETSTRUCT(htup))->ev_class;
-
- htup = heap_getnext(scanDesc, ForwardScanDirection);
- if (HeapTupleIsValid(htup))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("there are multiple rules named \"%s\"", rulename),
- errhint("Specify a relation name as well as a rule name.")));
- }
- heap_endscan(scanDesc);
- heap_close(RewriteRelation, AccessShareLock);
-
- return ruleoid;
-}
WARNING: error for operator family,{addr_nsp,zwei},{integer}: access method "addr_nsp" does not exist
WARNING: error for operator family,{eins,zwei,drei},{}: access method "eins" does not exist
WARNING: error for operator family,{eins,zwei,drei},{integer}: access method "eins" does not exist
-WARNING: error for rule,{eins},{}: rule "eins" does not exist
-WARNING: error for rule,{eins},{integer}: rule "eins" does not exist
+WARNING: error for rule,{eins},{}: must specify relation and object name
+WARNING: error for rule,{eins},{integer}: must specify relation and object name
WARNING: error for rule,{addr_nsp,zwei},{}: relation "addr_nsp" does not exist
WARNING: error for rule,{addr_nsp,zwei},{integer}: relation "addr_nsp" does not exist
WARNING: error for rule,{eins,zwei,drei},{}: schema "eins" does not exist