*** src/backend/executor/nodeWindowAgg.c.orig	2014-04-05 07:56:15.000000000 +0100
--- src/backend/executor/nodeWindowAgg.c	2014-04-05 08:03:32.000000000 +0100
*************** window_gettupleslot(WindowObject winobj,
*** 2412,2425 ****
  		winobj->seekpos++;
  	}
  
! 	while (winobj->seekpos > pos)
  	{
! 		if (!tuplestore_gettupleslot(winstate->buffer, false, true, slot))
  			elog(ERROR, "unexpected end of tuplestore");
  		winobj->seekpos--;
  	}
  
! 	while (winobj->seekpos < pos)
  	{
  		if (!tuplestore_gettupleslot(winstate->buffer, true, true, slot))
  			elog(ERROR, "unexpected end of tuplestore");
--- 2412,2443 ----
  		winobj->seekpos++;
  	}
  
! 	/* Advance or rewind until we are within one tuple of the one we want */
! 	while (winobj->seekpos < pos-1)
  	{
! 		if (!tuplestore_advance(winstate->buffer, true))
! 			elog(ERROR, "unexpected end of tuplestore");
! 		winobj->seekpos++;
! 	}
! 
! 	while (winobj->seekpos > pos+1)
! 	{
! 		if (!tuplestore_advance(winstate->buffer, false))
  			elog(ERROR, "unexpected end of tuplestore");
  		winobj->seekpos--;
  	}
  
! 	/*
! 	 * Now we should be on the tuple immediately before or after the one we
! 	 * want, so just fetch forwards or backwards as appropriate.
! 	 */
! 	if (winobj->seekpos > pos)
! 	{
! 		if (!tuplestore_gettupleslot(winstate->buffer, false, true, slot))
! 			elog(ERROR, "unexpected end of tuplestore");
! 		winobj->seekpos--;
! 	}
! 	else
  	{
  		if (!tuplestore_gettupleslot(winstate->buffer, true, true, slot))
  			elog(ERROR, "unexpected end of tuplestore");
