PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
detoast.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * detoast.h
4 * Access to compressed and external varlena values.
5 *
6 * Copyright (c) 2000-2024, PostgreSQL Global Development Group
7 *
8 * src/include/access/detoast.h
9 *
10 *-------------------------------------------------------------------------
11 */
12#ifndef DETOAST_H
13#define DETOAST_H
14
15/*
16 * Macro to fetch the possibly-unaligned contents of an EXTERNAL datum
17 * into a local "struct varatt_external" toast pointer. This should be
18 * just a memcpy, but some versions of gcc seem to produce broken code
19 * that assumes the datum contents are aligned. Introducing an explicit
20 * intermediate "varattrib_1b_e *" variable seems to fix it.
21 */
22#define VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr) \
23do { \
24 varattrib_1b_e *attre = (varattrib_1b_e *) (attr); \
25 Assert(VARATT_IS_EXTERNAL(attre)); \
26 Assert(VARSIZE_EXTERNAL(attre) == sizeof(toast_pointer) + VARHDRSZ_EXTERNAL); \
27 memcpy(&(toast_pointer), VARDATA_EXTERNAL(attre), sizeof(toast_pointer)); \
28} while (0)
29
30/* Size of an EXTERNAL datum that contains a standard TOAST pointer */
31#define TOAST_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_external))
32
33/* Size of an EXTERNAL datum that contains an indirection pointer */
34#define INDIRECT_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_indirect))
35
36/* ----------
37 * detoast_external_attr() -
38 *
39 * Fetches an external stored attribute from the toast
40 * relation. Does NOT decompress it, if stored external
41 * in compressed format.
42 * ----------
43 */
44extern struct varlena *detoast_external_attr(struct varlena *attr);
45
46/* ----------
47 * detoast_attr() -
48 *
49 * Fully detoasts one attribute, fetching and/or decompressing
50 * it as needed.
51 * ----------
52 */
53extern struct varlena *detoast_attr(struct varlena *attr);
54
55/* ----------
56 * detoast_attr_slice() -
57 *
58 * Fetches only the specified portion of an attribute.
59 * (Handles all cases for attribute storage)
60 * ----------
61 */
62extern struct varlena *detoast_attr_slice(struct varlena *attr,
63 int32 sliceoffset,
64 int32 slicelength);
65
66/* ----------
67 * toast_raw_datum_size -
68 *
69 * Return the raw (detoasted) size of a varlena datum
70 * ----------
71 */
73
74/* ----------
75 * toast_datum_size -
76 *
77 * Return the storage size of a varlena datum
78 * ----------
79 */
81
82#endif /* DETOAST_H */
int32_t int32
Definition: c.h:481
size_t Size
Definition: c.h:559
Size toast_datum_size(Datum value)
Definition: detoast.c:601
struct varlena * detoast_attr(struct varlena *attr)
Definition: detoast.c:116
Size toast_raw_datum_size(Datum value)
Definition: detoast.c:545
struct varlena * detoast_external_attr(struct varlena *attr)
Definition: detoast.c:45
struct varlena * detoast_attr_slice(struct varlena *attr, int32 sliceoffset, int32 slicelength)
Definition: detoast.c:205
static struct @161 value
uintptr_t Datum
Definition: postgres.h:64
Definition: c.h:641