| /*------------------------------------------------------------------------- |
| * |
| * detoast.h |
| * Access to compressed and external varlena values. |
| * |
| * Copyright (c) 2000-2023, PostgreSQL Global Development Group |
| * |
| * src/include/access/detoast.h |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #ifndef DETOAST_H |
| #define DETOAST_H |
| |
| #include "c.h" |
| |
| /* |
| * Macro to fetch the possibly-unaligned contents of an EXTERNAL datum |
| * into a local "struct varatt_external" toast pointer. This should be |
| * just a memcpy, but some versions of gcc seem to produce broken code |
| * that assumes the datum contents are aligned. Introducing an explicit |
| * intermediate "varattrib_1b_e *" variable seems to fix it. |
| */ |
| #define VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr) \ |
| do { \ |
| varattrib_1b_e *attre = (varattrib_1b_e *) (attr); \ |
| Assert(VARATT_IS_EXTERNAL(attre)); \ |
| Assert(VARSIZE_EXTERNAL(attre) == sizeof(toast_pointer) + VARHDRSZ_EXTERNAL); \ |
| memcpy(&(toast_pointer), VARDATA_EXTERNAL(attre), sizeof(toast_pointer)); \ |
| } while (0) |
| |
| /* Size of an EXTERNAL datum that contains a standard TOAST pointer */ |
| #define TOAST_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_external)) |
| |
| /* Size of an EXTERNAL datum that contains an indirection pointer */ |
| #define INDIRECT_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_indirect)) |
| |
| /* ---------- |
| * 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 *detoast_external_attr(struct varlena *attr); |
| |
| /* ---------- |
| * detoast_attr() - |
| * |
| * Fully detoasts one attribute, fetching and/or decompressing |
| * it as needed. |
| * ---------- |
| */ |
| extern struct varlena *detoast_attr(struct varlena *attr); |
| |
| /* ---------- |
| * detoast_attr_slice() - |
| * |
| * Fetches only the specified portion of an attribute. |
| * (Handles all cases for attribute storage) |
| * ---------- |
| */ |
| extern struct varlena *detoast_attr_slice(struct varlena *attr, |
| int32 sliceoffset, |
| int32 slicelength); |
| |
| |
| /* ---------- |
| * toast_raw_datum_size - |
| * |
| * Return the raw (detoasted) size of a varlena datum |
| * ---------- |
| */ |
| extern Size toast_raw_datum_size(Datum value); |
| |
| /* ---------- |
| * toast_datum_size - |
| * |
| * Return the storage size of a varlena datum |
| * ---------- |
| */ |
| extern Size toast_datum_size(Datum value); |
| |
| extern void varattrib_untoast_ptr_len(Datum d, char **datastart, int *len, void **tofree); |
| extern int varattrib_untoast_len(Datum d); |
| |
| #endif /* DETOAST_H */ |