Fix overly-strict sanity check in BeginInternalSubTransaction that made it
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 May 2007 21:01:45 +0000 (21:01 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 May 2007 21:01:45 +0000 (21:01 +0000)
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.

src/backend/access/transam/xact.c

index 1e4b409fc71021f94f2da1ffc3d487647e3044cb..b6bbbe1bb2e07b5fc2126903be0b6ff2d5784ed3 100644 (file)
@@ -3306,10 +3306,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
@@ -3321,6 +3322,8 @@ BeginInternalSubTransaction(char *name)
        {
                case TBLOCK_STARTED:
                case TBLOCK_INPROGRESS:
+               case TBLOCK_END:
+               case TBLOCK_PREPARE:
                case TBLOCK_SUBINPROGRESS:
                        /* Normal subtransaction start */
                        PushTransaction();
@@ -3338,7 +3341,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:
@@ -3348,7 +3350,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;