diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c
index f09e3a9..8894bdf 100644
*** a/src/backend/utils/cache/inval.c
--- b/src/backend/utils/cache/inval.c
*************** AddInvalidationMessage(InvalidationChunk
*** 264,287 ****
  }
  
  /*
!  * Append one list of invalidation message chunks to another, resetting
!  * the source chunk-list pointer to NULL.
   */
  static void
  AppendInvalidationMessageList(InvalidationChunk **destHdr,
  							  InvalidationChunk **srcHdr)
  {
! 	InvalidationChunk *chunk = *srcHdr;
  
! 	if (chunk == NULL)
  		return;					/* nothing to do */
  
! 	while (chunk->next != NULL)
! 		chunk = chunk->next;
  
! 	chunk->next = *destHdr;
  
! 	*destHdr = *srcHdr;
  
  	*srcHdr = NULL;
  }
--- 264,294 ----
  }
  
  /*
!  * Append the "source" list of invalidation message chunks to the "dest"
!  * list, resetting the source chunk-list pointer to NULL.
!  * Note that if the caller hangs onto the previous source pointer,
!  * the source list is still separately traversable afterwards.
   */
  static void
  AppendInvalidationMessageList(InvalidationChunk **destHdr,
  							  InvalidationChunk **srcHdr)
  {
! 	InvalidationChunk *chunk;
  
! 	if (*srcHdr == NULL)
  		return;					/* nothing to do */
  
! 	chunk = *destHdr;
  
! 	if (chunk == NULL)
! 		*destHdr = *srcHdr;
! 	else
! 	{
! 		while (chunk->next != NULL)
! 			chunk = chunk->next;
  
! 		chunk->next = *srcHdr;
! 	}
  
  	*srcHdr = NULL;
  }
*************** xactGetCommittedInvalidationMessages(Sha
*** 858,867 ****
  	 */
  	oldcontext = MemoryContextSwitchTo(CurTransactionContext);
  
- 	ProcessInvalidationMessagesMulti(&transInvalInfo->CurrentCmdInvalidMsgs,
- 									 MakeSharedInvalidMessagesArray);
  	ProcessInvalidationMessagesMulti(&transInvalInfo->PriorCmdInvalidMsgs,
  									 MakeSharedInvalidMessagesArray);
  	MemoryContextSwitchTo(oldcontext);
  
  	Assert(!(numSharedInvalidMessagesArray > 0 &&
--- 865,874 ----
  	 */
  	oldcontext = MemoryContextSwitchTo(CurTransactionContext);
  
  	ProcessInvalidationMessagesMulti(&transInvalInfo->PriorCmdInvalidMsgs,
  									 MakeSharedInvalidMessagesArray);
+ 	ProcessInvalidationMessagesMulti(&transInvalInfo->CurrentCmdInvalidMsgs,
+ 									 MakeSharedInvalidMessagesArray);
  	MemoryContextSwitchTo(oldcontext);
  
  	Assert(!(numSharedInvalidMessagesArray > 0 &&
*************** AtEOSubXact_Inval(bool isCommit)
*** 1084,1089 ****
--- 1091,1098 ----
  void
  CommandEndInvalidationMessages(void)
  {
+ 	InvalidationListHeader currentCmdInvalidMsgs;
+ 
  	/*
  	 * You might think this shouldn't be called outside any transaction, but
  	 * bootstrap does it, and also ABORT issued when not in a transaction. So
*************** CommandEndInvalidationMessages(void)
*** 1092,1101 ****
  	if (transInvalInfo == NULL)
  		return;
  
! 	ProcessInvalidationMessages(&transInvalInfo->CurrentCmdInvalidMsgs,
! 								LocalExecuteInvalidationMessage);
  	AppendInvalidationMessages(&transInvalInfo->PriorCmdInvalidMsgs,
  							   &transInvalInfo->CurrentCmdInvalidMsgs);
  }
  
  
--- 1101,1113 ----
  	if (transInvalInfo == NULL)
  		return;
  
! 	currentCmdInvalidMsgs = transInvalInfo->CurrentCmdInvalidMsgs;
! 
  	AppendInvalidationMessages(&transInvalInfo->PriorCmdInvalidMsgs,
  							   &transInvalInfo->CurrentCmdInvalidMsgs);
+ 
+ 	ProcessInvalidationMessages(&currentCmdInvalidMsgs,
+ 								LocalExecuteInvalidationMessage);
  }
  
  
