Allow callers to pass a missing_ok flag when opening a relation.
authorRobert Haas <rhaas@postgresql.org>
Mon, 27 Jun 2011 19:06:32 +0000 (15:06 -0400)
committerRobert Haas <rhaas@postgresql.org>
Mon, 27 Jun 2011 19:25:44 +0000 (15:25 -0400)
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
src/backend/parser/parse_relation.c
src/include/access/heapam.h
src/pl/tcl/pltcl.c

index ce82d0418eecc4ee09226f09cf2750512ce49763..85fd749b76a339c5a93e463d6453e93dc4406453 100644 (file)
@@ -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)
    {
index 5359e691dd17bee35d07913895b90b0ce8a75c1a..edfb1f12e978e4bbb9cefc31f77dfd16c55db96d 100644 (file)
@@ -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)
index ee474d6c909ea85cbb67ec2361996039748a4a7b..56036a837027a4ece5426b6088a26f2c724cc7a0 100644 (file)
@@ -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)
 
index 7b952b27e1ad2b2b24ebca9e048cca6267d88f80..f5171444987b65af2c2f70fe81a9f51e32c4da58 100644 (file)
@@ -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 */