aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-11-21 22:27:34 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-11-21 22:27:34 +0000
commit183e8b911c452de056fe8d355017c9edd1ee3c74 (patch)
treede0518742dfc9430ea220e35a042ba634ea0c6a0 /src
parent32c97fd58ffdd5c7b62e9bc80d6311b608823218 (diff)
downloadpostgresql-183e8b911c452de056fe8d355017c9edd1ee3c74.tar.gz
postgresql-183e8b911c452de056fe8d355017c9edd1ee3c74.zip
While fixing plperl and pltcl, I realized plpgsql wasn't doing
subtransactions quite right either: the ReleaseCurrentSubTransaction call should occur inside the PG_TRY, so that the proper path is taken if an error occurs during subtransaction commit. This assumes that AbortSubTransaction can cope with the state left behind if CommitSubTransaction fails partway through, but we were already requiring that.
Diffstat (limited to 'src')
-rw-r--r--src/pl/plpgsql/src/pl_exec.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index fddbfefac47..43442dcd164 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.121 2004/11/16 18:10:14 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.122 2004/11/21 22:27:34 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -898,7 +898,6 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
*/
MemoryContext oldcontext = CurrentMemoryContext;
ResourceOwner oldowner = CurrentResourceOwner;
- volatile bool caught = false;
BeginInternalSubTransaction(NULL);
/* Want to run statements inside function's memory context */
@@ -907,6 +906,17 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
PG_TRY();
{
rc = exec_stmts(estate, block->body);
+
+ /* Commit the inner transaction, return to outer xact context */
+ ReleaseCurrentSubTransaction();
+ MemoryContextSwitchTo(oldcontext);
+ CurrentResourceOwner = oldowner;
+
+ /*
+ * AtEOSubXact_SPI() should not have popped any SPI context,
+ * but just in case it did, make sure we remain connected.
+ */
+ SPI_restore_connection();
}
PG_CATCH();
{
@@ -949,22 +959,8 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block)
ReThrowError(edata);
else
FreeErrorData(edata);
- caught = true;
}
PG_END_TRY();
-
- /* Commit the inner transaction, return to outer xact context */
- if (!caught)
- {
- ReleaseCurrentSubTransaction();
- MemoryContextSwitchTo(oldcontext);
- CurrentResourceOwner = oldowner;
- /*
- * AtEOSubXact_SPI() should not have popped any SPI context,
- * but just in case it did, make sure we remain connected.
- */
- SPI_restore_connection();
- }
}
else
{