📄 postgres.h
字号:
/*------------------------------------------------------------------------- * * postgres.h * Primary include file for PostgreSQL server .c files * * This should be the first file included by PostgreSQL backend modules. * Client-side code should include postgres_fe.h instead. * * * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * $PostgreSQL: pgsql/src/include/postgres.h,v 1.88 2008/01/01 19:45:56 momjian Exp $ * *------------------------------------------------------------------------- *//* *---------------------------------------------------------------- * TABLE OF CONTENTS * * When adding stuff to this file, please try to put stuff * into the relevant section, or add new sections as appropriate. * * section description * ------- ------------------------------------------------ * 1) variable-length datatypes (TOAST support) * 2) datum type + support macros * 3) exception handling definitions * 4) genbki macros used by catalog/pg_xxx.h files * * NOTES * * In general, this file should contain declarations that are widely needed * in the backend environment, but are of no interest outside the backend. * * Simple type definitions live in c.h, where they are shared with * postgres_fe.h. We do that since those type definitions are needed by * frontend modules that want to deal with binary data transmission to or * from the backend. Type definitions in this file should be for * representations that never escape the backend, such as Datum or * TOASTed varlena objects. * *---------------------------------------------------------------- */#ifndef POSTGRES_H#define POSTGRES_H#include "c.h"/* ---------------------------------------------------------------- * Section 1: variable-length datatypes (TOAST support) * ---------------------------------------------------------------- *//* * struct varatt_external is a "TOAST pointer", that is, the information * needed to fetch a stored-out-of-line Datum. The data is compressed * if and only if va_extsize < va_rawsize - VARHDRSZ. This struct must not * contain any padding, because we sometimes compare pointers using memcmp. * * Note that this information is stored unaligned within actual tuples, so * you need to memcpy from the tuple into a local struct variable before * you can look at these fields! (The reason we use memcmp is to avoid * having to do that just to detect equality of two TOAST pointers...) *//* * These structs describe the header of a varlena object that may have been * TOASTed. Generally, don't reference these structs directly, but use the * macros below. * * We use separate structs for the aligned and unaligned cases because the * compiler might otherwise think it could generate code that assumes * alignment while touching fields of a 1-byte-header varlena. */typedef union{ struct /* Normal varlena (4-byte length) */ { uint32 va_header; char va_data[1]; } va_4byte; struct /* Compressed-in-line format */ { uint32 va_header; uint32 va_rawsize; /* Original data size (excludes header) */ char va_data[1]; /* Compressed data */ } va_compressed;} varattrib_4b;typedef struct{ uint8 va_header; char va_data[1]; /* Data begins here */} varattrib_1b;typedef struct{ uint8 va_header; /* Always 0x80 or 0x01 */ uint8 va_len_1be; /* Physical length of datum */ char va_data[1]; /* Data (for now always a TOAST pointer) */} varattrib_1b_e;/* * Bit layouts for varlena headers on big-endian machines: * * 00xxxxxx 4-byte length word, aligned, uncompressed data (up to 1G) * 01xxxxxx 4-byte length word, aligned, *compressed* data (up to 1G) * 10000000 1-byte length word, unaligned, TOAST pointer * 1xxxxxxx 1-byte length word, unaligned, uncompressed data (up to 126b) * * Bit layouts for varlena headers on little-endian machines: * * xxxxxx00 4-byte length word, aligned, uncompressed data (up to 1G) * xxxxxx10 4-byte length word, aligned, *compressed* data (up to 1G) * 00000001 1-byte length word, unaligned, TOAST pointer * xxxxxxx1 1-byte length word, unaligned, uncompressed data (up to 126b) * * The "xxx" bits are the length field (which includes itself in all cases). * In the big-endian case we mask to extract the length, in the little-endian * case we shift. Note that in both cases the flag bits are in the physically * first byte. Also, it is not possible for a 1-byte length word to be zero; * this lets us disambiguate alignment padding bytes from the start of an * unaligned datum. (We now *require* pad bytes to be filled with zero!) *//* * Endian-dependent macros. These are considered internal --- use the * external macros below instead of using these directly. * * Note: IS_1B is true for external toast records but VARSIZE_1B will return 0 * for such records. Hence you should usually check for IS_EXTERNAL before * checking for IS_1B. */#ifdef WORDS_BIGENDIAN#define VARATT_IS_4B(PTR) \ ((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x00)#define VARATT_IS_4B_U(PTR) \ ((((varattrib_1b *) (PTR))->va_header & 0xC0) == 0x00)#define VARATT_IS_4B_C(PTR) \ ((((varattrib_1b *) (PTR))->va_header & 0xC0) == 0x40)#define VARATT_IS_1B(PTR) \ ((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x80)#define VARATT_IS_1B_E(PTR) \ ((((varattrib_1b *) (PTR))->va_header) == 0x80)#define VARATT_NOT_PAD_BYTE(PTR) \ (*((uint8 *) (PTR)) != 0)/* VARSIZE_4B() should only be used on known-aligned data */#define VARSIZE_4B(PTR) \ (((varattrib_4b *) (PTR))->va_4byte.va_header & 0x3FFFFFFF)#define VARSIZE_1B(PTR) \ (((varattrib_1b *) (PTR))->va_header & 0x7F)#define VARSIZE_1B_E(PTR) \ (((varattrib_1b_e *) (PTR))->va_len_1be)#define SET_VARSIZE_4B(PTR,len) \ (((varattrib_4b *) (PTR))->va_4byte.va_header = (len) & 0x3FFFFFFF)#define SET_VARSIZE_4B_C(PTR,len) \ (((varattrib_4b *) (PTR))->va_4byte.va_header = ((len) & 0x3FFFFFFF) | 0x40000000)#define SET_VARSIZE_1B(PTR,len) \ (((varattrib_1b *) (PTR))->va_header = (len) | 0x80)#define SET_VARSIZE_1B_E(PTR,len) \ (((varattrib_1b_e *) (PTR))->va_header = 0x80, \ ((varattrib_1b_e *) (PTR))->va_len_1be = (len))#else /* !WORDS_BIGENDIAN */#define VARATT_IS_4B(PTR) \ ((((varattrib_1b *) (PTR))->va_header & 0x01) == 0x00)#define VARATT_IS_4B_U(PTR) \ ((((varattrib_1b *) (PTR))->va_header & 0x03) == 0x00)#define VARATT_IS_4B_C(PTR) \ ((((varattrib_1b *) (PTR))->va_header & 0x03) == 0x02)#define VARATT_IS_1B(PTR) \ ((((varattrib_1b *) (PTR))->va_header & 0x01) == 0x01)#define VARATT_IS_1B_E(PTR) \ ((((varattrib_1b *) (PTR))->va_header) == 0x01)#define VARATT_NOT_PAD_BYTE(PTR) \ (*((uint8 *) (PTR)) != 0)/* VARSIZE_4B() should only be used on known-aligned data */#define VARSIZE_4B(PTR) \ ((((varattrib_4b *) (PTR))->va_4byte.va_header >> 2) & 0x3FFFFFFF)#define VARSIZE_1B(PTR) \ ((((varattrib_1b *) (PTR))->va_header >> 1) & 0x7F)#define VARSIZE_1B_E(PTR) \ (((varattrib_1b_e *) (PTR))->va_len_1be)#define SET_VARSIZE_4B(PTR,len) \ (((varattrib_4b *) (PTR))->va_4byte.va_header = (((uint32) (len)) << 2))#define SET_VARSIZE_4B_C(PTR,len) \ (((varattrib_4b *) (PTR))->va_4byte.va_header = (((uint32) (len)) << 2) | 0x02)#define SET_VARSIZE_1B(PTR,len) \ (((varattrib_1b *) (PTR))->va_header = (((uint8) (len)) << 1) | 0x01)#define SET_VARSIZE_1B_E(PTR,len) \ (((varattrib_1b_e *) (PTR))->va_header = 0x01, \ ((varattrib_1b_e *) (PTR))->va_len_1be = (len))#endif /* WORDS_BIGENDIAN */#define VARHDRSZ_SHORT 1#define VARATT_SHORT_MAX 0x7F#define VARATT_CAN_MAKE_SHORT(PTR) \ (VARATT_IS_4B_U(PTR) && \ (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT) <= VARATT_SHORT_MAX)#define VARATT_CONVERTED_SHORT_SIZE(PTR) \ (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT)#define VARHDRSZ_EXTERNAL 2#define VARDATA_4B(PTR) (((varattrib_4b *) (PTR))->va_4byte.va_data)#define VARDATA_4B_C(PTR) (((varattrib_4b *) (PTR))->va_compressed.va_data)#define VARDATA_1B(PTR) (((varattrib_1b *) (PTR))->va_data)#define VARDATA_1B_E(PTR) (((varattrib_1b_e *) (PTR))->va_data)#define VARRAWSIZE_4B_C(PTR) \ (((varattrib_4b *) (PTR))->va_compressed.va_rawsize)/* Externally visible macros *//* * VARDATA, VARSIZE, and SET_VARSIZE are the recommended API for most code * for varlena datatypes. Note that they only work on untoasted, 4-byte-header Datums! * VARDATA,VARSize 和 SET_WARSIZE是 arlena数据类型推荐使用的API。 * * Code that wants to use 1-byte-header values without detoasting should * use VARSIZE_ANY/VARSIZE_ANY_EXHDR/VARDATA_ANY. The other macros here * VARSIZE_ANY 获取指定指针的数据长度 * VARSIZE_ANY_EXHER * should usually be used only by tuple assembly/disassembly code and * code that specifically wants to work with still-toasted Datums. * * WARNING: It is only safe to use VARDATA_ANY() -- typically with * PG_DETOAST_DATUM_PACKED() -- if you really don't care about the alignment. * Either because you're working with something like text where the alignment * doesn't matter or because you're not going to access its constituent parts * and just use things like memcpy on it anyways. */#define VARDATA(PTR) VARDATA_4B(PTR)#define VARSIZE(PTR) VARSIZE_4B(PTR)#define VARSIZE_SHORT(PTR) VARSIZE_1B(PTR)#define VARDATA_SHORT(PTR) VARDATA_1B(PTR)#define VARSIZE_EXTERNAL(PTR) VARSIZE_1B_E(PTR)#define VARDATA_EXTERNAL(PTR) VARDATA_1B_E(PTR)#define VARATT_IS_COMPRESSED(PTR) VARATT_IS_4B_C(PTR)#define VARATT_IS_EXTERNAL(PTR) VARATT_IS_1B_E(PTR)#define VARATT_IS_SHORT(PTR) VARATT_IS_1B(PTR)#define VARATT_IS_EXTENDED(PTR) (!VARATT_IS_4B_U(PTR))#define SET_VARSIZE(PTR, len) SET_VARSIZE_4B(PTR, len)#define SET_VARSIZE_SHORT(PTR, len) SET_VARSIZE_1B(PTR, len)#define SET_VARSIZE_COMPRESSED(PTR, len) SET_VARSIZE_4B_C(PTR, len)#define SET_VARSIZE_EXTERNAL(PTR, len) SET_VARSIZE_1B_E(PTR, len)#define VARSIZE_ANY(PTR) \ (VARATT_IS_1B_E(PTR) ? VARSIZE_1B_E(PTR) : \ (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR) : \ VARSIZE_4B(PTR)))#define VARSIZE_ANY_EXHDR(PTR) \ (VARATT_IS_1B_E(PTR) ? VARSIZE_1B_E(PTR)-VARHDRSZ_EXTERNAL : \ (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR)-VARHDRSZ_SHORT : \ VARSIZE_4B(PTR)-VARHDRSZ))/* caution: this will not work on an external or compressed-in-line Datum *//* caution: this will return a possibly unaligned pointer */#define VARDATA_ANY(PTR) \ (VARATT_IS_1B(PTR) ? VARDATA_1B(PTR) : VARDATA_4B(PTR))/* ---------------------------------------------------------------- * Section 2: datum type + support macros * ---------------------------------------------------------------- *//* * Port Notes: * Postgres makes the following assumption about machines: * * sizeof(Datum) == sizeof(long) >= sizeof(void *) >= 4 * * Postgres also assumes that * * sizeof(char) == 1 * * and that * * sizeof(short) == 2 * * When a type narrower than Datum is stored in a Datum, we place it in the * low-order bits and are careful that the DatumGetXXX macro for it discards * the unused high-order bits (as opposed to, say, assuming they are zero). * This is needed to support old-style user-defined functions, since depending * on architecture and compiler, the return value of a function returning char * or short may contain garbage when called as if it returned Datum. */typedef unsigned long Datum; /* XXX sizeof(long) >= sizeof(void *) *//* ---------------------------------------------------------------- * Section 3: exception handling definitions * Assert, Trap, etc macros * ---------------------------------------------------------------- */extern PGDLLIMPORT bool assert_enabled;/* * USE_ASSERT_CHECKING, if defined, turns on all the assertions. * - plai 9/5/90 * * It should _NOT_ be defined in releases or in benchmark copies *//* * Trap * Generates an exception if the given condition is true. */#define Trap(condition, errorType) \ do { \ if ((assert_enabled) && (condition)) \ ExceptionalCondition(CppAsString(condition), (errorType), \ __FILE__, __LINE__); \ } while (0)/* * TrapMacro is the same as Trap but it's intended for use in macros: * * #define foo(x) (AssertMacro(x != 0) && bar(x)) * * Isn't CPP fun? */#define TrapMacro(condition, errorType) \ ((bool) ((! assert_enabled) || ! (condition) || \ (ExceptionalCondition(CppAsString(condition), (errorType), \ __FILE__, __LINE__))))#ifndef USE_ASSERT_CHECKING#define Assert(condition)#define AssertMacro(condition) ((void)true)#define AssertArg(condition)#define AssertState(condition)#else#define Assert(condition) \ Trap(!(condition), "FailedAssertion")#define AssertMacro(condition) \ ((void) TrapMacro(!(condition), "FailedAssertion"))#define AssertArg(condition) \ Trap(!(condition), "BadArgument")#define AssertState(condition) \ Trap(!(condition), "BadState")#endif /* USE_ASSERT_CHECKING */extern int ExceptionalCondition(const char *conditionName, const char *errorType, const char *fileName, int lineNumber);/* ---------------------------------------------------------------- * Section 4: genbki macros used by catalog/pg_xxx.h files * ---------------------------------------------------------------- */#define CATALOG(name,oid) typedef struct CppConcat(FormData_,name)#define BKI_BOOTSTRAP#define BKI_SHARED_RELATION#define BKI_WITHOUT_OIDS/* these need to expand into some harmless, repeatable declaration */#define DATA(x) extern int no_such_variable#define DESCR(x) extern int no_such_variable#define SHDESCR(x) extern int no_such_variable#endif /* POSTGRES_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -