Fix past pd_upper write in ginRedoRecompress()
authorAlexander Korotkov <[email protected]>
Sun, 9 Sep 2018 18:19:29 +0000 (21:19 +0300)
committerAlexander Korotkov <[email protected]>
Sun, 9 Sep 2018 18:42:50 +0000 (21:42 +0300)
commitf9e66f2fbbb49a493045c8d8086a9b15d95b8f18
tree0a6494fe5c162fd40f41348aa340b7a95c6e370c
parent82ebf39fcb25236b60f05e4483d86cb4144fce8a
Fix past pd_upper write in ginRedoRecompress()

ginRedoRecompress() replays actions over compressed segments of posting list
in-place.  However, it might lead to write past pg_upper, because intermediate
state during playing the changes can take more space than both original state
and final state.  This commit fixes that by refuse from in-place modification.
Instead page tail is copied once modification is started, and then it's used
as the source of original segments.  Backpatch to 9.4 where posting list
compression was introduced.

Reported-by: Sivasubramanian Ramasubramanian
Discussion: https://postgr.es/m/1536091151804.6588%40amazon.com
Author: Alexander Korotkov based on patch from and ideas by Sivasubramanian Ramasubramanian
Review: Sivasubramanian Ramasubramanian
Backpatch-through: 9.4
src/backend/access/gin/ginxlog.c