mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Repair oversight in recent changes to index-creation: tuple time qual
check *can* return HEAPTUPLE_INSERT_IN_PROGRESS or HEAPTUPLE_DELETE_IN_PROGRESS, even though we have ShareLock on the relation. To wit, this can happen if the tuple was inserted/deleted by our own transaction. Per report from Justin Clift 9/23.
This commit is contained in:
		@@ -8,7 +8,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.163 2001/08/26 16:55:59 tgl Exp $
 | 
			
		||||
 *	  $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.164 2001/09/26 21:09:27 tgl Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * INTERFACE ROUTINES
 | 
			
		||||
@@ -1789,19 +1789,27 @@ IndexBuildHeapScan(Relation heapRelation,
 | 
			
		||||
					break;
 | 
			
		||||
				case HEAPTUPLE_INSERT_IN_PROGRESS:
 | 
			
		||||
					/*
 | 
			
		||||
					 * This should not happen, if caller holds ShareLock on
 | 
			
		||||
					 * the parent relation.
 | 
			
		||||
					 * Since caller should hold ShareLock or better, we should
 | 
			
		||||
					 * not see any tuples inserted by open transactions ---
 | 
			
		||||
					 * unless it's our own transaction.  (Consider INSERT
 | 
			
		||||
					 * followed by CREATE INDEX within a transaction.)
 | 
			
		||||
					 */
 | 
			
		||||
					if (! TransactionIdIsCurrentTransactionId(heapTuple->t_data->t_xmin))
 | 
			
		||||
						elog(ERROR, "IndexBuildHeapScan: concurrent insert in progress");
 | 
			
		||||
					indexIt = tupleIsAlive = false;	/* keep compiler quiet */
 | 
			
		||||
					indexIt = true;
 | 
			
		||||
					tupleIsAlive = true;
 | 
			
		||||
					break;
 | 
			
		||||
				case HEAPTUPLE_DELETE_IN_PROGRESS:
 | 
			
		||||
					/*
 | 
			
		||||
					 * This should not happen, if caller holds ShareLock on
 | 
			
		||||
					 * the parent relation.
 | 
			
		||||
					 * Since caller should hold ShareLock or better, we should
 | 
			
		||||
					 * not see any tuples deleted by open transactions ---
 | 
			
		||||
					 * unless it's our own transaction.  (Consider DELETE
 | 
			
		||||
					 * followed by CREATE INDEX within a transaction.)
 | 
			
		||||
					 */
 | 
			
		||||
					if (! TransactionIdIsCurrentTransactionId(heapTuple->t_data->t_xmax))
 | 
			
		||||
						elog(ERROR, "IndexBuildHeapScan: concurrent delete in progress");
 | 
			
		||||
					indexIt = tupleIsAlive = false;	/* keep compiler quiet */
 | 
			
		||||
					indexIt = true;
 | 
			
		||||
					tupleIsAlive = false;
 | 
			
		||||
					break;
 | 
			
		||||
				default:
 | 
			
		||||
					elog(ERROR, "Unexpected HeapTupleSatisfiesVacuum result");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user