58#define elog(error, ...) \
60 fprintf (stderr, __VA_ARGS__); \
67#define palloc0(X) (calloc(1, X))
69#define repalloc realloc
106#define VARLENA_EXTSIZE_BITS 30
107#define VARLENA_EXTSIZE_MASK ((1U << VARLENA_EXTSIZE_BITS) - 1)
154#define VARTAG_IS_EXPANDED(tag) \
155 (((tag) & ~1) == VARTAG_EXPANDED_RO)
157#define VARTAG_SIZE(tag) \
158 ((tag) == VARTAG_INDIRECT ? sizeof(varatt_indirect) : \
159 VARTAG_IS_EXPANDED(tag) ? sizeof(varatt_expanded) : \
160 (tag) == VARTAG_ONDISK ? sizeof(varatt_external) : \
161 TrapMacro(true, "unrecognized TOAST vartag"))
237#ifdef WORDS_BIGENDIAN
239#define VARATT_IS_4B(PTR) \
240 ((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x00)
241#define VARATT_IS_4B_U(PTR) \
242 ((((varattrib_1b *) (PTR))->va_header & 0xC0) == 0x00)
243#define VARATT_IS_4B_C(PTR) \
244 ((((varattrib_1b *) (PTR))->va_header & 0xC0) == 0x40)
245#define VARATT_IS_1B(PTR) \
246 ((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x80)
247#define VARATT_IS_1B_E(PTR) \
248 ((((varattrib_1b *) (PTR))->va_header) == 0x80)
249#define VARATT_NOT_PAD_BYTE(PTR) \
250 (*((uint8 *) (PTR)) != 0)
253#define VARSIZE_4B(PTR) \
254 (((varattrib_4b *) (PTR))->va_4byte.va_header & 0x3FFFFFFF)
255#define VARSIZE_1B(PTR) \
256 (((varattrib_1b *) (PTR))->va_header & 0x7F)
257#define VARTAG_1B_E(PTR) \
258 (((varattrib_1b_e *) (PTR))->va_tag)
260#define SET_VARSIZE_4B(PTR,len) \
261 (((varattrib_4b *) (PTR))->va_4byte.va_header = (len) & 0x3FFFFFFF)
262#define SET_VARSIZE_4B_C(PTR,len) \
263 (((varattrib_4b *) (PTR))->va_4byte.va_header = ((len) & 0x3FFFFFFF) | 0x40000000)
264#define SET_VARSIZE_1B(PTR,len) \
265 (((varattrib_1b *) (PTR))->va_header = (len) | 0x80)
266#define SET_VARTAG_1B_E(PTR,tag) \
267 (((varattrib_1b_e *) (PTR))->va_header = 0x80, \
268 ((varattrib_1b_e *) (PTR))->va_tag = (tag))
272#define VARATT_IS_4B(PTR) \
273 ((((varattrib_1b *) (PTR))->va_header & 0x01) == 0x00)
274#define VARATT_IS_4B_U(PTR) \
275 ((((varattrib_1b *) (PTR))->va_header & 0x03) == 0x00)
276#define VARATT_IS_4B_C(PTR) \
277 ((((varattrib_1b *) (PTR))->va_header & 0x03) == 0x02)
278#define VARATT_IS_1B(PTR) \
279 ((((varattrib_1b *) (PTR))->va_header & 0x01) == 0x01)
280#define VARATT_IS_1B_E(PTR) \
281 ((((varattrib_1b *) (PTR))->va_header) == 0x01)
282#define VARATT_NOT_PAD_BYTE(PTR) \
283 (*((uint8 *) (PTR)) != 0)
286#define VARSIZE_4B(PTR) \
287 ((((varattrib_4b *) (PTR))->va_4byte.va_header >> 2) & 0x3FFFFFFF)
288#define VARSIZE_1B(PTR) \
289 ((((varattrib_1b *) (PTR))->va_header >> 1) & 0x7F)
290#define VARTAG_1B_E(PTR) \
291 (((varattrib_1b_e *) (PTR))->va_tag)
293#define SET_VARSIZE_4B(PTR,len) \
294 (((varattrib_4b *) (PTR))->va_4byte.va_header = (((uint32) (len)) << 2))
295#define SET_VARSIZE_4B_C(PTR,len) \
296 (((varattrib_4b *) (PTR))->va_4byte.va_header = (((uint32) (len)) << 2) | 0x02)
297#define SET_VARSIZE_1B(PTR,len) \
298 (((varattrib_1b *) (PTR))->va_header = (((uint8) (len)) << 1) | 0x01)
299#define SET_VARTAG_1B_E(PTR,tag) \
300 (((varattrib_1b_e *) (PTR))->va_header = 0x01, \
301 ((varattrib_1b_e *) (PTR))->va_tag = (tag))
305#define VARDATA_4B(PTR) (((varattrib_4b *) (PTR))->va_4byte.va_data)
306#define VARDATA_4B_C(PTR) (((varattrib_4b *) (PTR))->va_compressed.va_data)
307#define VARDATA_1B(PTR) (((varattrib_1b *) (PTR))->va_data)
308#define VARDATA_1B_E(PTR) (((varattrib_1b_e *) (PTR))->va_data)
314#define VARHDRSZ_EXTERNAL offsetof(varattrib_1b_e, va_data)
315#define VARHDRSZ_COMPRESSED offsetof(varattrib_4b, va_compressed.va_data)
316#define VARHDRSZ_SHORT offsetof(varattrib_1b, va_data)
318#define VARATT_SHORT_MAX 0x7F
319#define VARATT_CAN_MAKE_SHORT(PTR) \
320 (VARATT_IS_4B_U(PTR) && \
321 (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT) <= VARATT_SHORT_MAX)
322#define VARATT_CONVERTED_SHORT_SIZE(PTR) \
323 (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT)
339#define VARDATA(PTR) VARDATA_4B(PTR)
340#define VARSIZE(PTR) VARSIZE_4B(PTR)
342#define VARSIZE_SHORT(PTR) VARSIZE_1B(PTR)
343#define VARDATA_SHORT(PTR) VARDATA_1B(PTR)
345#define VARTAG_EXTERNAL(PTR) VARTAG_1B_E(PTR)
346#define VARSIZE_EXTERNAL(PTR) (VARHDRSZ_EXTERNAL + VARTAG_SIZE(VARTAG_EXTERNAL(PTR)))
347#define VARDATA_EXTERNAL(PTR) VARDATA_1B_E(PTR)
349#define VARATT_IS_COMPRESSED(PTR) VARATT_IS_4B_C(PTR)
350#define VARATT_IS_EXTERNAL(PTR) VARATT_IS_1B_E(PTR)
351#define VARATT_IS_EXTERNAL_ONDISK(PTR) \
352 (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_ONDISK)
353#define VARATT_IS_EXTERNAL_INDIRECT(PTR) \
354 (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_INDIRECT)
355#define VARATT_IS_EXTERNAL_EXPANDED_RO(PTR) \
356 (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_EXPANDED_RO)
357#define VARATT_IS_EXTERNAL_EXPANDED_RW(PTR) \
358 (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_EXPANDED_RW)
359#define VARATT_IS_EXTERNAL_EXPANDED(PTR) \
360 (VARATT_IS_EXTERNAL(PTR) && VARTAG_IS_EXPANDED(VARTAG_EXTERNAL(PTR)))
361#define VARATT_IS_EXTERNAL_NON_EXPANDED(PTR) \
362 (VARATT_IS_EXTERNAL(PTR) && !VARTAG_IS_EXPANDED(VARTAG_EXTERNAL(PTR)))
363#define VARATT_IS_SHORT(PTR) VARATT_IS_1B(PTR)
364#define VARATT_IS_EXTENDED(PTR) (!VARATT_IS_4B_U(PTR))
366#define SET_VARSIZE(PTR, len) SET_VARSIZE_4B(PTR, len)
367#define SET_VARSIZE_SHORT(PTR, len) SET_VARSIZE_1B(PTR, len)
368#define SET_VARSIZE_COMPRESSED(PTR, len) SET_VARSIZE_4B_C(PTR, len)
370#define SET_VARTAG_EXTERNAL(PTR, tag) SET_VARTAG_1B_E(PTR, tag)
372#define VARSIZE_ANY(PTR) \
373 (VARATT_IS_1B_E(PTR) ? VARSIZE_EXTERNAL(PTR) : \
374 (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR) : \
378#define VARSIZE_ANY_EXHDR(PTR) \
379 (VARATT_IS_1B_E(PTR) ? VARSIZE_EXTERNAL(PTR)-VARHDRSZ_EXTERNAL : \
380 (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR)-VARHDRSZ_SHORT : \
381 VARSIZE_4B(PTR)-VARHDRSZ))
385#define VARDATA_ANY(PTR) \
386 (VARATT_IS_1B(PTR) ? VARDATA_1B(PTR) : VARDATA_4B(PTR))
389#define VARDATA_COMPRESSED_GET_EXTSIZE(PTR) \
390 (((varattrib_4b *) (PTR))->va_compressed.va_tcinfo & VARLENA_EXTSIZE_MASK)
391#define VARDATA_COMPRESSED_GET_COMPRESS_METHOD(PTR) \
392 (((varattrib_4b *) (PTR))->va_compressed.va_tcinfo >> VARLENA_EXTSIZE_BITS)
395#define VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) \
396 ((toast_pointer).va_extinfo & VARLENA_EXTSIZE_MASK)
397#define VARATT_EXTERNAL_GET_COMPRESS_METHOD(toast_pointer) \
398 ((toast_pointer).va_extinfo >> VARLENA_EXTSIZE_BITS)
400#define VARATT_EXTERNAL_SET_SIZE_AND_COMPRESS_METHOD(toast_pointer, len, cm) \
402 Assert((cm) == TOAST_PGLZ_COMPRESSION_ID || \
403 (cm) == TOAST_LZ4_COMPRESSION_ID); \
404 ((toast_pointer).va_extinfo = \
405 (len) | ((uint32) (cm) << VARLENA_EXTSIZE_BITS)); \
415#define VARATT_EXTERNAL_IS_COMPRESSED(toast_pointer) \
416 (VARATT_EXTERNAL_GET_EXTSIZE(toast_pointer) < \
417 (toast_pointer).va_rawsize - VARHDRSZ)
435typedef uintptr_t
Datum;
445#define FIELDNO_NULLABLE_DATUM_DATUM 0
447#define FIELDNO_NULLABLE_DATUM_ISNULL 1
452#define SIZEOF_DATUM SIZEOF_VOID_P
461#define DatumGetBool(X) ((bool) ((X) != 0))
470#define BoolGetDatum(X) ((Datum) ((X) ? 1 : 0))
477#define DatumGetChar(X) ((char) (X))
484#define CharGetDatum(X) ((Datum) (X))
491#define Int8GetDatum(X) ((Datum) (X))
498#define DatumGetUInt8(X) ((uint8) (X))
505#define UInt8GetDatum(X) ((Datum) (X))
512#define DatumGetInt16(X) ((int16) (X))
519#define Int16GetDatum(X) ((Datum) (X))
526#define DatumGetUInt16(X) ((uint16) (X))
533#define UInt16GetDatum(X) ((Datum) (X))
540#define DatumGetInt32(X) ((int32) (X))
547#define Int32GetDatum(X) ((Datum) (X))
554#define DatumGetUInt32(X) ((uint32) (X))
561#define UInt32GetDatum(X) ((Datum) (X))
568#define DatumGetObjectId(X) ((Oid) (X))
575#define ObjectIdGetDatum(X) ((Datum) (X))
582#define DatumGetTransactionId(X) ((TransactionId) (X))
589#define TransactionIdGetDatum(X) ((Datum) (X))
596#define MultiXactIdGetDatum(X) ((Datum) (X))
603#define DatumGetCommandId(X) ((CommandId) (X))
610#define CommandIdGetDatum(X) ((Datum) (X))
617#define DatumGetPointer(X) ((Pointer) (X))
624#define PointerGetDatum(X) ((Datum) (X))
634#define DatumGetCString(X) ((char *) DatumGetPointer(X))
646#define CStringGetDatum(X) PointerGetDatum(X)
653#define DatumGetName(X) ((Name) DatumGetPointer(X))
663#define NameGetDatum(X) CStringGetDatum(NameStr(*(X)))
672#ifdef USE_FLOAT8_BYVAL
673#define DatumGetInt64(X) ((int64) (X))
675#define DatumGetInt64(X) (* ((int64 *) DatumGetPointer(X)))
686#ifdef USE_FLOAT8_BYVAL
687#define Int64GetDatum(X) ((Datum) (X))
699#ifdef USE_FLOAT8_BYVAL
700#define DatumGetUInt64(X) ((uint64) (X))
702#define DatumGetUInt64(X) (* ((uint64 *) DatumGetPointer(X)))
713#ifdef USE_FLOAT8_BYVAL
714#define UInt64GetDatum(X) ((Datum) (X))
716#define UInt64GetDatum(X) Int64GetDatum((int64) (X))
741 return myunion.retval;
768#ifdef USE_FLOAT8_BYVAL
779 return myunion.retval;
782#define DatumGetFloat8(X) (* ((float8 *) DatumGetPointer(X)))
793#ifdef USE_FLOAT8_BYVAL
824#ifdef USE_FLOAT8_BYVAL
825#define Int64GetDatumFast(X) Int64GetDatum(X)
826#define Float8GetDatumFast(X) Float8GetDatum(X)
828#define Int64GetDatumFast(X) PointerGetDatum(&(X))
829#define Float8GetDatumFast(X) PointerGetDatum(&(X))
double float8
Definition: c.h:570
#define FLEXIBLE_ARRAY_MEMBER
Definition: c.h:351
float float4
Definition: c.h:569
unsigned int uint32
Definition: pg_ext_defs.in.h:13
uintptr_t Datum
Definition: pg_ext_defs.in.h:4
signed int int32
Definition: pg_ext_defs.in.h:8
unsigned char uint8
Definition: pg_ext_defs.in.h:11
long int int64
Definition: pg_ext_defs.in.h:9
static Datum Float4GetDatum(float4 X)
Definition: postgres.h:744
uintptr_t Datum
Definition: postgres.h:430
static float4 DatumGetFloat4(Datum X)
Definition: postgres.h:727
static float8 DatumGetFloat8(Datum X)
Definition: postgres.h:765
struct ExpandedObjectHeader ExpandedObjectHeader
Definition: postgres.h:128
struct varatt_external varatt_external
static Datum Float8GetDatum(float8 X)
Definition: postgres.h:790
#define DatumGetInt32(X)
Definition: postgres.h:535
#define Int32GetDatum(X)
Definition: postgres.h:542
#define Int64GetDatum(X)
Definition: postgres.h:682
struct varatt_indirect varatt_indirect
struct varatt_expanded varatt_expanded
struct NullableDatum NullableDatum
vartag_external
Definition: postgres.h:141
@ VARTAG_ONDISK
Definition: postgres.h:145
@ VARTAG_EXPANDED_RW
Definition: postgres.h:144
@ VARTAG_INDIRECT
Definition: postgres.h:142
@ VARTAG_EXPANDED_RO
Definition: postgres.h:143
#define DatumGetInt64(X)
Definition: postgres.h:668
unsigned int Oid
Definition: postgres_ext.h:31
Datum value
Definition: postgres.h:441
bool isnull
Definition: postgres.h:443
Definition: postgres.h:439
ExpandedObjectHeader * eohptr
Definition: postgres.h:132
Definition: postgres.h:131
uint32 va_extinfo
Definition: postgres.h:91
int32 va_rawsize
Definition: postgres.h:90
Oid va_valueid
Definition: postgres.h:93
Oid va_toastrelid
Definition: postgres.h:94
Definition: postgres.h:89
struct varlena * pointer
Definition: postgres.h:115
Definition: postgres.h:114
Definition: postgres.h:191
Definition: postgres.h:184
Definition: pg_ext_defs.in.h:31
Definition: postgres.h:168