diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 0b558e5..8afe3d0 100644 *** a/src/backend/executor/nodeWindowAgg.c --- b/src/backend/executor/nodeWindowAgg.c *************** window_gettupleslot(WindowObject winobj, *** 1945,1958 **** 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"); --- 1945,1976 ---- 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");