diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-11-18 01:17:50 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-11-18 01:17:50 +0000 |
commit | 77c94aca720101afdb3f14ce9bb8669633dc07f0 (patch) | |
tree | 14a1339febcacf688f9ee0b96d80c0ddc7633b54 | |
parent | 6a51c593338ec389632c2806e8e53c9b6248bd37 (diff) | |
download | postgresql-77c94aca720101afdb3f14ce9bb8669633dc07f0.tar.gz postgresql-77c94aca720101afdb3f14ce9bb8669633dc07f0.zip |
Put back error test for DECLARE CURSOR outside a transaction block ...
but do it correctly now.
-rw-r--r-- | src/backend/access/transam/xact.c | 46 | ||||
-rw-r--r-- | src/backend/tcop/pquery.c | 4 | ||||
-rw-r--r-- | src/include/access/xact.h | 3 |
3 files changed, 50 insertions, 3 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index a4d13c5beda..0023d47f13a 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.135 2002/10/22 22:44:36 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.135.2.1 2002/11/18 01:17:50 tgl Exp $ * * NOTES * Transaction aborts can now occur two ways: @@ -1497,6 +1497,50 @@ PreventTransactionChain(void *stmtNode, const char *stmtType) } } +/* -------------------------------- + * RequireTransactionChain + * + * This routine is to be called by statements that must run inside + * a transaction block, because they have no effects that persist past + * transaction end (and so calling them outside a transaction block + * is presumably an error). DECLARE CURSOR is an example. + * + * If we appear to be running inside a user-defined function, we do not + * issue an error, since the function could issue more commands that make + * use of the current statement's results. Thus this is an inverse for + * PreventTransactionChain. + * + * stmtNode: pointer to parameter block for statement; this is used in + * a very klugy way to determine whether we are inside a function. + * stmtType: statement type name for error messages. + * -------------------------------- + */ +void +RequireTransactionChain(void *stmtNode, const char *stmtType) +{ + /* + * xact block already started? + */ + if (IsTransactionBlock()) + return; + /* + * Are we inside a function call? If the statement's parameter block + * was allocated in QueryContext, assume it is an interactive command. + * Otherwise assume it is coming from a function. + */ + if (!MemoryContextContains(QueryContext, stmtNode)) + return; + /* + * If we are in autocommit-off mode then it's okay, because this + * statement will itself start a transaction block. + */ + if (!autocommit && !suppressChain) + return; + /* translator: %s represents an SQL statement name */ + elog(ERROR, "%s may only be used in begin/end transaction blocks", + stmtType); +} + /* ---------------------------------------------------------------- * transaction block support diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 29909295f51..247ca724383 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.55 2002/09/04 20:31:26 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/pquery.c,v 1.55.2.1 2002/11/18 01:17:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -161,6 +161,8 @@ ProcessQuery(Query *parsetree, /* If binary portal, switch to alternate output format */ if (dest == Remote && parsetree->isBinary) dest = RemoteInternal; + /* Check for invalid context (must be in transaction block) */ + RequireTransactionChain((void *) parsetree, "DECLARE CURSOR"); } else if (parsetree->into != NULL) { diff --git a/src/include/access/xact.h b/src/include/access/xact.h index e16771231d3..1b1be1c8530 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: xact.h,v 1.46 2002/10/21 22:06:20 tgl Exp $ + * $Id: xact.h,v 1.46.2.1 2002/11/18 01:17:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -114,6 +114,7 @@ extern bool IsTransactionBlock(void); extern void UserAbortTransactionBlock(void); extern void AbortOutOfAnyTransaction(void); extern void PreventTransactionChain(void *stmtNode, const char *stmtType); +extern void RequireTransactionChain(void *stmtNode, const char *stmtType); extern void RecordTransactionCommit(void); |