ssi-lossy-bitmap.patch

application/octet-stream

Filename: ssi-lossy-bitmap.patch
Type: application/octet-stream
Part: 0
Message: Re: Repeated PredicateLockRelation calls during seqscan
*** a/src/backend/executor/nodeBitmapHeapscan.c
--- b/src/backend/executor/nodeBitmapHeapscan.c
***************
*** 42,47 ****
--- 42,48 ----
  #include "executor/nodeBitmapHeapscan.h"
  #include "pgstat.h"
  #include "storage/bufmgr.h"
+ #include "storage/predicate.h"
  #include "utils/memutils.h"
  #include "utils/snapmgr.h"
  #include "utils/tqual.h"
***************
*** 369,382 **** bitgetpage(HeapScanDesc scan, TBMIterateResult *tbmres)
  		{
  			ItemId		lp;
  			HeapTupleData loctup;
  
  			lp = PageGetItemId(dp, offnum);
  			if (!ItemIdIsNormal(lp))
  				continue;
  			loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
  			loctup.t_len = ItemIdGetLength(lp);
! 			if (HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer))
  				scan->rs_vistuples[ntup++] = offnum;
  		}
  	}
  
--- 370,390 ----
  		{
  			ItemId		lp;
  			HeapTupleData loctup;
+ 			bool	valid;
  
  			lp = PageGetItemId(dp, offnum);
  			if (!ItemIdIsNormal(lp))
  				continue;
  			loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
  			loctup.t_len = ItemIdGetLength(lp);
! 			valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer);
! 			if (valid)
! 			{
  				scan->rs_vistuples[ntup++] = offnum;
+ 				PredicateLockTuple(scan->rs_rd, &loctup, snapshot);
+ 			}
+ 			CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup,
+ 											buffer, snapshot);
  		}
  	}