LCOV - code coverage report
Current view: top level - src/include - postgres.h (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 97.4 % 78 76
Test Date: 2026-03-15 07:15:38 Functions: 97.3 % 37 36
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*-------------------------------------------------------------------------
       2              :  *
       3              :  * postgres.h
       4              :  *    Primary include file for PostgreSQL server .c files
       5              :  *
       6              :  * This should be the first file included by PostgreSQL backend modules.
       7              :  * Client-side code should include postgres_fe.h instead.
       8              :  *
       9              :  *
      10              :  * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
      11              :  * Portions Copyright (c) 1995, Regents of the University of California
      12              :  *
      13              :  * src/include/postgres.h
      14              :  *
      15              :  *-------------------------------------------------------------------------
      16              :  */
      17              : /* IWYU pragma: always_keep */
      18              : /*
      19              :  *----------------------------------------------------------------
      20              :  *   TABLE OF CONTENTS
      21              :  *
      22              :  *      When adding stuff to this file, please try to put stuff
      23              :  *      into the relevant section, or add new sections as appropriate.
      24              :  *
      25              :  *    section   description
      26              :  *    -------   ------------------------------------------------
      27              :  *      1)      Datum type + support functions
      28              :  *      2)      miscellaneous
      29              :  *
      30              :  *   NOTES
      31              :  *
      32              :  *  In general, this file should contain declarations that are widely needed
      33              :  *  in the backend environment, but are of no interest outside the backend.
      34              :  *
      35              :  *  Simple type definitions live in c.h, where they are shared with
      36              :  *  postgres_fe.h.  We do that since those type definitions are needed by
      37              :  *  frontend modules that want to deal with binary data transmission to or
      38              :  *  from the backend.  Type definitions in this file should be for
      39              :  *  representations that never escape the backend, such as Datum.
      40              :  *
      41              :  *----------------------------------------------------------------
      42              :  */
      43              : #ifndef POSTGRES_H
      44              : #define POSTGRES_H
      45              : 
      46              : /* IWYU pragma: begin_exports */
      47              : 
      48              : #include "c.h"
      49              : #include "utils/elog.h"
      50              : #include "utils/palloc.h"
      51              : 
      52              : /* IWYU pragma: end_exports */
      53              : 
      54              : /* ----------------------------------------------------------------
      55              :  *              Section 1:  Datum type + support functions
      56              :  * ----------------------------------------------------------------
      57              :  */
      58              : 
      59              : /*
      60              :  * A Datum contains either a value of a pass-by-value type or a pointer to a
      61              :  * value of a pass-by-reference type.  Therefore, we must have
      62              :  * sizeof(Datum) >= sizeof(void *).  No current or foreseeable Postgres
      63              :  * platform has pointers wider than 8 bytes, and standardizing on Datum being
      64              :  * exactly 8 bytes has advantages in reducing cross-platform differences.
      65              :  *
      66              :  * The functions below and the analogous functions for other types should be used to
      67              :  * convert between a Datum and the appropriate C type.
      68              :  */
      69              : 
      70              : typedef uint64_t Datum;
      71              : 
      72              : /*
      73              :  * This symbol is now vestigial, but we continue to define it so as not to
      74              :  * unnecessarily break extension code.
      75              :  */
      76              : #define SIZEOF_DATUM 8
      77              : 
      78              : /*
      79              :  * A NullableDatum is used in places where both a Datum and its nullness needs
      80              :  * to be stored. This can be more efficient than storing datums and nullness
      81              :  * in separate arrays, due to better spatial locality, even if more space may
      82              :  * be wasted due to padding.
      83              :  */
      84              : typedef struct NullableDatum
      85              : {
      86              : #define FIELDNO_NULLABLE_DATUM_DATUM 0
      87              :     Datum       value;
      88              : #define FIELDNO_NULLABLE_DATUM_ISNULL 1
      89              :     bool        isnull;
      90              :     /* due to alignment padding this could be used for flags for free */
      91              : } NullableDatum;
      92              : 
      93              : /*
      94              :  * DatumGetBool
      95              :  *      Returns boolean value of a datum.
      96              :  *
      97              :  * Note: any nonzero value will be considered true.
      98              :  */
      99              : static inline bool
     100    310861512 : DatumGetBool(Datum X)
     101              : {
     102    310861512 :     return (X != 0);
     103              : }
     104              : 
     105              : /*
     106              :  * BoolGetDatum
     107              :  *      Returns datum representation for a boolean.
     108              :  *
     109              :  * Note: any nonzero value will be considered true.
     110              :  */
     111              : static inline Datum
     112    233609551 : BoolGetDatum(bool X)
     113              : {
     114    233609551 :     return (Datum) (X ? 1 : 0);
     115              : }
     116              : 
     117              : /*
     118              :  * DatumGetChar
     119              :  *      Returns character value of a datum.
     120              :  */
     121              : static inline char
     122    106604819 : DatumGetChar(Datum X)
     123              : {
     124    106604819 :     return (char) X;
     125              : }
     126              : 
     127              : /*
     128              :  * CharGetDatum
     129              :  *      Returns datum representation for a character.
     130              :  */
     131              : static inline Datum
     132     89412470 : CharGetDatum(char X)
     133              : {
     134     89412470 :     return (Datum) X;
     135              : }
     136              : 
     137              : /*
     138              :  * DatumGetUInt8
     139              :  *      Returns 8-bit unsigned integer value of a datum.
     140              :  */
     141              : static inline uint8
     142            0 : DatumGetUInt8(Datum X)
     143              : {
     144            0 :     return (uint8) X;
     145              : }
     146              : 
     147              : /*
     148              :  * UInt8GetDatum
     149              :  *      Returns datum representation for an 8-bit unsigned integer.
     150              :  */
     151              : static inline Datum
     152           48 : UInt8GetDatum(uint8 X)
     153              : {
     154           48 :     return (Datum) X;
     155              : }
     156              : 
     157              : /*
     158              :  * DatumGetInt16
     159              :  *      Returns 16-bit integer value of a datum.
     160              :  */
     161              : static inline int16
     162     95996812 : DatumGetInt16(Datum X)
     163              : {
     164     95996812 :     return (int16) X;
     165              : }
     166              : 
     167              : /*
     168              :  * Int16GetDatum
     169              :  *      Returns datum representation for a 16-bit integer.
     170              :  */
     171              : static inline Datum
     172     52917757 : Int16GetDatum(int16 X)
     173              : {
     174     52917757 :     return (Datum) X;
     175              : }
     176              : 
     177              : /*
     178              :  * DatumGetUInt16
     179              :  *      Returns 16-bit unsigned integer value of a datum.
     180              :  */
     181              : static inline uint16
     182      5666482 : DatumGetUInt16(Datum X)
     183              : {
     184      5666482 :     return (uint16) X;
     185              : }
     186              : 
     187              : /*
     188              :  * UInt16GetDatum
     189              :  *      Returns datum representation for a 16-bit unsigned integer.
     190              :  */
     191              : static inline Datum
     192      2146930 : UInt16GetDatum(uint16 X)
     193              : {
     194      2146930 :     return (Datum) X;
     195              : }
     196              : 
     197              : /*
     198              :  * DatumGetInt32
     199              :  *      Returns 32-bit integer value of a datum.
     200              :  */
     201              : static inline int32
     202    996865388 : DatumGetInt32(Datum X)
     203              : {
     204    996865388 :     return (int32) X;
     205              : }
     206              : 
     207              : /*
     208              :  * Int32GetDatum
     209              :  *      Returns datum representation for a 32-bit integer.
     210              :  */
     211              : static inline Datum
     212   1105302927 : Int32GetDatum(int32 X)
     213              : {
     214   1105302927 :     return (Datum) X;
     215              : }
     216              : 
     217              : /*
     218              :  * DatumGetUInt32
     219              :  *      Returns 32-bit unsigned integer value of a datum.
     220              :  */
     221              : static inline uint32
     222     65250404 : DatumGetUInt32(Datum X)
     223              : {
     224     65250404 :     return (uint32) X;
     225              : }
     226              : 
     227              : /*
     228              :  * UInt32GetDatum
     229              :  *      Returns datum representation for a 32-bit unsigned integer.
     230              :  */
     231              : static inline Datum
     232     55980857 : UInt32GetDatum(uint32 X)
     233              : {
     234     55980857 :     return (Datum) X;
     235              : }
     236              : 
     237              : /*
     238              :  * DatumGetObjectId
     239              :  *      Returns object identifier value of a datum.
     240              :  */
     241              : static inline Oid
     242    724018605 : DatumGetObjectId(Datum X)
     243              : {
     244    724018605 :     return (Oid) X;
     245              : }
     246              : 
     247              : /*
     248              :  * ObjectIdGetDatum
     249              :  *      Returns datum representation for an object identifier.
     250              :  */
     251              : static inline Datum
     252    107199879 : ObjectIdGetDatum(Oid X)
     253              : {
     254    107199879 :     return (Datum) X;
     255              : }
     256              : 
     257              : /*
     258              :  * DatumGetObjectId8
     259              :  *      Returns 8-byte object identifier value of a datum.
     260              :  */
     261              : static inline Oid8
     262         7702 : DatumGetObjectId8(Datum X)
     263              : {
     264         7702 :     return (Oid8) X;
     265              : }
     266              : 
     267              : /*
     268              :  * ObjectId8GetDatum
     269              :  *      Returns datum representation for an 8-byte object identifier
     270              :  */
     271              : static inline Datum
     272         1620 : ObjectId8GetDatum(Oid8 X)
     273              : {
     274         1620 :     return (Datum) X;
     275              : }
     276              : 
     277              : /*
     278              :  * DatumGetTransactionId
     279              :  *      Returns transaction identifier value of a datum.
     280              :  */
     281              : static inline TransactionId
     282       904058 : DatumGetTransactionId(Datum X)
     283              : {
     284       904058 :     return (TransactionId) X;
     285              : }
     286              : 
     287              : /*
     288              :  * TransactionIdGetDatum
     289              :  *      Returns datum representation for a transaction identifier.
     290              :  */
     291              : static inline Datum
     292       534779 : TransactionIdGetDatum(TransactionId X)
     293              : {
     294       534779 :     return (Datum) X;
     295              : }
     296              : 
     297              : /*
     298              :  * MultiXactIdGetDatum
     299              :  *      Returns datum representation for a multixact identifier.
     300              :  */
     301              : static inline Datum
     302        71403 : MultiXactIdGetDatum(MultiXactId X)
     303              : {
     304        71403 :     return (Datum) X;
     305              : }
     306              : 
     307              : /*
     308              :  * DatumGetCommandId
     309              :  *      Returns command identifier value of a datum.
     310              :  */
     311              : static inline CommandId
     312           97 : DatumGetCommandId(Datum X)
     313              : {
     314           97 :     return (CommandId) X;
     315              : }
     316              : 
     317              : /*
     318              :  * CommandIdGetDatum
     319              :  *      Returns datum representation for a command identifier.
     320              :  */
     321              : static inline Datum
     322           96 : CommandIdGetDatum(CommandId X)
     323              : {
     324           96 :     return (Datum) X;
     325              : }
     326              : 
     327              : /*
     328              :  * DatumGetPointer
     329              :  *      Returns pointer value of a datum.
     330              :  */
     331              : static inline Pointer
     332    872409294 : DatumGetPointer(Datum X)
     333              : {
     334    872409294 :     return (Pointer) (uintptr_t) X;
     335              : }
     336              : 
     337              : /*
     338              :  * PointerGetDatum
     339              :  *      Returns datum representation for a pointer.
     340              :  */
     341              : static inline Datum
     342    796266466 : PointerGetDatum(const void *X)
     343              : {
     344    796266466 :     return (Datum) (uintptr_t) X;
     345              : }
     346              : 
     347              : /*
     348              :  * DatumGetCString
     349              :  *      Returns C string (null-terminated string) value of a datum.
     350              :  *
     351              :  * Note: C string is not a full-fledged Postgres type at present,
     352              :  * but type input functions use this conversion for their inputs.
     353              :  */
     354              : static inline char *
     355     61689143 : DatumGetCString(Datum X)
     356              : {
     357     61689143 :     return (char *) DatumGetPointer(X);
     358              : }
     359              : 
     360              : /*
     361              :  * CStringGetDatum
     362              :  *      Returns datum representation for a C string (null-terminated string).
     363              :  *
     364              :  * Note: C string is not a full-fledged Postgres type at present,
     365              :  * but type output functions use this conversion for their outputs.
     366              :  * Note: CString is pass-by-reference; caller must ensure the pointed-to
     367              :  * value has adequate lifetime.
     368              :  */
     369              : static inline Datum
     370     58705562 : CStringGetDatum(const char *X)
     371              : {
     372     58705562 :     return PointerGetDatum(X);
     373              : }
     374              : 
     375              : /*
     376              :  * DatumGetName
     377              :  *      Returns name value of a datum.
     378              :  */
     379              : static inline Name
     380     94891809 : DatumGetName(Datum X)
     381              : {
     382     94891809 :     return (Name) DatumGetPointer(X);
     383              : }
     384              : 
     385              : /*
     386              :  * NameGetDatum
     387              :  *      Returns datum representation for a name.
     388              :  *
     389              :  * Note: Name is pass-by-reference; caller must ensure the pointed-to
     390              :  * value has adequate lifetime.
     391              :  */
     392              : static inline Datum
     393      1887948 : NameGetDatum(const NameData *X)
     394              : {
     395      1887948 :     return CStringGetDatum(NameStr(*X));
     396              : }
     397              : 
     398              : /*
     399              :  * DatumGetInt64
     400              :  *      Returns 64-bit integer value of a datum.
     401              :  */
     402              : static inline int64
     403     61763316 : DatumGetInt64(Datum X)
     404              : {
     405     61763316 :     return (int64) X;
     406              : }
     407              : 
     408              : /*
     409              :  * Int64GetDatum
     410              :  *      Returns datum representation for a 64-bit integer.
     411              :  */
     412              : static inline Datum
     413     46754758 : Int64GetDatum(int64 X)
     414              : {
     415     46754758 :     return (Datum) X;
     416              : }
     417              : 
     418              : /*
     419              :  * DatumGetUInt64
     420              :  *      Returns 64-bit unsigned integer value of a datum.
     421              :  */
     422              : static inline uint64
     423      7088100 : DatumGetUInt64(Datum X)
     424              : {
     425      7088100 :     return (uint64) X;
     426              : }
     427              : 
     428              : /*
     429              :  * UInt64GetDatum
     430              :  *      Returns datum representation for a 64-bit unsigned integer.
     431              :  */
     432              : static inline Datum
     433      5265804 : UInt64GetDatum(uint64 X)
     434              : {
     435      5265804 :     return (Datum) X;
     436              : }
     437              : 
     438              : /*
     439              :  * Float <-> Datum conversions
     440              :  *
     441              :  * These have to be implemented as inline functions rather than macros, when
     442              :  * passing by value, because many machines pass int and float function
     443              :  * parameters/results differently; so we need to play weird games with unions.
     444              :  */
     445              : 
     446              : /*
     447              :  * DatumGetFloat4
     448              :  *      Returns 4-byte floating point value of a datum.
     449              :  */
     450              : static inline float4
     451     16264746 : DatumGetFloat4(Datum X)
     452              : {
     453              :     union
     454              :     {
     455              :         int32       value;
     456              :         float4      retval;
     457              :     }           myunion;
     458              : 
     459     16264746 :     myunion.value = DatumGetInt32(X);
     460     16264746 :     return myunion.retval;
     461              : }
     462              : 
     463              : /*
     464              :  * Float4GetDatum
     465              :  *      Returns datum representation for a 4-byte floating point number.
     466              :  */
     467              : static inline Datum
     468      1241658 : Float4GetDatum(float4 X)
     469              : {
     470              :     union
     471              :     {
     472              :         float4      value;
     473              :         int32       retval;
     474              :     }           myunion;
     475              : 
     476      1241658 :     myunion.value = X;
     477      1241658 :     return Int32GetDatum(myunion.retval);
     478              : }
     479              : 
     480              : /*
     481              :  * DatumGetFloat8
     482              :  *      Returns 8-byte floating point value of a datum.
     483              :  */
     484              : static inline float8
     485     14041370 : DatumGetFloat8(Datum X)
     486              : {
     487              :     union
     488              :     {
     489              :         int64       value;
     490              :         float8      retval;
     491              :     }           myunion;
     492              : 
     493     14041370 :     myunion.value = DatumGetInt64(X);
     494     14041370 :     return myunion.retval;
     495              : }
     496              : 
     497              : /*
     498              :  * Float8GetDatum
     499              :  *      Returns datum representation for an 8-byte floating point number.
     500              :  */
     501              : static inline Datum
     502      6925335 : Float8GetDatum(float8 X)
     503              : {
     504              :     union
     505              :     {
     506              :         float8      value;
     507              :         int64       retval;
     508              :     }           myunion;
     509              : 
     510      6925335 :     myunion.value = X;
     511      6925335 :     return Int64GetDatum(myunion.retval);
     512              : }
     513              : 
     514              : /*
     515              :  * Int64GetDatumFast
     516              :  * Float8GetDatumFast
     517              :  *
     518              :  * These macros were intended to allow writing code that does not depend on
     519              :  * whether int64 and float8 are pass-by-reference types, while not
     520              :  * sacrificing performance when they are.  They are no longer different
     521              :  * from the regular functions, though we keep the assertions to protect
     522              :  * code that might get back-patched into older branches.
     523              :  */
     524              : 
     525              : #define Int64GetDatumFast(X) \
     526              :     (StaticAssertVariableIsOfTypeMacro(X, int64), Int64GetDatum(X))
     527              : #define Float8GetDatumFast(X) \
     528              :     (StaticAssertVariableIsOfTypeMacro(X, double), Float8GetDatum(X))
     529              : 
     530              : 
     531              : /* ----------------------------------------------------------------
     532              :  *              Section 2:  miscellaneous
     533              :  * ----------------------------------------------------------------
     534              :  */
     535              : 
     536              : /*
     537              :  * pg_ternary
     538              :  *      Boolean value with an extra "unset" value
     539              :  *
     540              :  * This enum can be used for values that want to distinguish between true,
     541              :  * false, and unset.
     542              : */
     543              : typedef enum pg_ternary
     544              : {
     545              :     PG_TERNARY_FALSE = 0,
     546              :     PG_TERNARY_TRUE = 1,
     547              :     PG_TERNARY_UNSET = -1
     548              : } pg_ternary;
     549              : 
     550              : /*
     551              :  * NON_EXEC_STATIC: It's sometimes useful to define a variable or function
     552              :  * that is normally static but extern when using EXEC_BACKEND (see
     553              :  * pg_config_manual.h).  There would then typically be some code in
     554              :  * postmaster.c that uses those extern symbols to transfer state between
     555              :  * processes or do whatever other things it needs to do in EXEC_BACKEND mode.
     556              :  */
     557              : #ifdef EXEC_BACKEND
     558              : #define NON_EXEC_STATIC
     559              : #else
     560              : #define NON_EXEC_STATIC static
     561              : #endif
     562              : 
     563              : #endif                          /* POSTGRES_H */
        

Generated by: LCOV version 2.0-1