From 2e8b6bfa90b252b1e1758364de7deff067d6058a Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 4 Oct 2019 14:24:46 -0400 Subject: [PATCH] Rename some toasting functions based on whether they are heap-specific. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The old names for the attribute-detoasting functions names included the word "heap," which seems outdated now that the heap is only one of potentially many table access methods. On the other hand, toast_insert_or_update and toast_delete are heap-specific, so rename them by adding "heap_" as a prefix. Not all of the work of making the TOAST system fully accessible to AMs other than the heap is done yet, but there seems to be little harm in getting this renaming out of the way now. Commit 8b94dab06617ef80a0901ab103ebd8754427ef5a already divided up the functions among various files partially according to whether it was intended that they should be heap-specific or AM-agnostic, so this is just clarifying the division contemplated by that commit. Patch by me, reviewed and tested by Prabhat Sabu, Thomas Munro, Andres Freund, and Álvaro Herrera. Discussion: http://postgr.es/m/CA+TgmoZv-=2iWM4jcw5ZhJeL18HF96+W1yJeYrnGMYdkFFnEpQ@mail.gmail.com --- src/backend/access/common/detoast.c | 26 +++++++++++----------- src/backend/access/common/indextuple.c | 2 +- src/backend/access/heap/heapam.c | 8 +++---- src/backend/access/heap/heaptoast.c | 23 ++++++++++--------- src/backend/access/heap/rewriteheap.c | 4 ++-- src/backend/access/table/toast_helper.c | 4 ++-- src/backend/executor/tstoreReceiver.c | 2 +- src/backend/storage/large_object/inv_api.c | 2 +- src/backend/utils/adt/expandedrecord.c | 4 ++-- src/backend/utils/fmgr/fmgr.c | 8 +++---- src/include/access/detoast.h | 16 ++++++------- src/include/access/heaptoast.h | 12 +++++----- src/pl/plpgsql/src/pl_exec.c | 2 +- src/test/regress/regress.c | 2 +- 14 files changed, 58 insertions(+), 57 deletions(-) diff --git a/src/backend/access/common/detoast.c b/src/backend/access/common/detoast.c index 47a03fa98b9..b25ca6810bc 100644 --- a/src/backend/access/common/detoast.c +++ b/src/backend/access/common/detoast.c @@ -30,7 +30,7 @@ static struct varlena *toast_decompress_datum(struct varlena *attr); static struct varlena *toast_decompress_datum_slice(struct varlena *attr, int32 slicelength); /* ---------- - * heap_tuple_fetch_attr - + * detoast_external_attr - * * Public entry point to get back a toasted value from * external source (possibly still in compressed format). @@ -42,7 +42,7 @@ static struct varlena *toast_decompress_datum_slice(struct varlena *attr, int32 * ---------- */ struct varlena * -heap_tuple_fetch_attr(struct varlena *attr) +detoast_external_attr(struct varlena *attr) { struct varlena *result; @@ -68,7 +68,7 @@ heap_tuple_fetch_attr(struct varlena *attr) /* recurse if value is still external in some other way */ if (VARATT_IS_EXTERNAL(attr)) - return heap_tuple_fetch_attr(attr); + return detoast_external_attr(attr); /* * Copy into the caller's memory context, in case caller tries to @@ -103,7 +103,7 @@ heap_tuple_fetch_attr(struct varlena *attr) /* ---------- - * heap_tuple_untoast_attr - + * detoast_attr - * * Public entry point to get back a toasted value from compression * or external storage. The result is always non-extended varlena form. @@ -113,7 +113,7 @@ heap_tuple_fetch_attr(struct varlena *attr) * ---------- */ struct varlena * -heap_tuple_untoast_attr(struct varlena *attr) +detoast_attr(struct varlena *attr) { if (VARATT_IS_EXTERNAL_ONDISK(attr)) { @@ -144,7 +144,7 @@ heap_tuple_untoast_attr(struct varlena *attr) Assert(!VARATT_IS_EXTERNAL_INDIRECT(attr)); /* recurse in case value is still extended in some other way */ - attr = heap_tuple_untoast_attr(attr); + attr = detoast_attr(attr); /* if it isn't, we'd better copy it */ if (attr == (struct varlena *) redirect.pointer) @@ -161,7 +161,7 @@ heap_tuple_untoast_attr(struct varlena *attr) /* * This is an expanded-object pointer --- get flat format */ - attr = heap_tuple_fetch_attr(attr); + attr = detoast_external_attr(attr); /* flatteners are not allowed to produce compressed/short output */ Assert(!VARATT_IS_EXTENDED(attr)); } @@ -192,7 +192,7 @@ heap_tuple_untoast_attr(struct varlena *attr) /* ---------- - * heap_tuple_untoast_attr_slice - + * detoast_attr_slice - * * Public entry point to get back part of a toasted value * from compression or external storage. @@ -201,7 +201,7 @@ heap_tuple_untoast_attr(struct varlena *attr) * ---------- */ struct varlena * -heap_tuple_untoast_attr_slice(struct varlena *attr, +detoast_attr_slice(struct varlena *attr, int32 sliceoffset, int32 slicelength) { struct varlena *preslice; @@ -253,13 +253,13 @@ heap_tuple_untoast_attr_slice(struct varlena *attr, /* nested indirect Datums aren't allowed */ Assert(!VARATT_IS_EXTERNAL_INDIRECT(redirect.pointer)); - return heap_tuple_untoast_attr_slice(redirect.pointer, + return detoast_attr_slice(redirect.pointer, sliceoffset, slicelength); } else if (VARATT_IS_EXTERNAL_EXPANDED(attr)) { - /* pass it off to heap_tuple_fetch_attr to flatten */ - preslice = heap_tuple_fetch_attr(attr); + /* pass it off to detoast_external_attr to flatten */ + preslice = detoast_external_attr(attr); } else preslice = attr; @@ -771,7 +771,7 @@ toast_decompress_datum(struct varlena *attr) * toast_decompress_datum_slice - * * Decompress the front of a compressed version of a varlena datum. - * offset handling happens in heap_tuple_untoast_attr_slice. + * offset handling happens in detoast_attr_slice. * Here we just decompress a slice from the front. */ static struct varlena * diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c index 07586201b9d..8a5f5227a30 100644 --- a/src/backend/access/common/indextuple.c +++ b/src/backend/access/common/indextuple.c @@ -89,7 +89,7 @@ index_form_tuple(TupleDesc tupleDescriptor, if (VARATT_IS_EXTERNAL(DatumGetPointer(values[i]))) { untoasted_values[i] = - PointerGetDatum(heap_tuple_fetch_attr((struct varlena *) + PointerGetDatum(detoast_external_attr((struct varlena *) DatumGetPointer(values[i]))); untoasted_free[i] = true; } diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index e9544822bf9..0128bb34ef6 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -2085,7 +2085,7 @@ heap_prepare_insert(Relation relation, HeapTuple tup, TransactionId xid, return tup; } else if (HeapTupleHasExternal(tup) || tup->t_len > TOAST_TUPLE_THRESHOLD) - return toast_insert_or_update(relation, tup, NULL, options); + return heap_toast_insert_or_update(relation, tup, NULL, options); else return tup; } @@ -2809,7 +2809,7 @@ l1: Assert(!HeapTupleHasExternal(&tp)); } else if (HeapTupleHasExternal(&tp)) - toast_delete(relation, &tp, false); + heap_toast_delete(relation, &tp, false); /* * Mark tuple for invalidation from system caches at next command @@ -3504,7 +3504,7 @@ l2: if (need_toast) { /* Note we always use WAL and FSM during updates */ - heaptup = toast_insert_or_update(relation, newtup, &oldtup, 0); + heaptup = heap_toast_insert_or_update(relation, newtup, &oldtup, 0); newtupsize = MAXALIGN(heaptup->t_len); } else @@ -5673,7 +5673,7 @@ heap_abort_speculative(Relation relation, ItemPointer tid) if (HeapTupleHasExternal(&tp)) { Assert(!IsToastRelation(relation)); - toast_delete(relation, &tp, true); + heap_toast_delete(relation, &tp, true); } /* diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c index fbf9294598a..dcfdee4467d 100644 --- a/src/backend/access/heap/heaptoast.c +++ b/src/backend/access/heap/heaptoast.c @@ -12,11 +12,11 @@ * * * INTERFACE ROUTINES - * toast_insert_or_update - + * heap_toast_insert_or_update - * Try to make a given tuple fit into one page by compressing * or moving off attributes * - * toast_delete - + * heap_toast_delete - * Reclaim toast storage when a tuple is deleted * *------------------------------------------------------------------------- @@ -32,13 +32,13 @@ /* ---------- - * toast_delete - + * heap_toast_delete - * * Cascaded delete toast-entries on DELETE * ---------- */ void -toast_delete(Relation rel, HeapTuple oldtup, bool is_speculative) +heap_toast_delete(Relation rel, HeapTuple oldtup, bool is_speculative) { TupleDesc tupleDesc; Datum toast_values[MaxHeapAttributeNumber]; @@ -73,7 +73,7 @@ toast_delete(Relation rel, HeapTuple oldtup, bool is_speculative) /* ---------- - * toast_insert_or_update - + * heap_toast_insert_or_update - * * Delete no-longer-used toast-entries and create new ones to * make the new tuple fit on INSERT or UPDATE @@ -91,8 +91,8 @@ toast_delete(Relation rel, HeapTuple oldtup, bool is_speculative) * ---------- */ HeapTuple -toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup, - int options) +heap_toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup, + int options) { HeapTuple result_tuple; TupleDesc tupleDesc; @@ -369,7 +369,7 @@ toast_flatten_tuple(HeapTuple tup, TupleDesc tupleDesc) new_value = (struct varlena *) DatumGetPointer(toast_values[i]); if (VARATT_IS_EXTERNAL(new_value)) { - new_value = heap_tuple_fetch_attr(new_value); + new_value = detoast_external_attr(new_value); toast_values[i] = PointerGetDatum(new_value); toast_free[i] = true; } @@ -484,7 +484,7 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup, if (VARATT_IS_EXTERNAL(new_value) || VARATT_IS_COMPRESSED(new_value)) { - new_value = heap_tuple_untoast_attr(new_value); + new_value = detoast_attr(new_value); toast_values[i] = PointerGetDatum(new_value); toast_free[i] = true; } @@ -494,7 +494,8 @@ toast_flatten_tuple_to_datum(HeapTupleHeader tup, /* * Calculate the new size of the tuple. * - * This should match the reconstruction code in toast_insert_or_update. + * This should match the reconstruction code in + * heap_toast_insert_or_update. */ new_header_len = SizeofHeapTupleHeader; if (has_nulls) @@ -583,7 +584,7 @@ toast_build_flattened_tuple(TupleDesc tupleDesc, new_value = (struct varlena *) DatumGetPointer(new_values[i]); if (VARATT_IS_EXTERNAL(new_value)) { - new_value = heap_tuple_fetch_attr(new_value); + new_value = detoast_external_attr(new_value); new_values[i] = PointerGetDatum(new_value); freeable_values[num_to_free++] = (Pointer) new_value; } diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c index 0172a139576..7c98a42b8ba 100644 --- a/src/backend/access/heap/rewriteheap.c +++ b/src/backend/access/heap/rewriteheap.c @@ -664,8 +664,8 @@ raw_heap_insert(RewriteState state, HeapTuple tup) */ options |= HEAP_INSERT_NO_LOGICAL; - heaptup = toast_insert_or_update(state->rs_new_rel, tup, NULL, - options); + heaptup = heap_toast_insert_or_update(state->rs_new_rel, tup, NULL, + options); } else heaptup = tup; diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c index 7532b4f8659..7381be8669c 100644 --- a/src/backend/access/table/toast_helper.c +++ b/src/backend/access/table/toast_helper.c @@ -135,9 +135,9 @@ toast_tuple_init(ToastTupleContext *ttc) { ttc->ttc_attr[i].tai_oldexternal = new_value; if (att->attstorage == 'p') - new_value = heap_tuple_untoast_attr(new_value); + new_value = detoast_attr(new_value); else - new_value = heap_tuple_fetch_attr(new_value); + new_value = detoast_external_attr(new_value); ttc->ttc_values[i] = PointerGetDatum(new_value); ttc->ttc_attr[i].tai_colflags |= TOASTCOL_NEEDS_FREE; ttc->ttc_flags |= (TOAST_NEEDS_CHANGE | TOAST_NEEDS_FREE); diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c index c0c81c82da0..6306b7d0bd1 100644 --- a/src/backend/executor/tstoreReceiver.c +++ b/src/backend/executor/tstoreReceiver.c @@ -133,7 +133,7 @@ tstoreReceiveSlot_detoast(TupleTableSlot *slot, DestReceiver *self) { if (VARATT_IS_EXTERNAL(DatumGetPointer(val))) { - val = PointerGetDatum(heap_tuple_fetch_attr((struct varlena *) + val = PointerGetDatum(detoast_external_attr((struct varlena *) DatumGetPointer(val))); myState->tofree[nfree++] = val; } diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c index e5912363433..263d5be12eb 100644 --- a/src/backend/storage/large_object/inv_api.c +++ b/src/backend/storage/large_object/inv_api.c @@ -180,7 +180,7 @@ getdatafield(Form_pg_largeobject tuple, if (VARATT_IS_EXTENDED(datafield)) { datafield = (bytea *) - heap_tuple_untoast_attr((struct varlena *) datafield); + detoast_attr((struct varlena *) datafield); freeit = true; } len = VARSIZE(datafield) - VARHDRSZ; diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c index 369432d53cb..d99d370b17c 100644 --- a/src/backend/utils/adt/expandedrecord.c +++ b/src/backend/utils/adt/expandedrecord.c @@ -1159,7 +1159,7 @@ expanded_record_set_field_internal(ExpandedRecordHeader *erh, int fnumber, { /* Detoasting should be done in short-lived context. */ oldcxt = MemoryContextSwitchTo(get_short_term_cxt(erh)); - newValue = PointerGetDatum(heap_tuple_fetch_attr((struct varlena *) DatumGetPointer(newValue))); + newValue = PointerGetDatum(detoast_external_attr((struct varlena *) DatumGetPointer(newValue))); MemoryContextSwitchTo(oldcxt); } else @@ -1305,7 +1305,7 @@ expanded_record_set_fields(ExpandedRecordHeader *erh, if (expand_external) { /* Detoast as requested while copying the value */ - newValue = PointerGetDatum(heap_tuple_fetch_attr((struct varlena *) DatumGetPointer(newValue))); + newValue = PointerGetDatum(detoast_external_attr((struct varlena *) DatumGetPointer(newValue))); } else { diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c index 0484adb984a..099ebd779ba 100644 --- a/src/backend/utils/fmgr/fmgr.c +++ b/src/backend/utils/fmgr/fmgr.c @@ -1739,7 +1739,7 @@ struct varlena * pg_detoast_datum(struct varlena *datum) { if (VARATT_IS_EXTENDED(datum)) - return heap_tuple_untoast_attr(datum); + return detoast_attr(datum); else return datum; } @@ -1748,7 +1748,7 @@ struct varlena * pg_detoast_datum_copy(struct varlena *datum) { if (VARATT_IS_EXTENDED(datum)) - return heap_tuple_untoast_attr(datum); + return detoast_attr(datum); else { /* Make a modifiable copy of the varlena object */ @@ -1764,14 +1764,14 @@ struct varlena * pg_detoast_datum_slice(struct varlena *datum, int32 first, int32 count) { /* Only get the specified portion from the toast rel */ - return heap_tuple_untoast_attr_slice(datum, first, count); + return detoast_attr_slice(datum, first, count); } struct varlena * pg_detoast_datum_packed(struct varlena *datum) { if (VARATT_IS_COMPRESSED(datum) || VARATT_IS_EXTERNAL(datum)) - return heap_tuple_untoast_attr(datum); + return detoast_attr(datum); else return datum; } diff --git a/src/include/access/detoast.h b/src/include/access/detoast.h index 02029a991fd..baf3dc2591c 100644 --- a/src/include/access/detoast.h +++ b/src/include/access/detoast.h @@ -44,34 +44,34 @@ do { \ #define INDIRECT_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_indirect)) /* ---------- - * heap_tuple_fetch_attr() - + * detoast_external_attr() - * * Fetches an external stored attribute from the toast * relation. Does NOT decompress it, if stored external * in compressed format. * ---------- */ -extern struct varlena *heap_tuple_fetch_attr(struct varlena *attr); +extern struct varlena *detoast_external_attr(struct varlena *attr); /* ---------- - * heap_tuple_untoast_attr() - + * detoast_attr() - * * Fully detoasts one attribute, fetching and/or decompressing * it as needed. * ---------- */ -extern struct varlena *heap_tuple_untoast_attr(struct varlena *attr); +extern struct varlena *detoast_attr(struct varlena *attr); /* ---------- - * heap_tuple_untoast_attr_slice() - + * detoast_attr_slice() - * * Fetches only the specified portion of an attribute. * (Handles all cases for attribute storage) * ---------- */ -extern struct varlena *heap_tuple_untoast_attr_slice(struct varlena *attr, - int32 sliceoffset, - int32 slicelength); +extern struct varlena *detoast_attr_slice(struct varlena *attr, + int32 sliceoffset, + int32 slicelength); /* ---------- * toast_raw_datum_size - diff --git a/src/include/access/heaptoast.h b/src/include/access/heaptoast.h index bf02d2c6001..488a2e4a7f6 100644 --- a/src/include/access/heaptoast.h +++ b/src/include/access/heaptoast.h @@ -89,22 +89,22 @@ VARHDRSZ) /* ---------- - * toast_insert_or_update - + * heap_toast_insert_or_update - * * Called by heap_insert() and heap_update(). * ---------- */ -extern HeapTuple toast_insert_or_update(Relation rel, - HeapTuple newtup, HeapTuple oldtup, - int options); +extern HeapTuple heap_toast_insert_or_update(Relation rel, HeapTuple newtup, + HeapTuple oldtup, int options); /* ---------- - * toast_delete - + * heap_toast_delete - * * Called by heap_delete(). * ---------- */ -extern void toast_delete(Relation rel, HeapTuple oldtup, bool is_speculative); +extern void heap_toast_delete(Relation rel, HeapTuple oldtup, + bool is_speculative); /* ---------- * toast_flatten_tuple - diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index cb2e19cda48..345065e305d 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -8344,7 +8344,7 @@ assign_simple_var(PLpgSQL_execstate *estate, PLpgSQL_var *var, * pain, but there's little choice. */ oldcxt = MemoryContextSwitchTo(get_eval_mcontext(estate)); - detoasted = PointerGetDatum(heap_tuple_fetch_attr((struct varlena *) DatumGetPointer(newvalue))); + detoasted = PointerGetDatum(detoast_external_attr((struct varlena *) DatumGetPointer(newvalue))); MemoryContextSwitchTo(oldcxt); /* Now's a good time to not leak the input value if it's freeable */ if (freeable) diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index 8cc1568a3dd..f7c024b7309 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -558,7 +558,7 @@ make_tuple_indirect(PG_FUNCTION_ARGS) /* copy datum, so it still lives later */ if (VARATT_IS_EXTERNAL_ONDISK(attr)) - attr = heap_tuple_fetch_attr(attr); + attr = detoast_external_attr(attr); else { struct varlena *oldattr = attr;