From 34f89cb4af8690cee78255ada5785686efebc967 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 7 Oct 2008 00:05:55 +0000 Subject: [PATCH] Fix oversight in recent patch to support multiple read positions in tuplestore: in READFILE state tuplestore_select_read_pointer must save the current file seek position in the read pointer being deactivated. --- src/backend/utils/sort/tuplestore.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/sort/tuplestore.c b/src/backend/utils/sort/tuplestore.c index e127de34e5..b5bd67c1b4 100644 --- a/src/backend/utils/sort/tuplestore.c +++ b/src/backend/utils/sort/tuplestore.c @@ -46,7 +46,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/sort/tuplestore.c,v 1.41 2008/10/04 21:56:54 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/sort/tuplestore.c,v 1.42 2008/10/07 00:05:55 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -434,7 +434,8 @@ tuplestore_end(Tuplestorestate *state) void tuplestore_select_read_pointer(Tuplestorestate *state, int ptr) { - TSReadPointer *readptr = &state->readptrs[ptr]; + TSReadPointer *readptr; + TSReadPointer *oldptr; Assert(ptr >= 0 && ptr < state->readptrcount); @@ -442,6 +443,9 @@ tuplestore_select_read_pointer(Tuplestorestate *state, int ptr) if (ptr == state->activeptr) return; + readptr = &state->readptrs[ptr]; + oldptr = &state->readptrs[state->activeptr]; + switch (state->status) { case TSS_INMEM: @@ -449,10 +453,19 @@ tuplestore_select_read_pointer(Tuplestorestate *state, int ptr) /* no work */ break; case TSS_READFILE: + /* + * First, save the current read position in the pointer about + * to become inactive. + */ + if (!oldptr->eof_reached) + BufFileTell(state->myfile, + &oldptr->file, + &oldptr->offset); + /* * We have to make the temp file's seek position equal to the - * logical position of the read pointer. In eof_reached state, - * that's the EOF, which we have available from the saved + * logical position of the new read pointer. In eof_reached + * state, that's the EOF, which we have available from the saved * write position. */ if (readptr->eof_reached)