diff options
Diffstat (limited to 'src/backend/access/gin/gindatapage.c')
-rw-r--r-- | src/backend/access/gin/gindatapage.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index aeaf8adab09..9f20513811e 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -1394,7 +1394,8 @@ disassembleLeaf(Page page) { /* * A pre-9.4 format uncompressed page is represented by a single - * segment, with an array of items. + * segment, with an array of items. The corner case is uncompressed + * page containing no items, which is represented as no segments. */ ItemPointer uncompressed; int nuncompressed; @@ -1402,15 +1403,18 @@ disassembleLeaf(Page page) uncompressed = dataLeafPageGetUncompressed(page, &nuncompressed); - seginfo = palloc(sizeof(leafSegmentInfo)); + if (nuncompressed > 0) + { + seginfo = palloc(sizeof(leafSegmentInfo)); - seginfo->action = GIN_SEGMENT_REPLACE; - seginfo->seg = NULL; - seginfo->items = palloc(nuncompressed * sizeof(ItemPointerData)); - memcpy(seginfo->items, uncompressed, nuncompressed * sizeof(ItemPointerData)); - seginfo->nitems = nuncompressed; + seginfo->action = GIN_SEGMENT_REPLACE; + seginfo->seg = NULL; + seginfo->items = palloc(nuncompressed * sizeof(ItemPointerData)); + memcpy(seginfo->items, uncompressed, nuncompressed * sizeof(ItemPointerData)); + seginfo->nitems = nuncompressed; - dlist_push_tail(&leaf->segments, &seginfo->node); + dlist_push_tail(&leaf->segments, &seginfo->node); + } leaf->oldformat = true; } |