mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix overly-strict sanity check in BeginInternalSubTransaction that made it
fail when used in a deferred trigger. Bug goes back to 8.0; no doubt the reason it hadn't been noticed is that we've been discouraging use of user-defined constraint triggers. Per report from Frank van Vugt.
This commit is contained in:
		@@ -10,7 +10,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * IDENTIFICATION
 | 
			
		||||
 *	  $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.215.2.2 2007/04/26 23:25:08 tgl Exp $
 | 
			
		||||
 *	  $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.215.2.3 2007/05/30 21:01:53 tgl Exp $
 | 
			
		||||
 *
 | 
			
		||||
 *-------------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
@@ -3253,10 +3253,11 @@ RollbackToSavepoint(List *options)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * BeginInternalSubTransaction
 | 
			
		||||
 *		This is the same as DefineSavepoint except it allows TBLOCK_STARTED
 | 
			
		||||
 *		state, and therefore it can safely be used in a function that might
 | 
			
		||||
 *		be called when not inside a BEGIN block.  Also, we automatically
 | 
			
		||||
 *		cycle through CommitTransactionCommand/StartTransactionCommand
 | 
			
		||||
 *		This is the same as DefineSavepoint except it allows TBLOCK_STARTED,
 | 
			
		||||
 *		TBLOCK_END, and TBLOCK_PREPARE states, and therefore it can safely be
 | 
			
		||||
 *		used in functions that might be called when not inside a BEGIN block
 | 
			
		||||
 *		or when running deferred triggers at COMMIT/PREPARE time.  Also, it
 | 
			
		||||
 *		automatically does CommitTransactionCommand/StartTransactionCommand
 | 
			
		||||
 *		instead of expecting the caller to do it.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
@@ -3268,6 +3269,8 @@ BeginInternalSubTransaction(char *name)
 | 
			
		||||
	{
 | 
			
		||||
		case TBLOCK_STARTED:
 | 
			
		||||
		case TBLOCK_INPROGRESS:
 | 
			
		||||
		case TBLOCK_END:
 | 
			
		||||
		case TBLOCK_PREPARE:
 | 
			
		||||
		case TBLOCK_SUBINPROGRESS:
 | 
			
		||||
			/* Normal subtransaction start */
 | 
			
		||||
			PushTransaction();
 | 
			
		||||
@@ -3285,7 +3288,6 @@ BeginInternalSubTransaction(char *name)
 | 
			
		||||
		case TBLOCK_DEFAULT:
 | 
			
		||||
		case TBLOCK_BEGIN:
 | 
			
		||||
		case TBLOCK_SUBBEGIN:
 | 
			
		||||
		case TBLOCK_END:
 | 
			
		||||
		case TBLOCK_SUBEND:
 | 
			
		||||
		case TBLOCK_ABORT:
 | 
			
		||||
		case TBLOCK_SUBABORT:
 | 
			
		||||
@@ -3295,7 +3297,6 @@ BeginInternalSubTransaction(char *name)
 | 
			
		||||
		case TBLOCK_SUBABORT_PENDING:
 | 
			
		||||
		case TBLOCK_SUBRESTART:
 | 
			
		||||
		case TBLOCK_SUBABORT_RESTART:
 | 
			
		||||
		case TBLOCK_PREPARE:
 | 
			
		||||
			elog(FATAL, "BeginInternalSubTransaction: unexpected state %s",
 | 
			
		||||
				 BlockStateAsString(s->blockState));
 | 
			
		||||
			break;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user