I noticed that the savepointLevel member of TransactionStateData struct is initialized to 0 from TopTransactionStateData, and never incremented or decremented afterwards.
Since this is a file-local struct I think we can simply get rid of all usages of this without any risk. I visited all the commits where this variable was introduced/used/changed and could not find any point in history where it was ever useful. Maybe I missed something, but looks like it is a leftover from someone's forward-thinking. Patch attached. Regards, -- Gurjeet Singh EnterpriseDB Corporation The Enterprise PostgreSQL Company
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 3dab45c..cde3772 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -132,7 +132,6 @@ typedef struct TransactionStateData TransactionId transactionId; /* my XID, or Invalid if none */ SubTransactionId subTransactionId; /* my subxact ID */ char *name; /* savepoint name, if any */ - int savepointLevel; /* savepoint level */ TransState state; /* low-level state */ TBlockState blockState; /* high-level state */ int nestingLevel; /* transaction nesting depth */ @@ -2641,12 +2640,10 @@ CommitTransactionCommand(void) case TBLOCK_SUBRESTART: { char *name; - int savepointLevel; /* save name and keep Cleanup from freeing it */ name = s->name; s->name = NULL; - savepointLevel = s->savepointLevel; AbortSubTransaction(); CleanupSubTransaction(); @@ -2654,7 +2651,6 @@ CommitTransactionCommand(void) DefineSavepoint(NULL); s = CurrentTransactionState; /* changed by push */ s->name = name; - s->savepointLevel = savepointLevel; /* This is the same as TBLOCK_SUBBEGIN case */ AssertState(s->blockState == TBLOCK_SUBBEGIN); @@ -2670,19 +2666,16 @@ CommitTransactionCommand(void) case TBLOCK_SUBABORT_RESTART: { char *name; - int savepointLevel; /* save name and keep Cleanup from freeing it */ name = s->name; s->name = NULL; - savepointLevel = s->savepointLevel; CleanupSubTransaction(); DefineSavepoint(NULL); s = CurrentTransactionState; /* changed by push */ s->name = name; - s->savepointLevel = savepointLevel; /* This is the same as TBLOCK_SUBBEGIN case */ AssertState(s->blockState == TBLOCK_SUBBEGIN); @@ -3536,12 +3529,6 @@ ReleaseSavepoint(List *options) (errcode(ERRCODE_S_E_INVALID_SPECIFICATION), errmsg("no such savepoint"))); - /* disallow crossing savepoint level boundaries */ - if (target->savepointLevel != s->savepointLevel) - ereport(ERROR, - (errcode(ERRCODE_S_E_INVALID_SPECIFICATION), - errmsg("no such savepoint"))); - /* * Mark "commit pending" all subtransactions up to the target * subtransaction. The actual commits will happen when control gets to @@ -3635,12 +3622,6 @@ RollbackToSavepoint(List *options) (errcode(ERRCODE_S_E_INVALID_SPECIFICATION), errmsg("no such savepoint"))); - /* disallow crossing savepoint level boundaries */ - if (target->savepointLevel != s->savepointLevel) - ereport(ERROR, - (errcode(ERRCODE_S_E_INVALID_SPECIFICATION), - errmsg("no such savepoint"))); - /* * Mark "abort pending" all subtransactions up to the target * subtransaction. The actual aborts will happen when control gets to @@ -4287,7 +4268,6 @@ PushTransaction(void) s->parent = p; s->nestingLevel = p->nestingLevel + 1; s->gucNestLevel = NewGUCNestLevel(); - s->savepointLevel = p->savepointLevel; s->state = TRANS_DEFAULT; s->blockState = TBLOCK_SUBBEGIN; GetUserIdAndSecContext(&s->prevUser, &s->prevSecContext);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers