From: Tom Lane Date: Tue, 29 May 2012 03:57:14 +0000 (-0400) Subject: Teach AbortOutOfAnyTransaction to clean up partially-started transactions. X-Git-Tag: REL9_1_4~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cc2469b0925812424efc8aa24234fc3090a5e85e;p=thirdparty%2Fpostgresql.git 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. --- diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index b34b418fd98..184fe28f5c5 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -3802,7 +3802,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: