]> granicus.if.org Git - postgresql/commitdiff
Fix incorrect loop counts in tidbitmap.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 15 Nov 2013 23:34:14 +0000 (18:34 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 15 Nov 2013 23:34:14 +0000 (18:34 -0500)
A couple of places that should have been iterating over WORDS_PER_CHUNK
words were iterating over WORDS_PER_PAGE words instead.  This thinko
accidentally failed to fail, because (at least on common architectures
with default BLCKSZ) WORDS_PER_CHUNK is a bit less than WORDS_PER_PAGE,
and the extra words being looked at were always zero so nothing happened.
Still, it's a bug waiting to happen if anybody ever fools with the
parameters affecting TIDBitmap sizes, and it's a small waste of cycles
too.  So back-patch to all active branches.

Etsuro Fujita

src/backend/nodes/tidbitmap.c

index 3ef01126ae496a62771e04b9a9a3ab93002fdeae..43628aceb46b2d5f0489a0d2bf39c635edeb2137 100644 (file)
@@ -361,7 +361,7 @@ tbm_union_page(TIDBitmap *a, const PagetableEntry *bpage)
        if (bpage->ischunk)
        {
                /* Scan b's chunk, mark each indicated page lossy in a */
-               for (wordnum = 0; wordnum < WORDS_PER_PAGE; wordnum++)
+               for (wordnum = 0; wordnum < WORDS_PER_CHUNK; wordnum++)
                {
                        bitmapword      w = bpage->words[wordnum];
 
@@ -473,7 +473,7 @@ tbm_intersect_page(TIDBitmap *a, PagetableEntry *apage, const TIDBitmap *b)
                /* Scan each bit in chunk, try to clear */
                bool            candelete = true;
 
-               for (wordnum = 0; wordnum < WORDS_PER_PAGE; wordnum++)
+               for (wordnum = 0; wordnum < WORDS_PER_CHUNK; wordnum++)
                {
                        bitmapword      w = apage->words[wordnum];