diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2012-05-28 23:57:20 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2012-05-28 23:57:20 -0400 |
commit | 73bf9b77fc28840a335002d8dc817e8706d9a2ce (patch) | |
tree | 26d95d27224da7e5390ac6e1f53d85d3c34ee647 | |
parent | 785b8d6ab312e5bee0846094fe06982c1d4c07f2 (diff) | |
download | postgresql-73bf9b77fc28840a335002d8dc817e8706d9a2ce.tar.gz postgresql-73bf9b77fc28840a335002d8dc817e8706d9a2ce.zip |
Teach AbortOutOfAnyTransaction to clean up partially-started transactions.
AbortOutOfAnyTransaction failed to do anything if the state it saw on
entry corresponded to failing partway through StartTransaction. I fixed
AbortCurrentTransaction to cope with that case way back in commit
60b2444cc3ba037630c9b940c3c9ef01b954b87b, but evidently overlooked that
AbortOutOfAnyTransaction should do likewise.
Back-patch to all supported branches. It's not clear that this omission
has any more-than-cosmetic consequences, but it's also not clear that it
doesn't, so back-patching seems the least risky choice.
-rw-r--r-- | src/backend/access/transam/xact.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index d1cebeb86db..511e17c2e45 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -3748,7 +3748,24 @@ AbortOutOfAnyTransaction(void) switch (s->blockState) { case TBLOCK_DEFAULT: - /* Not in a transaction, do nothing */ + if (s->state == TRANS_DEFAULT) + { + /* Not in a transaction, do nothing */ + } + else + { + /* + * We can get here after an error during transaction start + * (state will be TRANS_START). Need to clean up the + * incompletely started transaction. First, adjust the + * low-level state to suppress warning message from + * AbortTransaction. + */ + if (s->state == TRANS_START) + s->state = TRANS_INPROGRESS; + AbortTransaction(); + CleanupTransaction(); + } break; case TBLOCK_STARTED: case TBLOCK_BEGIN: |