diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/tcop/fastpath.c | 16 | ||||
-rw-r--r-- | src/backend/tcop/postgres.c | 14 |
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 */ |