@@ -4786,8 +4786,8 @@ Size
47864786EstimateTransactionStateSpace (void )
47874787{
47884788TransactionState s ;
4789- Size nxids = 5 ;/* iso level, deferrable, top & current XID,
4790- * XID count */
4789+ Size nxids = 6 ;/* iso level, deferrable, top & current XID,
4790+ *command counter, XID count */
47914791
47924792for (s = CurrentTransactionState ;s != NULL ;s = s -> parent )
47934793{
@@ -4807,27 +4807,30 @@ EstimateTransactionStateSpace(void)
48074807 *
48084808 * We need to save and restore XactDeferrable, XactIsoLevel, and the XIDs
48094809 * associated with this transaction. The first eight bytes of the result
4810- * contain XactDeferrable and XactIsoLevel; the next eight bytes contain the
4811- * XID of the top-level transaction and the XID of the current transaction
4812- * (or, in each case, InvalidTransactionId if none). After that, the next 4
4813- * bytes contain a count of how many additional XIDs follow; this is followed
4814- * by all of those XIDs one after another. We emit the XIDs in sorted order
4815- * for the convenience of the receiving process.
4810+ * contain XactDeferrable and XactIsoLevel; the next twelve bytes contain the
4811+ * XID of the top-level transaction, the XID of the current transaction
4812+ * (or, in each case, InvalidTransactionId if none), and the current command
4813+ * counter. After that, the next 4 bytes contain a count of how many
4814+ * additional XIDs follow; this is followed by all of those XIDs one after
4815+ * another. We emit the XIDs in sorted order for the convenience of the
4816+ * receiving process.
48164817 */
48174818void
48184819SerializeTransactionState (Size maxsize ,char * start_address )
48194820{
48204821TransactionState s ;
48214822Size nxids = 0 ;
48224823Size i = 0 ;
4824+ Size c = 0 ;
48234825TransactionId * workspace ;
48244826TransactionId * result = (TransactionId * )start_address ;
48254827
4826- Assert (maxsize >=5 * sizeof (TransactionId ));
4827- result [0 ]= (TransactionId )XactIsoLevel ;
4828- result [1 ]= (TransactionId )XactDeferrable ;
4829- result [2 ]= XactTopTransactionId ;
4830- result [3 ]= CurrentTransactionState -> transactionId ;
4828+ result [c ++ ]= (TransactionId )XactIsoLevel ;
4829+ result [c ++ ]= (TransactionId )XactDeferrable ;
4830+ result [c ++ ]= XactTopTransactionId ;
4831+ result [c ++ ]= CurrentTransactionState -> transactionId ;
4832+ result [c ++ ]= (TransactionId )currentCommandId ;
4833+ Assert (maxsize >=c * sizeof (TransactionId ));
48314834
48324835/*
48334836 * If we're running in a parallel worker and launching a parallel worker
@@ -4836,9 +4839,9 @@ SerializeTransactionState(Size maxsize, char *start_address)
48364839 */
48374840if (nParallelCurrentXids > 0 )
48384841{
4839- Assert ( maxsize > ( nParallelCurrentXids + 4 ) * sizeof ( TransactionId )) ;
4840- result [ 4 ] = nParallelCurrentXids ;
4841- memcpy (& result [5 ],ParallelCurrentXids ,
4842+ result [ c ++ ] = nParallelCurrentXids ;
4843+ Assert ( maxsize >= ( nParallelCurrentXids + c ) * sizeof ( TransactionId )) ;
4844+ memcpy (& result [c ],ParallelCurrentXids ,
48424845nParallelCurrentXids * sizeof (TransactionId ));
48434846return ;
48444847}
@@ -4853,7 +4856,7 @@ SerializeTransactionState(Size maxsize, char *start_address)
48534856nxids = add_size (nxids ,1 );
48544857nxids = add_size (nxids ,s -> nChildXids );
48554858}
4856- Assert (nxids * sizeof (TransactionId )< maxsize );
4859+ Assert (( c + 1 + nxids ) * sizeof (TransactionId ) <= maxsize );
48574860
48584861/* Copy them to our scratch space. */
48594862workspace = palloc (nxids * sizeof (TransactionId ));
@@ -4871,8 +4874,8 @@ SerializeTransactionState(Size maxsize, char *start_address)
48714874qsort (workspace ,nxids ,sizeof (TransactionId ),xidComparator );
48724875
48734876/* Copy data into output area. */
4874- result [4 ]= (TransactionId )nxids ;
4875- memcpy (& result [5 ],workspace ,nxids * sizeof (TransactionId ));
4877+ result [c ++ ]= (TransactionId )nxids ;
4878+ memcpy (& result [c ],workspace ,nxids * sizeof (TransactionId ));
48764879}
48774880
48784881/*
@@ -4892,8 +4895,9 @@ StartParallelWorkerTransaction(char *tstatespace)
48924895XactDeferrable = (bool )tstate [1 ];
48934896XactTopTransactionId = tstate [2 ];
48944897CurrentTransactionState -> transactionId = tstate [3 ];
4895- nParallelCurrentXids = (int )tstate [4 ];
4896- ParallelCurrentXids = & tstate [5 ];
4898+ currentCommandId = tstate [4 ];
4899+ nParallelCurrentXids = (int )tstate [5 ];
4900+ ParallelCurrentXids = & tstate [6 ];
48974901
48984902CurrentTransactionState -> blockState = TBLOCK_PARALLEL_INPROGRESS ;
48994903}