PostgreSQL Source Code git master
Loading...
Searching...
No Matches
toast_helper.c File Reference
#include "postgres.h"
#include "access/detoast.h"
#include "access/toast_helper.h"
#include "access/toast_internals.h"
#include "catalog/pg_type_d.h"
#include "varatt.h"
Include dependency graph for toast_helper.c:

Go to the source code of this file.

Functions

void toast_tuple_init (ToastTupleContext *ttc)
 
int toast_tuple_find_biggest_attribute (ToastTupleContext *ttc, bool for_compression, bool check_main)
 
void toast_tuple_try_compression (ToastTupleContext *ttc, int attribute)
 
void toast_tuple_externalize (ToastTupleContext *ttc, int attribute, int options)
 
void toast_tuple_cleanup (ToastTupleContext *ttc)
 
void toast_delete_external (Relation rel, const Datum *values, const bool *isnull, bool is_speculative)
 

Function Documentation

◆ toast_delete_external()

void toast_delete_external ( Relation  rel,
const Datum values,
const bool isnull,
bool  is_speculative 
)

Definition at line 318 of file toast_helper.c.

320{
322 int numAttrs = tupleDesc->natts;
323 int i;
324
325 for (i = 0; i < numAttrs; i++)
326 {
328 {
329 Datum value = values[i];
330
331 if (isnull[i])
332 continue;
335 }
336 }
337}
static Datum values[MAXATTR]
Definition bootstrap.c:155
static struct @172 value
int i
Definition isn.c:77
int16 attlen
uint64_t Datum
Definition postgres.h:70
static Pointer DatumGetPointer(Datum X)
Definition postgres.h:342
static int fb(int x)
TupleDesc rd_att
Definition rel.h:112
void toast_delete_datum(Relation rel, Datum value, bool is_speculative)
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
Definition tupdesc.h:175
static bool VARATT_IS_EXTERNAL_ONDISK(const void *PTR)
Definition varatt.h:361

References attlen, DatumGetPointer(), fb(), i, TupleDescData::natts, RelationData::rd_att, toast_delete_datum(), TupleDescCompactAttr(), value, values, and VARATT_IS_EXTERNAL_ONDISK().

Referenced by heap_toast_delete().

◆ toast_tuple_cleanup()

void toast_tuple_cleanup ( ToastTupleContext ttc)

Definition at line 275 of file toast_helper.c.

276{
277 TupleDesc tupleDesc = ttc->ttc_rel->rd_att;
278 int numAttrs = tupleDesc->natts;
279
280 /*
281 * Free allocated temp values
282 */
283 if ((ttc->ttc_flags & TOAST_NEEDS_FREE) != 0)
284 {
285 int i;
286
287 for (i = 0; i < numAttrs; i++)
288 {
289 ToastAttrInfo *attr = &ttc->ttc_attr[i];
290
291 if ((attr->tai_colflags & TOASTCOL_NEEDS_FREE) != 0)
292 pfree(DatumGetPointer(ttc->ttc_values[i]));
293 }
294 }
295
296 /*
297 * Delete external values from the old tuple
298 */
299 if ((ttc->ttc_flags & TOAST_NEEDS_DELETE_OLD) != 0)
300 {
301 int i;
302
303 for (i = 0; i < numAttrs; i++)
304 {
305 ToastAttrInfo *attr = &ttc->ttc_attr[i];
306
307 if ((attr->tai_colflags & TOASTCOL_NEEDS_DELETE_OLD) != 0)
308 toast_delete_datum(ttc->ttc_rel, ttc->ttc_oldvalues[i], false);
309 }
310 }
311}
void pfree(void *pointer)
Definition mcxt.c:1616
#define TOASTCOL_NEEDS_DELETE_OLD
#define TOAST_NEEDS_FREE
#define TOAST_NEEDS_DELETE_OLD
#define TOASTCOL_NEEDS_FREE

References DatumGetPointer(), fb(), i, TupleDescData::natts, pfree(), ToastAttrInfo::tai_colflags, toast_delete_datum(), TOAST_NEEDS_DELETE_OLD, TOAST_NEEDS_FREE, TOASTCOL_NEEDS_DELETE_OLD, and TOASTCOL_NEEDS_FREE.

Referenced by heap_toast_insert_or_update().

◆ toast_tuple_externalize()

void toast_tuple_externalize ( ToastTupleContext ttc,
int  attribute,
int  options 
)

Definition at line 256 of file toast_helper.c.

257{
258 Datum *value = &ttc->ttc_values[attribute];
260 ToastAttrInfo *attr = &ttc->ttc_attr[attribute];
261
264 options);
265 if ((attr->tai_colflags & TOASTCOL_NEEDS_FREE) != 0)
268 ttc->ttc_flags |= (TOAST_NEEDS_CHANGE | TOAST_NEEDS_FREE);
269}
struct varlena * tai_oldexternal
#define TOAST_NEEDS_CHANGE
#define TOASTCOL_IGNORE
Datum toast_save_datum(Relation rel, Datum value, struct varlena *oldexternal, int options)

References DatumGetPointer(), fb(), pfree(), ToastAttrInfo::tai_colflags, ToastAttrInfo::tai_oldexternal, TOAST_NEEDS_CHANGE, TOAST_NEEDS_FREE, toast_save_datum(), TOASTCOL_IGNORE, TOASTCOL_NEEDS_FREE, and value.

Referenced by heap_toast_insert_or_update().

◆ toast_tuple_find_biggest_attribute()

int toast_tuple_find_biggest_attribute ( ToastTupleContext ttc,
bool  for_compression,
bool  check_main 
)

Definition at line 181 of file toast_helper.c.

183{
184 TupleDesc tupleDesc = ttc->ttc_rel->rd_att;
185 int numAttrs = tupleDesc->natts;
186 int biggest_attno = -1;
189 int i;
190
191 if (for_compression)
193
194 for (i = 0; i < numAttrs; i++)
195 {
197
198 if ((ttc->ttc_attr[i].tai_colflags & skip_colflags) != 0)
199 continue;
200 if (VARATT_IS_EXTERNAL(DatumGetPointer(ttc->ttc_values[i])))
201 continue; /* can't happen, toast_action would be PLAIN */
202 if (for_compression &&
204 continue;
205 if (check_main && att->attstorage != TYPSTORAGE_MAIN)
206 continue;
207 if (!check_main && att->attstorage != TYPSTORAGE_EXTENDED &&
208 att->attstorage != TYPSTORAGE_EXTERNAL)
209 continue;
210
211 if (ttc->ttc_attr[i].tai_size > biggest_size)
212 {
214 biggest_size = ttc->ttc_attr[i].tai_size;
215 }
216 }
217
218 return biggest_attno;
219}
#define MAXALIGN(LEN)
Definition c.h:826
int32_t int32
Definition c.h:542
#define TOAST_POINTER_SIZE
Definition detoast.h:31
FormData_pg_attribute * Form_pg_attribute
#define TOASTCOL_INCOMPRESSIBLE
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition tupdesc.h:160
static bool VARATT_IS_EXTERNAL(const void *PTR)
Definition varatt.h:354
static bool VARATT_IS_COMPRESSED(const void *PTR)
Definition varatt.h:347

References DatumGetPointer(), fb(), i, MAXALIGN, TupleDescData::natts, TOAST_POINTER_SIZE, TOASTCOL_IGNORE, TOASTCOL_INCOMPRESSIBLE, TupleDescAttr(), VARATT_IS_COMPRESSED(), and VARATT_IS_EXTERNAL().

Referenced by heap_toast_insert_or_update().

◆ toast_tuple_init()

void toast_tuple_init ( ToastTupleContext ttc)

Definition at line 41 of file toast_helper.c.

42{
43 TupleDesc tupleDesc = ttc->ttc_rel->rd_att;
45 int i;
46
47 ttc->ttc_flags = 0;
48
49 for (i = 0; i < numAttrs; i++)
50 {
52 struct varlena *old_value;
53 struct varlena *new_value;
54
55 ttc->ttc_attr[i].tai_colflags = 0;
56 ttc->ttc_attr[i].tai_oldexternal = NULL;
57 ttc->ttc_attr[i].tai_compression = att->attcompression;
58
59 if (ttc->ttc_oldvalues != NULL)
60 {
61 /*
62 * For UPDATE get the old and new values of this attribute
63 */
64 old_value =
65 (struct varlena *) DatumGetPointer(ttc->ttc_oldvalues[i]);
66 new_value =
67 (struct varlena *) DatumGetPointer(ttc->ttc_values[i]);
68
69 /*
70 * If the old value is stored on disk, check if it has changed so
71 * we have to delete it later.
72 */
73 if (att->attlen == -1 && !ttc->ttc_oldisnull[i] &&
75 {
76 if (ttc->ttc_isnull[i] ||
80 {
81 /*
82 * The old external stored value isn't needed any more
83 * after the update
84 */
85 ttc->ttc_attr[i].tai_colflags |= TOASTCOL_NEEDS_DELETE_OLD;
86 ttc->ttc_flags |= TOAST_NEEDS_DELETE_OLD;
87 }
88 else
89 {
90 /*
91 * This attribute isn't changed by this update so we reuse
92 * the original reference to the old value in the new
93 * tuple.
94 */
95 ttc->ttc_attr[i].tai_colflags |= TOASTCOL_IGNORE;
96 continue;
97 }
98 }
99 }
100 else
101 {
102 /*
103 * For INSERT simply get the new value
104 */
105 new_value = (struct varlena *) DatumGetPointer(ttc->ttc_values[i]);
106 }
107
108 /*
109 * Handle NULL attributes
110 */
111 if (ttc->ttc_isnull[i])
112 {
113 ttc->ttc_attr[i].tai_colflags |= TOASTCOL_IGNORE;
114 ttc->ttc_flags |= TOAST_HAS_NULLS;
115 continue;
116 }
117
118 /*
119 * Now look at varlena attributes
120 */
121 if (att->attlen == -1)
122 {
123 /*
124 * If the table's attribute says PLAIN always, force it so.
125 */
126 if (att->attstorage == TYPSTORAGE_PLAIN)
127 ttc->ttc_attr[i].tai_colflags |= TOASTCOL_IGNORE;
128
129 /*
130 * We took care of UPDATE above, so any external value we find
131 * still in the tuple must be someone else's that we cannot reuse
132 * (this includes the case of an out-of-line in-memory datum).
133 * Fetch it back (without decompression, unless we are forcing
134 * PLAIN storage). If necessary, we'll push it out as a new
135 * external value below.
136 */
138 {
139 ttc->ttc_attr[i].tai_oldexternal = new_value;
140 if (att->attstorage == TYPSTORAGE_PLAIN)
142 else
144 ttc->ttc_values[i] = PointerGetDatum(new_value);
145 ttc->ttc_attr[i].tai_colflags |= TOASTCOL_NEEDS_FREE;
146 ttc->ttc_flags |= (TOAST_NEEDS_CHANGE | TOAST_NEEDS_FREE);
147 }
148
149 /*
150 * Remember the size of this attribute
151 */
152 ttc->ttc_attr[i].tai_size = VARSIZE_ANY(new_value);
153 }
154 else
155 {
156 /*
157 * Not a varlena attribute, plain storage always
158 */
159 ttc->ttc_attr[i].tai_colflags |= TOASTCOL_IGNORE;
160 }
161 }
162}
struct varlena * detoast_attr(struct varlena *attr)
Definition detoast.c:116
struct varlena * detoast_external_attr(struct varlena *attr)
Definition detoast.c:45
static Datum PointerGetDatum(const void *X)
Definition postgres.h:352
Definition c.h:706
#define TOAST_HAS_NULLS
static Size VARSIZE_ANY(const void *PTR)
Definition varatt.h:460
static Size VARSIZE_EXTERNAL(const void *PTR)
Definition varatt.h:333

References DatumGetPointer(), detoast_attr(), detoast_external_attr(), fb(), i, TupleDescData::natts, PointerGetDatum(), TOAST_HAS_NULLS, TOAST_NEEDS_CHANGE, TOAST_NEEDS_DELETE_OLD, TOAST_NEEDS_FREE, TOASTCOL_IGNORE, TOASTCOL_NEEDS_DELETE_OLD, TOASTCOL_NEEDS_FREE, TupleDescAttr(), VARATT_IS_EXTERNAL(), VARATT_IS_EXTERNAL_ONDISK(), VARSIZE_ANY(), and VARSIZE_EXTERNAL().

Referenced by heap_toast_insert_or_update().

◆ toast_tuple_try_compression()

void toast_tuple_try_compression ( ToastTupleContext ttc,
int  attribute 
)

Definition at line 227 of file toast_helper.c.

228{
229 Datum *value = &ttc->ttc_values[attribute];
231 ToastAttrInfo *attr = &ttc->ttc_attr[attribute];
232
234
236 {
237 /* successful compression */
238 if ((attr->tai_colflags & TOASTCOL_NEEDS_FREE) != 0)
240 *value = new_value;
243 ttc->ttc_flags |= (TOAST_NEEDS_CHANGE | TOAST_NEEDS_FREE);
244 }
245 else
246 {
247 /* incompressible, ignore on subsequent compression passes */
249 }
250}
Datum toast_compress_datum(Datum value, char cmethod)
static Size VARSIZE(const void *PTR)
Definition varatt.h:298

References DatumGetPointer(), fb(), pfree(), ToastAttrInfo::tai_colflags, ToastAttrInfo::tai_compression, ToastAttrInfo::tai_size, toast_compress_datum(), TOAST_NEEDS_CHANGE, TOAST_NEEDS_FREE, TOASTCOL_INCOMPRESSIBLE, TOASTCOL_NEEDS_FREE, value, and VARSIZE().

Referenced by heap_toast_insert_or_update().