diff options
Diffstat (limited to 'src/backend/rewrite/rewriteSupport.c')
-rw-r--r-- | src/backend/rewrite/rewriteSupport.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/src/backend/rewrite/rewriteSupport.c b/src/backend/rewrite/rewriteSupport.c index 7770d032b1e..4d6f508e0b6 100644 --- a/src/backend/rewrite/rewriteSupport.c +++ b/src/backend/rewrite/rewriteSupport.c @@ -132,7 +132,8 @@ get_rewrite_oid(Oid relid, const char *rulename, bool missing_ok) * were unique across the entire database. */ Oid -get_rewrite_oid_without_relid(const char *rulename, Oid *reloid) +get_rewrite_oid_without_relid(const char *rulename, + Oid *reloid, bool missing_ok) { Relation RewriteRelation; HeapScanDesc scanDesc; @@ -151,20 +152,26 @@ get_rewrite_oid_without_relid(const char *rulename, Oid *reloid) htup = heap_getnext(scanDesc, ForwardScanDirection); if (!HeapTupleIsValid(htup)) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("rule \"%s\" does not exist", rulename))); - - ruleoid = HeapTupleGetOid(htup); - if (reloid != NULL) - *reloid = ((Form_pg_rewrite) GETSTRUCT(htup))->ev_class; - - if (HeapTupleIsValid(htup = heap_getnext(scanDesc, ForwardScanDirection))) - 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."))); - + { + 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); |