diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2008-10-07 00:05:55 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2008-10-07 00:05:55 +0000 |
commit | 34f89cb4af8690cee78255ada5785686efebc967 (patch) | |
tree | 9b2a64716d95f6b9e2bbe33aa6b69551f87be6b7 | |
parent | 742fd06d98d8b21c32d9651e06c59351508866bb (diff) | |
download | postgresql-34f89cb4af8690cee78255ada5785686efebc967.tar.gz postgresql-34f89cb4af8690cee78255ada5785686efebc967.zip |
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.
-rw-r--r-- | src/backend/utils/sort/tuplestore.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/backend/utils/sort/tuplestore.c b/src/backend/utils/sort/tuplestore.c index e127de34e52..b5bd67c1b4e 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: @@ -450,9 +454,18 @@ tuplestore_select_read_pointer(Tuplestorestate *state, int ptr) 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) |