rearrange-init-iter.patch
application/x-patch
Filename: rearrange-init-iter.patch
Type: application/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/access/heap/tuptoaster.c | 12 | 14 |
| src/backend/utils/adt/varlena.c | 3 | 1 |
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;
}