*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.6 1996/11/27 07:14:51 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.7 1997/03/12 20:41:14 scrappy Exp $
*
* NOTES
* Transaction aborts can now occur two ways:
* default state. In case 2, there may be more commands coming
* our way which are part of the same transaction block and we have
* to ignore these commands until we see an END transaction.
+ * (or an ABORT! --djm)
*
* Internal aborts are now handled by AbortTransactionBlock(), just as
* they always have been, and user aborts are now handled by
* state after the upcoming CommitTransactionCommand().
* ----------------
*/
- elog(NOTICE, "AbortTransactionBlock and not inprogress state");
+ elog(NOTICE, "AbortTransactionBlock and not in in-progress state");
AbortTransaction();
s->blockState = TBLOCK_ENDABORT;
}
*/
if (s->state == TRANS_DISABLED)
return;
-
+
+ /*
+ * if the transaction has already been automatically aborted with an error,
+ * and the user subsequently types 'abort', allow it. (the behavior is
+ * the same as if they had typed 'end'.)
+ */
+ if (s->blockState == TBLOCK_ABORT) {
+ s->blockState = TBLOCK_ENDABORT;
+ return;
+ }
+
if (s->blockState == TBLOCK_INPROGRESS) {
/* ----------------
* here we were inside a transaction block and we
* state after the upcoming CommitTransactionCommand().
* ----------------
*/
- elog(NOTICE, "UserAbortTransactionBlock and not inprogress state");
+ elog(NOTICE, "UserAbortTransactionBlock and not in in-progress state");
AbortTransaction();
s->blockState = TBLOCK_ENDABORT;
}