Fix failure when a shared tidbitmap has only one page.
authorRobert Haas <rhaas@postgresql.org>
Tue, 11 Apr 2017 16:03:12 +0000 (12:03 -0400)
committerRobert Haas <rhaas@postgresql.org>
Tue, 11 Apr 2017 16:06:01 +0000 (12:06 -0400)
Commit 98e6e89040a0534ca26914c66cae9dd49ef62ad9 made inadequate
provision for the case of a single-page shared tidbitmap.  It
allocate space for a shared PagetableEntry, but failed to
initialize it.

Report by Thomas Munro.  Patch by Dilip Kumar, with some comment
changes by me.

Discussion: http://postgr.es/m/CAEepm=19Cmnfbi-j2Bw-a6yGPeHE1OVhKvvKz9bRBTJGKfGHMA@mail.gmail.com

src/backend/nodes/tidbitmap.c

index eab8f68356426dbabf91713fbf44553966188524..c66019e3ba11ee947296df17c1528ef3b2c35a81 100644 (file)
@@ -866,12 +866,14 @@ tbm_prepare_shared_iterate(TIDBitmap *tbm)
        else if (tbm->status == TBM_ONE_PAGE)
        {
            /*
-            * In one page mode allocate the space for one pagetable entry and
-            * directly store its index i.e. 0 in page array
+            * In one page mode allocate the space for one pagetable entry,
+            * initialize it, and directly store its index (i.e. 0) in the
+            * page array.
             */
            tbm->dsapagetable = dsa_allocate(tbm->dsa, sizeof(PTEntryArray) +
                                             sizeof(PagetableEntry));
            ptbase = dsa_get_address(tbm->dsa, tbm->dsapagetable);
+           memcpy(ptbase->ptentry, &tbm->entry1, sizeof(PagetableEntry));
            ptpages->index[0] = 0;
        }