Attached is a patch fixing this.
One question I do have:
if (target->savepointLevel != s->savepointLevel)
Will this ever be true in the current code? I cannot see anything setting
savepointLevel explicitly.
Gavin
Index: src/backend/access/transam/xact.c
===================================================================
RCS file: /usr/local/cvsroot/pgsql-server/src/backend/access/transam/xact.c,v
retrieving revision 1.176
diff -2 -c -r1.176 xact.c
*** src/backend/access/transam/xact.c 1 Aug 2004 20:57:59 -0000 1.176
--- src/backend/access/transam/xact.c 3 Aug 2004 11:08:02 -0000
***************
*** 2523,2532 ****
target = CurrentTransactionState;
- while (target != NULL)
- {
- if (PointerIsValid(target->name) && strcmp(target->name, name) == 0)
- break;
- target = target->parent;
/* we don't cross savepoint level boundaries */
if (target->savepointLevel != s->savepointLevel)
--- 2523,2529 ----
target = CurrentTransactionState;
+ while(PointerIsValid(target))
+ {
/* we don't cross savepoint level boundaries */
if (target->savepointLevel != s->savepointLevel)
***************
*** 2534,2539 ****
(errcode(ERRCODE_S_E_INVALID_SPECIFICATION),
errmsg("no such savepoint")));
- }
if (!PointerIsValid(target))
ereport(ERROR,
--- 2531,2539 ----
(errcode(ERRCODE_S_E_INVALID_SPECIFICATION),
errmsg("no such savepoint")));
+ if (PointerIsValid(target->name) && strcmp(target->name, name) == 0)
+ break;
+ target = target->parent;
+ }
if (!PointerIsValid(target))
ereport(ERROR,
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org