Fix relcache refcount leakage when inv_drop is applied
authorTom Lane
Sat, 8 Apr 2000 04:37:07 +0000 (04:37 +0000)
committerTom Lane
Sat, 8 Apr 2000 04:37:07 +0000 (04:37 +0000)
to a non-LO relation.

src/backend/storage/large_object/inv_api.c

index ac57aaef6b2c5b931e06998068d88933fb28dccc..e5c1f56dac8f76b766d9ee68c337065b2666b724 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.65 2000/01/26 05:56:59 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.66 2000/04/08 04:37:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -278,10 +278,20 @@ inv_drop(Oid lobjId)
 {
    Relation    r;
 
-   r = (Relation) RelationIdGetRelation(lobjId);
-   if (!RelationIsValid(r) || r->rd_rel->relkind != RELKIND_LOBJECT)
+   r = RelationIdGetRelation(lobjId);
+   if (!RelationIsValid(r))
        return -1;
 
+   if (r->rd_rel->relkind != RELKIND_LOBJECT)
+   {
+       /* drop relcache refcount from RelationIdGetRelation */
+       RelationDecrementReferenceCount(r);
+       return -1;
+   }
+
+   /* Since heap_drop_with_catalog will destroy the relcache entry,
+    * there's no need to drop the refcount in this path.
+    */
    heap_drop_with_catalog(RelationGetRelationName(r));
    return 1;
 }