diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c index 878f8aff01..d0eeb83ab7 100644 --- a/src/backend/access/heap/tuptoaster.c +++ b/src/backend/access/heap/tuptoaster.c @@ -366,6 +366,8 @@ bool init_detoast_iterator(struct varlena *attr, DetoastIterator iterator) struct varatt_external toast_pointer; if (VARATT_IS_EXTERNAL_ONDISK(attr)) { + iterator->done = false; + /* * This is an externally stored datum --- initialize fetch datum iterator */ @@ -373,21 +375,22 @@ bool init_detoast_iterator(struct varlena *attr, DetoastIterator iterator) VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr); if (VARATT_EXTERNAL_IS_COMPRESSED(toast_pointer)) { - /* If it's compressed, prepare buffer for raw data */ + iterator->compressed = true; + + /* prepare buffer to received decompressed data */ iterator->buf = (ToastBuffer *) palloc0(sizeof(ToastBuffer)); init_toast_buffer(iterator->buf, toast_pointer.va_rawsize, false); + + /* initialize state for pglz_decompress_iterate() */ iterator->ctrl = 0; iterator->ctrlc = INVALID_CTRLC; - iterator->compressed = true; - iterator->done = false; } else { - iterator->buf = iterator->fetch_datum_iterator->buf; - iterator->ctrl = 0; - iterator->ctrlc = INVALID_CTRLC; iterator->compressed = false; - iterator->done = false; + + /* point the buffer directly at the raw data */ + iterator->buf = iterator->fetch_datum_iterator->buf; } return true; } @@ -408,16 +411,11 @@ bool init_detoast_iterator(struct varlena *attr, DetoastIterator iterator) return init_detoast_iterator(attr, iterator); } - else if (VARATT_IS_COMPRESSED(attr)) + else { - /* - * This is a compressed value inside of the main tuple - * skip the iterator and just decompress the whole thing. - */ + /* in-line value -- no iteration used, even if it's compressed */ return false; } - - return false; } diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 4688313076..1752f4f9ec 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -1097,9 +1097,11 @@ textpos(PG_FUNCTION_ARGS) text *str; DetoastIteratorData iteratorData; DetoastIterator iter = &iteratorData; + struct varlena *attr = (struct varlena *) + DatumGetPointer(PG_GETARG_DATUM(0)); text *search_str = PG_GETARG_TEXT_PP(1); - if (init_detoast_iterator((struct varlena *) (DatumGetPointer(PG_GETARG_DATUM(0))), iter)) + if (init_detoast_iterator(attr, iter)) { str = (text *) iter->buf->buf; }