]> granicus.if.org Git - postgresql/commitdiff
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;
                }