*** tuplesort.c	2007-11-26 18:30:21.000000000 +0100
--- tuplesort.c.new	2007-11-26 18:30:11.000000000 +0100
***************
*** 810,820 ****
  	 * On a 64-bit machine, allowedMem could be high enough to get us into
  	 * trouble with MaxAllocSize, too.
  	 */
  	if ((Size) (state->memtupsize * 2) >= MaxAllocSize / sizeof(SortTuple))
! 		return false;
  
  	FREEMEM(state, GetMemoryChunkSpace(state->memtuples));
- 	state->memtupsize *= 2;
  	state->memtuples = (SortTuple *)
  		repalloc(state->memtuples,
  				 state->memtupsize * sizeof(SortTuple));
--- 810,837 ----
  	 * On a 64-bit machine, allowedMem could be high enough to get us into
  	 * trouble with MaxAllocSize, too.
  	 */
+ 
+ 	if ((Size) (state->memtupsize)  + 1 >= MaxAllocSize / sizeof(SortTuple))
+ 	{
+ 	  elog(DEBUG1, "memtupsize %d reached MaxAllocSize %lu", 
+ 	       state->memtupsize, MaxAllocSize);
+ 	  /* max alloc size already reached */
+ 	  return false;
+ 	}
+ 
  	if ((Size) (state->memtupsize * 2) >= MaxAllocSize / sizeof(SortTuple))
! 	{
! 	  /* use the maximum allowed alloc size */
! 	  state->memtupsize = (MaxAllocSize / sizeof(SortTuple) - 1);
! 	  elog(DEBUG1, "memtupsize %d exceeds MaxAllocSize %lu, readjusted", 
! 	       state->memtupsize * 2, MaxAllocSize);
! 	}
! 	else
! 	{
! 	  state->memtupsize *= 2;
! 	}
  
  	FREEMEM(state, GetMemoryChunkSpace(state->memtuples));
  	state->memtuples = (SortTuple *)
  		repalloc(state->memtuples,
  				 state->memtupsize * sizeof(SortTuple));
