mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Grab predicate locks on matching tuples in a lossy bitmap heap scan.
Non-lossy case was already handled correctly. Kevin Grittner
This commit is contained in:
		@@ -42,6 +42,7 @@
 | 
				
			|||||||
#include "executor/nodeBitmapHeapscan.h"
 | 
					#include "executor/nodeBitmapHeapscan.h"
 | 
				
			||||||
#include "pgstat.h"
 | 
					#include "pgstat.h"
 | 
				
			||||||
#include "storage/bufmgr.h"
 | 
					#include "storage/bufmgr.h"
 | 
				
			||||||
 | 
					#include "storage/predicate.h"
 | 
				
			||||||
#include "utils/memutils.h"
 | 
					#include "utils/memutils.h"
 | 
				
			||||||
#include "utils/snapmgr.h"
 | 
					#include "utils/snapmgr.h"
 | 
				
			||||||
#include "utils/tqual.h"
 | 
					#include "utils/tqual.h"
 | 
				
			||||||
@@ -369,14 +370,23 @@ bitgetpage(HeapScanDesc scan, TBMIterateResult *tbmres)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			ItemId		lp;
 | 
								ItemId		lp;
 | 
				
			||||||
			HeapTupleData loctup;
 | 
								HeapTupleData loctup;
 | 
				
			||||||
 | 
								bool		valid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			lp = PageGetItemId(dp, offnum);
 | 
								lp = PageGetItemId(dp, offnum);
 | 
				
			||||||
			if (!ItemIdIsNormal(lp))
 | 
								if (!ItemIdIsNormal(lp))
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
 | 
								loctup.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
 | 
				
			||||||
			loctup.t_len = ItemIdGetLength(lp);
 | 
								loctup.t_len = ItemIdGetLength(lp);
 | 
				
			||||||
			if (HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer))
 | 
								loctup.t_tableOid = scan->rs_rd->rd_id;
 | 
				
			||||||
 | 
								ItemPointerSet(&loctup.t_self, page, offnum);
 | 
				
			||||||
 | 
								valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer);
 | 
				
			||||||
 | 
								if (valid)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
				scan->rs_vistuples[ntup++] = offnum;
 | 
									scan->rs_vistuples[ntup++] = offnum;
 | 
				
			||||||
 | 
									PredicateLockTuple(scan->rs_rd, &loctup, snapshot);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								CheckForSerializableConflictOut(valid, scan->rs_rd, &loctup,
 | 
				
			||||||
 | 
																buffer, snapshot);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user