1 /*------------------------------------------------------------------------- 2 * 3 * toast_internals.h 4 * Internal definitions for the TOAST system. 5 * 6 * Copyright (c) 2000-2021, PostgreSQL Global Development Group 7 * 8 * src/include/access/toast_internals.h 9 * 10 *------------------------------------------------------------------------- 11 */ 12 #ifndef TOAST_INTERNALS_H 13 #define TOAST_INTERNALS_H 14 15 #include "access/toast_compression.h" 16 #include "storage/lockdefs.h" 17 #include "utils/relcache.h" 18 #include "utils/snapshot.h" 19 20 /* 21 * The information at the start of the compressed toast data. 22 */ 23 typedef struct toast_compress_header 24 { 25 int32 vl_len_; /* varlena header (do not touch directly!) */ 26 uint32 tcinfo; /* 2 bits for compression method and 30 bits 27 * external size; see va_extinfo */ 28 } toast_compress_header; 29 30 /* 31 * Utilities for manipulation of header information for compressed 32 * toast entries. 33 */ 34 #define TOAST_COMPRESS_EXTSIZE(ptr) \ 35 (((toast_compress_header *) (ptr))->tcinfo & VARLENA_EXTSIZE_MASK) 36 #define TOAST_COMPRESS_METHOD(ptr) \ 37 (((toast_compress_header *) (ptr))->tcinfo >> VARLENA_EXTSIZE_BITS) 38 39 #define TOAST_COMPRESS_SET_SIZE_AND_COMPRESS_METHOD(ptr, len, cm_method) \ 40 do { \ 41 Assert((len) > 0 && (len) <= VARLENA_EXTSIZE_MASK); \ 42 Assert((cm_method) == TOAST_PGLZ_COMPRESSION_ID || \ 43 (cm_method) == TOAST_LZ4_COMPRESSION_ID); \ 44 ((toast_compress_header *) (ptr))->tcinfo = \ 45 (len) | ((uint32) (cm_method) << VARLENA_EXTSIZE_BITS); \ 46 } while (0) 47 48 extern Datum toast_compress_datum(Datum value, char cmethod); 49 extern Oid toast_get_valid_index(Oid toastoid, LOCKMODE lock); 50 51 extern void toast_delete_datum(Relation rel, Datum value, bool is_speculative); 52 extern Datum toast_save_datum(Relation rel, Datum value, 53 struct varlena *oldexternal, int options); 54 55 extern int toast_open_indexes(Relation toastrel, 56 LOCKMODE lock, 57 Relation **toastidxs, 58 int *num_indexes); 59 extern void toast_close_indexes(Relation *toastidxs, int num_indexes, 60 LOCKMODE lock); 61 extern void init_toast_snapshot(Snapshot toast_snapshot); 62 63 #endif /* TOAST_INTERNALS_H */ 64