Index: src/backend/utils/cache/relcache.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v
retrieving revision 1.287.2.3
diff -c -r1.287.2.3 relcache.c
*** src/backend/utils/cache/relcache.c	13 Jan 2010 23:07:15 -0000	1.287.2.3
--- src/backend/utils/cache/relcache.c	14 Apr 2010 11:09:23 -0000
***************
*** 1773,1778 ****
--- 1773,1781 ----
  {
  	Oid			old_reltype = relation->rd_rel->reltype;
  
+ 	Assert((rebuild && relation->rd_refcnt > 0) ||
+ 		   (!rebuild && relation->rd_refcnt == 0));
+ 
  	/*
  	 * Make sure smgr and lower levels close the relation's files, if they
  	 * weren't closed already.  If the relation is not getting deleted, the
***************
*** 1968,1975 ****
  static void
  RelationFlushRelation(Relation relation)
  {
- 	bool		rebuild;
- 
  	if (relation->rd_createSubid != InvalidSubTransactionId ||
  		relation->rd_newRelfilenodeSubid != InvalidSubTransactionId)
  	{
--- 1971,1976 ----
***************
*** 1978,1994 ****
  		 * forget the "new" status of the relation, which is a useful
  		 * optimization to have.  Ditto for the new-relfilenode status.
  		 */
! 		rebuild = true;
  	}
  	else
  	{
  		/*
  		 * Pre-existing rels can be dropped from the relcache if not open.
  		 */
! 		rebuild = !RelationHasReferenceCountZero(relation);
  	}
- 
- 	RelationClearRelation(relation, rebuild);
  }
  
  /*
--- 1979,1996 ----
  		 * forget the "new" status of the relation, which is a useful
  		 * optimization to have.  Ditto for the new-relfilenode status.
  		 */
! 		RelationIncrementReferenceCount(relation);
! 		RelationClearRelation(relation, true);
! 		RelationDecrementReferenceCount(relation);
  	}
  	else
  	{
  		/*
  		 * Pre-existing rels can be dropped from the relcache if not open.
  		 */
! 		bool rebuild = !RelationHasReferenceCountZero(relation);
! 		RelationClearRelation(relation, rebuild);
  	}
  }
  
  /*
