12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /*-------------------------------------------------------------------------
- *
- * detoast.h
- * Access to compressed and external varlena values.
- *
- * Copyright (c) 2000-2022, PostgreSQL Global Development Group
- *
- * src/include/access/detoast.h
- *
- *-------------------------------------------------------------------------
- */
- #ifndef DETOAST_H
- #define DETOAST_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);
- #endif /* DETOAST_H */
|