mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-23 19:39:53 +08: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:
parent
21b8d51de6
commit
4c2158bf0c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user