From 9abbed0629c862710bdc0f0dd3565e069ecab9da Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 27 Jun 2011 15:06:32 -0400 Subject: [PATCH] Allow callers to pass a missing_ok flag when opening a relation. Since the names try_relation_openrv() and try_heap_openrv() don't seem quite appropriate, rename the functions to relation_openrv_extended() and heap_openrv_extended(). This is also more general, if we have a future need for additional parameters that are of interest to only a few callers. This is infrastructure for a forthcoming patch to allow get_object_address() to take a missing_ok argument as well. Patch by me, review by Noah Misch. --- src/backend/access/heap/heapam.c | 24 ++++++++++++++---------- src/backend/parser/parse_relation.c | 2 +- src/include/access/heapam.h | 6 ++++-- src/pl/tcl/pltcl.c | 4 ++-- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index ce82d0418e..85fd749b76 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -1004,15 +1004,17 @@ relation_openrv(const RangeVar *relation, LOCKMODE lockmode) } /* ---------------- - * try_relation_openrv - open any relation specified by a RangeVar + * relation_openrv_extended - open any relation specified by a RangeVar * - * Same as relation_openrv, but return NULL instead of failing for - * relation-not-found. (Note that some other causes, such as - * permissions problems, will still result in an ereport.) + * Same as relation_openrv, but with an additional missing_ok argument + * allowing a NULL return rather than an error if the relation is not + * found. (Note that some other causes, such as permissions problems, + * will still result in an ereport.) * ---------------- */ Relation -try_relation_openrv(const RangeVar *relation, LOCKMODE lockmode) +relation_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, + bool missing_ok) { Oid relOid; @@ -1032,7 +1034,7 @@ try_relation_openrv(const RangeVar *relation, LOCKMODE lockmode) AcceptInvalidationMessages(); /* Look up the appropriate relation using namespace search */ - relOid = RangeVarGetRelid(relation, true); + relOid = RangeVarGetRelid(relation, missing_ok); /* Return NULL on not-found */ if (!OidIsValid(relOid)) @@ -1125,18 +1127,20 @@ heap_openrv(const RangeVar *relation, LOCKMODE lockmode) } /* ---------------- - * try_heap_openrv - open a heap relation specified + * heap_openrv_extended - open a heap relation specified * by a RangeVar node * - * As above, but return NULL instead of failing for relation-not-found. + * As above, but optionally return NULL instead of failing for + * relation-not-found. * ---------------- */ Relation -try_heap_openrv(const RangeVar *relation, LOCKMODE lockmode) +heap_openrv_extended(const RangeVar *relation, LOCKMODE lockmode, + bool missing_ok) { Relation r; - r = try_relation_openrv(relation, lockmode); + r = relation_openrv_extended(relation, lockmode, missing_ok); if (r) { diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 5359e691dd..edfb1f12e9 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -826,7 +826,7 @@ parserOpenTable(ParseState *pstate, const RangeVar *relation, int lockmode) ParseCallbackState pcbstate; setup_parser_errposition_callback(&pcbstate, pstate, relation->location); - rel = try_heap_openrv(relation, lockmode); + rel = heap_openrv_extended(relation, lockmode, true); if (rel == NULL) { if (relation->schemaname) diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index ee474d6c90..56036a8370 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -50,12 +50,14 @@ typedef enum extern Relation relation_open(Oid relationId, LOCKMODE lockmode); extern Relation try_relation_open(Oid relationId, LOCKMODE lockmode); extern Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode); -extern Relation try_relation_openrv(const RangeVar *relation, LOCKMODE lockmode); +extern Relation relation_openrv_extended(const RangeVar *relation, + LOCKMODE lockmode, bool missing_ok); extern void relation_close(Relation relation, LOCKMODE lockmode); extern Relation heap_open(Oid relationId, LOCKMODE lockmode); extern Relation heap_openrv(const RangeVar *relation, LOCKMODE lockmode); -extern Relation try_heap_openrv(const RangeVar *relation, LOCKMODE lockmode); +extern Relation heap_openrv_extended(const RangeVar *relation, + LOCKMODE lockmode, bool missing_ok); #define heap_close(r,l) relation_close(r,l) diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index 7b952b27e1..f517144498 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -493,8 +493,8 @@ pltcl_init_load_unknown(Tcl_Interp *interp) * This is for backwards compatibility. To ensure that the table * is trustworthy, we require it to be owned by a superuser. ************************************************************/ - pmrel = try_relation_openrv(makeRangeVar(NULL, "pltcl_modules", -1), - AccessShareLock); + pmrel = relation_openrv_extended(makeRangeVar(NULL, "pltcl_modules", -1), + AccessShareLock, true); if (pmrel == NULL) return; /* must be table or view, else ignore */