*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.163 2002/04/27 21:24:34 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.164 2002/05/22 15:57:40 tgl Exp $
*
*-------------------------------------------------------------------------
*/
RelationIdCacheLookup(rid, relation);
- if (PointerIsValid(relation))
+ if (!PointerIsValid(relation))
+ return; /* not in cache, nothing to do */
+
+ if (!RelationHasReferenceCountZero(relation))
+ elog(ERROR, "RelationForgetRelation: relation %u is still open", rid);
+
+ /* If local, remove from list */
+ if (relation->rd_myxactonly)
{
- if (relation->rd_myxactonly)
- {
- List *curr;
- List *prev = NIL;
+ List *curr;
+ List *prev = NIL;
- foreach(curr, newlyCreatedRelns)
- {
- Relation reln = lfirst(curr);
+ foreach(curr, newlyCreatedRelns)
+ {
+ Relation reln = lfirst(curr);
- Assert(reln != NULL && reln->rd_myxactonly);
- if (RelationGetRelid(reln) == rid)
- break;
- prev = curr;
- }
- if (curr == NIL)
- elog(FATAL, "Local relation %s not found in list",
- RelationGetRelationName(relation));
- if (prev == NIL)
- newlyCreatedRelns = lnext(newlyCreatedRelns);
- else
- lnext(prev) = lnext(curr);
- pfree(curr);
+ Assert(reln != NULL && reln->rd_myxactonly);
+ if (RelationGetRelid(reln) == rid)
+ break;
+ prev = curr;
}
-
- /* Unconditionally destroy the relcache entry */
- RelationClearRelation(relation, false);
+ if (curr == NIL)
+ elog(ERROR, "Local relation %s not found in list",
+ RelationGetRelationName(relation));
+ if (prev == NIL)
+ newlyCreatedRelns = lnext(newlyCreatedRelns);
+ else
+ lnext(prev) = lnext(curr);
+ pfree(curr);
}
+
+ /* Unconditionally destroy the relcache entry */
+ RelationClearRelation(relation, false);
}
/*