rearrange-init-iter.patch

application/x-patch

Filename: rearrange-init-iter.patch
Type: application/x-patch
Part: 0
Message: Re: [proposal] de-TOAST'ing using a iterator

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;
 	}