On Fri, 2007-09-07 at 14:00 +0100, Simon Riggs wrote:
Short patch
--
Simon Riggs
2ndQuadrant http://www.2ndQuadrant.com
Index: doc/src/sgml/ref/set_transaction.sgml
===
RCS file: /projects/cvsroot/pgsql/doc/src/sgml/ref/set_transaction.sgml,v
retrieving revision 1.25
diff -c -r1.25 set_transaction.sgml
*** doc/src/sgml/ref/set_transaction.sgml 16 Sep 2006 00:30:20 - 1.25
--- doc/src/sgml/ref/set_transaction.sgml 7 Sep 2007 12:49:05 -
***
*** 31,42
para
The commandSET TRANSACTION/command command sets the
!characteristics of the current transaction. It has no effect on any
!subsequent transactions. commandSET SESSION
!CHARACTERISTICS/command sets the default transaction
!characteristics for subsequent transactions of a session. These
!defaults can be overridden by commandSET TRANSACTION/command
!for an individual transaction.
/para
para
--- 31,43
para
The commandSET TRANSACTION/command command sets the
!characteristics of the current or next transaction. If the command
!executed from within a transaction block it will set the current
!transaction, otherwise the specified characteristics will apply to
!the next transaction. commandSET SESSION CHARACTERISTICS/command
!sets the default transaction characteristics for subsequent
!transactions of a session. These defaults can be overridden by
!commandSET TRANSACTION/command for an individual transaction.
/para
para
***
*** 112,120
para
If commandSET TRANSACTION/command is executed without a prior
!commandSTART TRANSACTION/command or commandBEGIN/command,
!it will appear to have no effect, since the transaction will immediately
!end.
/para
para
--- 113,125
para
If commandSET TRANSACTION/command is executed without a prior
!commandSTART TRANSACTION/command or commandBEGIN/command,
!then the next transaction (only) on this session will acquire the
!specified transaction characteristics. Those characteristics may
!be overridden if any conflicting options exist on the
!commandSTART TRANSACTION/command or commandBEGIN/command, if
!one is issued for the next transaction. This is new behaviour in
!Release 8.3 to conform with the SQL standard.
/para
para
Index: src/backend/access/transam/xact.c
===
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xact.c,v
retrieving revision 1.248
diff -c -r1.248 xact.c
*** src/backend/access/transam/xact.c 5 Sep 2007 18:10:47 - 1.248
--- src/backend/access/transam/xact.c 7 Sep 2007 12:49:09 -
***
*** 52,60
--- 52,62
*/
int DefaultXactIsoLevel = XACT_READ_COMMITTED;
int XactIsoLevel;
+ int nextXactIsoLevel = XACT_ISOLATION_NOT_SET;
bool DefaultXactReadOnly = false;
bool XactReadOnly;
+ bool nextXactReadOnly = false;
bool XactSyncCommit = true;
***
*** 1388,1395
* Make sure we've freed any old snapshot, and reset xact state variables
*/
FreeXactSnapshot();
! XactIsoLevel = DefaultXactIsoLevel;
! XactReadOnly = DefaultXactReadOnly;
forceSyncCommit = false;
/*
--- 1390,1412
* Make sure we've freed any old snapshot, and reset xact state variables
*/
FreeXactSnapshot();
!
! if (nextXactIsoLevel != XACT_ISOLATION_NOT_SET)
! {
! XactIsoLevel = nextXactIsoLevel;
! nextXactIsoLevel = XACT_ISOLATION_NOT_SET;
! }
! else
! XactIsoLevel = DefaultXactIsoLevel;
!
! if (nextXactReadOnly)
! {
! XactReadOnly = true;
! nextXactReadOnly = false;
! }
! else
! XactReadOnly = DefaultXactReadOnly;
!
forceSyncCommit = false;
/*
Index: src/backend/commands/variable.c
===
RCS file: /projects/cvsroot/pgsql/src/backend/commands/variable.c,v
retrieving revision 1.121
diff -c -r1.121 variable.c
*** src/backend/commands/variable.c 4 Aug 2007 01:26:53 - 1.121
--- src/backend/commands/variable.c 7 Sep 2007 12:49:10 -
***
*** 604,609
--- 604,618
else
return NULL;
+ /*
+ * If we are setting isolation level and we are not in a transaction block
+ * then set the level for the next transaction, as per SQL standard.
+ * We allow the mode to be set for the current transaction, since this
+ * is historic behaviour and harmless.
+ */
+ if (!IsTransactionBlock())
+ nextXactIsoLevel = XactIsoLevel;
+
return value;
}
Index: src/backend/utils/misc/guc.c
===
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.416
diff -c -r1.416 guc.c
*** src/backend/utils/misc/guc.c 3 Sep 2007 18:46:30 - 1.416
---