Fix oversight in recent patch to support multiple read positions in
authorTom Lane
Tue, 7 Oct 2008 00:05:55 +0000 (00:05 +0000)
committerTom Lane
Tue, 7 Oct 2008 00:05:55 +0000 (00:05 +0000)
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

index e127de34e52e646672b0d2b65fe20f20ec1cd764..b5bd67c1b4e6fa870154246749ee576809479f12 100644 (file)
@@ -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)