Properly determine length for on-disk TOAST values
In detoast_attr_slice, VARSIZE_ANY was used to compute compressed length of on-disk TOAST values. That's incorrect, because the varlena value may be just a TOAST pointer, producing either bogus value or crashing. This is likely why the code was crashing on big-endian machines before 540f31680913 replaced the VARSIZE with VARSIZE_ANY, which however only masked the issue. Reported-by: Rushabh Lathia Discussion: https://postgr.es/m/CAL-OGkthU9Gs7TZchf5OWaL-Gsi=hXqufTxKv9qpNG73d5na_g@mail.gmail.com
This commit is contained in:
parent
d482f7f867
commit
2dc08bd617
@ -233,7 +233,7 @@ detoast_attr_slice(struct varlena *attr,
|
||||
* of a given length (after decompression).
|
||||
*/
|
||||
max_size = pglz_maximum_compressed_size(sliceoffset + slicelength,
|
||||
TOAST_COMPRESS_SIZE(attr));
|
||||
toast_pointer.va_extsize);
|
||||
|
||||
/*
|
||||
* Fetch enough compressed slices (compressed marker will get set
|
||||
|
Loading…
x
Reference in New Issue
Block a user