aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-06-11 15:49:46 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-06-11 15:49:46 +0000
commite2d201ecdb7f21055786753f892c75195addc5fd (patch)
tree834cd4b88cc9f26e5095acc114229dda25415323
parent3066e8ab03ed594d0fa30c0080839adbcb4620d6 (diff)
downloadpostgresql-e2d201ecdb7f21055786753f892c75195addc5fd.tar.gz
postgresql-e2d201ecdb7f21055786753f892c75195addc5fd.zip
Fix Assert failure when a fastpath function call is attempted inside an
already-aborted transaction block. GetSnapshotData throws an Assert if not in a valid transaction; hence we mustn't attempt to set a snapshot for the function until after checking for aborted transaction. This is harmless AFAICT if Asserts aren't enabled (GetSnapshotData will compute a bogus snapshot, but it doesn't matter since HandleFunctionRequest will throw an error shortly anywy). Hence, not a major bug. Along the way, add some ability to log fastpath calls when statement logging is turned on. This could probably stand to be improved further, but not logging anything is clearly undesirable. Backpatched as far as 8.0; bug doesn't exist before that.
-rw-r--r--src/backend/tcop/fastpath.c16
-rw-r--r--src/backend/tcop/postgres.c14
2 files changed, 24 insertions, 6 deletions
diff --git a/src/backend/tcop/fastpath.c b/src/backend/tcop/fastpath.c
index b2c89033530..a4bcead4fc6 100644
--- a/src/backend/tcop/fastpath.c
+++ b/src/backend/tcop/fastpath.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/fastpath.c,v 1.77 2004/12/31 22:01:16 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/fastpath.c,v 1.77.4.1 2006/06/11 15:49:46 tgl Exp $
*
* NOTES
* This cruft is the server side of PQfn.
@@ -26,6 +26,7 @@
#include "miscadmin.h"
#include "mb/pg_wchar.h"
#include "tcop/fastpath.h"
+#include "tcop/tcopprot.h"
#include "utils/acl.h"
#include "utils/lsyscache.h"
#include "utils/syscache.h"
@@ -305,13 +306,24 @@ HandleFunctionRequest(StringInfo msgBuf)
"commands ignored until end of transaction block")));
/*
+ * Now that we know we are in a valid transaction, set snapshot in
+ * case needed by function itself or one of the datatype I/O routines.
+ */
+ ActiveSnapshot = CopySnapshot(GetTransactionSnapshot());
+
+ /*
* Begin parsing the buffer contents.
*/
if (PG_PROTOCOL_MAJOR(FrontendProtocol) < 3)
- (void) pq_getmsgstring(msgBuf); /* dummy string */
+ (void) pq_getmsgstring(msgBuf); /* dummy string */
fid = (Oid) pq_getmsgint(msgBuf, 4); /* function oid */
+ if (log_statement == LOGSTMT_ALL)
+ ereport(LOG,
+ (errmsg("fastpath function call: function OID %u",
+ fid)));
+
/*
* There used to be a lame attempt at caching lookup info here. Now we
* just do the lookups on every call.
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index b166e7d9b8e..d7dc8195975 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.440.4.5 2005/12/14 17:06:51 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.440.4.6 2006/06/11 15:49:46 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -3161,12 +3161,18 @@ PostgresMain(int argc, char *argv[], const char *username)
/* start an xact for this function invocation */
start_xact_command();
+ /*
+ * Note: we may at this point be inside an aborted
+ * transaction. We can't throw error for that until
+ * we've finished reading the function-call message, so
+ * HandleFunctionRequest() must check for it after doing so.
+ * Be careful not to do anything that assumes we're inside a
+ * valid transaction here.
+ */
+
/* switch back to message context */
MemoryContextSwitchTo(MessageContext);
- /* set snapshot in case function needs one */
- ActiveSnapshot = CopySnapshot(GetTransactionSnapshot());
-
if (HandleFunctionRequest(&input_message) == EOF)
{
/* lost frontend connection during F message input */