@@ -179,6 +179,7 @@ typedef struct TransactionStateData
179
179
SubTransactionId subTransactionId ; /* my subxact ID */
180
180
char * name ; /* savepoint name, if any */
181
181
int savepointLevel ; /* savepoint level */
182
+ void * savepointContext ; /* savepoint XTM context */
182
183
TransState state ; /* low-level state */
183
184
TBlockState blockState ; /* high-level state */
184
185
int nestingLevel ; /* transaction nesting depth */
@@ -210,6 +211,7 @@ static TransactionStateData TopTransactionStateData = {
210
211
0 , /* subtransaction id */
211
212
NULL , /* savepoint name */
212
213
0 , /* savepoint level */
214
+ NULL , /* savepoint context */
213
215
TRANS_DEFAULT , /* transaction state */
214
216
TBLOCK_DEFAULT , /* transaction block state from the client
215
217
* perspective */
@@ -4264,6 +4266,7 @@ ReleaseSavepoint(List *options)
4264
4266
{
4265
4267
Assert (xact -> blockState == TBLOCK_SUBINPROGRESS );
4266
4268
xact -> blockState = TBLOCK_SUBRELEASE ;
4269
+ TM -> ReleaseSavepointContext (xact -> savepointContext );
4267
4270
if (xact == target )
4268
4271
break ;
4269
4272
xact = xact -> parent ;
@@ -4383,9 +4386,11 @@ RollbackToSavepoint(List *options)
4383
4386
else
4384
4387
elog (FATAL , "RollbackToSavepoint: unexpected state %s" ,
4385
4388
BlockStateAsString (xact -> blockState ));
4389
+ TM -> ReleaseSavepointContext (xact -> savepointContext );
4386
4390
xact = xact -> parent ;
4387
4391
Assert (PointerIsValid (xact ));
4388
4392
}
4393
+ TM -> RestoreSavepointContext (xact -> savepointContext );
4389
4394
4390
4395
/* And mark the target as "restart pending" */
4391
4396
if (xact -> blockState == TBLOCK_SUBINPROGRESS )
@@ -4563,6 +4568,8 @@ RollbackAndReleaseCurrentSubTransaction(void)
4563
4568
CleanupSubTransaction ();
4564
4569
4565
4570
s = CurrentTransactionState ; /* changed by pop */
4571
+ TM -> RestoreSavepointContext (s -> savepointContext );
4572
+
4566
4573
AssertState (s -> blockState == TBLOCK_SUBINPROGRESS ||
4567
4574
s -> blockState == TBLOCK_INPROGRESS ||
4568
4575
s -> blockState == TBLOCK_STARTED );
@@ -5141,6 +5148,7 @@ PushTransaction(void)
5141
5148
GetUserIdAndSecContext (& s -> prevUser , & s -> prevSecContext );
5142
5149
s -> prevXactReadOnly = XactReadOnly ;
5143
5150
s -> parallelModeLevel = 0 ;
5151
+ s -> savepointContext = TM -> CreateSavepointContext ();
5144
5152
5145
5153
CurrentTransactionState = s ;
5146
5154
@@ -5171,6 +5179,7 @@ PopTransaction(void)
5171
5179
if (s -> parent == NULL )
5172
5180
elog (FATAL , "PopTransaction with no parent" );
5173
5181
5182
+ TM -> ReleaseSavepointContext (s -> savepointContext );
5174
5183
CurrentTransactionState = s -> parent ;
5175
5184
5176
5185
/* Let's just make sure CurTransactionContext is good */
0 commit comments