diff --git a/src/backend/access/common/toast_internals.c b/src/backend/access/common/toast_internals.c index 5485d4e3fa9..2bdc0b7d3f2 100644 --- a/src/backend/access/common/toast_internals.c +++ b/src/backend/access/common/toast_internals.c @@ -30,6 +30,26 @@ static bool toastrel_valueid_exists(Relation toastrel, Oid8 valueid); static bool toastid_valueid_exists(Oid toastrelid, Oid8 valueid); +/* ---------- + * toast_pointer_build - + * + * Build an on-disk TOAST pointer datum based on the given tag from "ptr", + * itself a varatt_external_*. + * ---------- + */ +static inline varlena * +toast_pointer_build(vartag_external tag, const void *ptr) +{ + varlena *result; + + result = (varlena *) palloc(VARHDRSZ_EXTERNAL + VARTAG_SIZE(tag)); + SET_VARTAG_EXTERNAL(result, tag); + Assert(VARATT_IS_EXTERNAL_ONDISK(result)); + memcpy(VARDATA_EXTERNAL(result), ptr, VARTAG_SIZE(tag)); + + return result; +} + /* ---------- * toast_compress_datum - * @@ -391,9 +411,7 @@ toast_save_datum(Relation rel, Datum value, VARATT_EXTERNAL_OID8_SET_VALUEID(&toast_pointer, va_valueid); toast_pointer.va_toastrelid = va_toastrelid; - result = (varlena *) palloc(TOAST_OID8_POINTER_SIZE); - SET_VARTAG_EXTERNAL(result, VARTAG_ONDISK_OID8); - memcpy(VARDATA_EXTERNAL(result), &toast_pointer, sizeof(toast_pointer)); + result = toast_pointer_build(VARTAG_ONDISK_OID8, &toast_pointer); } else { @@ -404,9 +422,7 @@ toast_save_datum(Relation rel, Datum value, toast_pointer.va_valueid = (Oid) va_valueid; toast_pointer.va_toastrelid = va_toastrelid; - result = (varlena *) palloc(TOAST_OID_POINTER_SIZE); - SET_VARTAG_EXTERNAL(result, VARTAG_ONDISK_OID); - memcpy(VARDATA_EXTERNAL(result), &toast_pointer, sizeof(toast_pointer)); + result = toast_pointer_build(VARTAG_ONDISK_OID, &toast_pointer); } return PointerGetDatum(result);