Fix bug in parallel tidbitmap iteration.
authorRobert Haas <rhaas@postgresql.org>
Thu, 9 Mar 2017 17:13:48 +0000 (12:13 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 9 Mar 2017 17:13:48 +0000 (12:13 -0500)
Avoid computing idxpages[istate->spageptr] until after checking
that istate->spageptr is a legal index.

Dilip Kumar, per a report from David Rowley

Discussion: http://postgr.es/m/CAKJS1f8OtrHE+-P+=E=4ycnL29e9idZKuaTQ6o2MbhvGN9D8ig@mail.gmail.com

src/backend/nodes/tidbitmap.c

index 44cc9daa03f25d1d2de8e06013e8165d5d832acb..8e915646d93a1a6a06875835033c121572de2424 100644 (file)
@@ -1103,13 +1103,12 @@ tbm_shared_iterate(TBMSharedIterator *iterator)
        if (istate->schunkptr < istate->nchunks)
        {
                PagetableEntry *chunk = &ptbase[idxchunks[istate->schunkptr]];
-               PagetableEntry *page = &ptbase[idxpages[istate->spageptr]];
                BlockNumber chunk_blockno;
 
                chunk_blockno = chunk->blockno + istate->schunkbit;
 
                if (istate->spageptr >= istate->npages ||
-                       chunk_blockno < page->blockno)
+                       chunk_blockno < ptbase[idxpages[istate->spageptr]].blockno)
                {
                        /* Return a lossy page indicator from the chunk */
                        output->blockno = chunk_blockno;