LCOV - code coverage report
Current view: top level - src/include - postgres.h (source / functions) Hit Total Coverage
Test: PostgreSQL 19devel Lines: 76 78 97.4 %
Date: 2026-01-13 00:17:44 Functions: 36 37 97.3 %
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   588217964 : DatumGetBool(Datum X)
     101             : {
     102   588217964 :     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   431920442 : BoolGetDatum(bool X)
     113             : {
     114   431920442 :     return (Datum) (X ? 1 : 0);
     115             : }
     116             : 
     117             : /*
     118             :  * DatumGetChar
     119             :  *      Returns character value of a datum.
     120             :  */
     121             : static inline char
     122   205859950 : DatumGetChar(Datum X)
     123             : {
     124   205859950 :     return (char) X;
     125             : }
     126             : 
     127             : /*
     128             :  * CharGetDatum
     129             :  *      Returns datum representation for a character.
     130             :  */
     131             : static inline Datum
     132   165379318 : CharGetDatum(char X)
     133             : {
     134   165379318 :     return (Datum) X;
     135             : }
     136             : 
     137             : /*
     138             :  * Int8GetDatum
     139             :  *      Returns datum representation for an 8-bit integer.
     140             :  */
     141             : static inline Datum
     142             : Int8GetDatum(int8 X)
     143             : {
     144             :     return (Datum) X;
     145             : }
     146             : 
     147             : /*
     148             :  * DatumGetUInt8
     149             :  *      Returns 8-bit unsigned integer value of a datum.
     150             :  */
     151             : static inline uint8
     152           0 : DatumGetUInt8(Datum X)
     153             : {
     154           0 :     return (uint8) X;
     155             : }
     156             : 
     157             : /*
     158             :  * UInt8GetDatum
     159             :  *      Returns datum representation for an 8-bit unsigned integer.
     160             :  */
     161             : static inline Datum
     162          96 : UInt8GetDatum(uint8 X)
     163             : {
     164          96 :     return (Datum) X;
     165             : }
     166             : 
     167             : /*
     168             :  * DatumGetInt16
     169             :  *      Returns 16-bit integer value of a datum.
     170             :  */
     171             : static inline int16
     172   186024114 : DatumGetInt16(Datum X)
     173             : {
     174   186024114 :     return (int16) X;
     175             : }
     176             : 
     177             : /*
     178             :  * Int16GetDatum
     179             :  *      Returns datum representation for a 16-bit integer.
     180             :  */
     181             : static inline Datum
     182   102593226 : Int16GetDatum(int16 X)
     183             : {
     184   102593226 :     return (Datum) X;
     185             : }
     186             : 
     187             : /*
     188             :  * DatumGetUInt16
     189             :  *      Returns 16-bit unsigned integer value of a datum.
     190             :  */
     191             : static inline uint16
     192    11361698 : DatumGetUInt16(Datum X)
     193             : {
     194    11361698 :     return (uint16) X;
     195             : }
     196             : 
     197             : /*
     198             :  * UInt16GetDatum
     199             :  *      Returns datum representation for a 16-bit unsigned integer.
     200             :  */
     201             : static inline Datum
     202     2280456 : UInt16GetDatum(uint16 X)
     203             : {
     204     2280456 :     return (Datum) X;
     205             : }
     206             : 
     207             : /*
     208             :  * DatumGetInt32
     209             :  *      Returns 32-bit integer value of a datum.
     210             :  */
     211             : static inline int32
     212  2061623126 : DatumGetInt32(Datum X)
     213             : {
     214  2061623126 :     return (int32) X;
     215             : }
     216             : 
     217             : /*
     218             :  * Int32GetDatum
     219             :  *      Returns datum representation for a 32-bit integer.
     220             :  */
     221             : static inline Datum
     222  2074561570 : Int32GetDatum(int32 X)
     223             : {
     224  2074561570 :     return (Datum) X;
     225             : }
     226             : 
     227             : /*
     228             :  * DatumGetUInt32
     229             :  *      Returns 32-bit unsigned integer value of a datum.
     230             :  */
     231             : static inline uint32
     232    86283244 : DatumGetUInt32(Datum X)
     233             : {
     234    86283244 :     return (uint32) X;
     235             : }
     236             : 
     237             : /*
     238             :  * UInt32GetDatum
     239             :  *      Returns datum representation for a 32-bit unsigned integer.
     240             :  */
     241             : static inline Datum
     242    68312298 : UInt32GetDatum(uint32 X)
     243             : {
     244    68312298 :     return (Datum) X;
     245             : }
     246             : 
     247             : /*
     248             :  * DatumGetObjectId
     249             :  *      Returns object identifier value of a datum.
     250             :  */
     251             : static inline Oid
     252  1371062632 : DatumGetObjectId(Datum X)
     253             : {
     254  1371062632 :     return (Oid) X;
     255             : }
     256             : 
     257             : /*
     258             :  * ObjectIdGetDatum
     259             :  *      Returns datum representation for an object identifier.
     260             :  */
     261             : static inline Datum
     262   195553280 : ObjectIdGetDatum(Oid X)
     263             : {
     264   195553280 :     return (Datum) X;
     265             : }
     266             : 
     267             : /*
     268             :  * DatumGetObjectId8
     269             :  *      Returns 8-byte object identifier value of a datum.
     270             :  */
     271             : static inline Oid8
     272       15404 : DatumGetObjectId8(Datum X)
     273             : {
     274       15404 :     return (Oid8) X;
     275             : }
     276             : 
     277             : /*
     278             :  * ObjectId8GetDatum
     279             :  *      Returns datum representation for an 8-byte object identifier
     280             :  */
     281             : static inline Datum
     282        3240 : ObjectId8GetDatum(Oid8 X)
     283             : {
     284        3240 :     return (Datum) X;
     285             : }
     286             : 
     287             : /*
     288             :  * DatumGetTransactionId
     289             :  *      Returns transaction identifier value of a datum.
     290             :  */
     291             : static inline TransactionId
     292     1775132 : DatumGetTransactionId(Datum X)
     293             : {
     294     1775132 :     return (TransactionId) X;
     295             : }
     296             : 
     297             : /*
     298             :  * TransactionIdGetDatum
     299             :  *      Returns datum representation for a transaction identifier.
     300             :  */
     301             : static inline Datum
     302     1068256 : TransactionIdGetDatum(TransactionId X)
     303             : {
     304     1068256 :     return (Datum) X;
     305             : }
     306             : 
     307             : /*
     308             :  * MultiXactIdGetDatum
     309             :  *      Returns datum representation for a multixact identifier.
     310             :  */
     311             : static inline Datum
     312      141506 : MultiXactIdGetDatum(MultiXactId X)
     313             : {
     314      141506 :     return (Datum) X;
     315             : }
     316             : 
     317             : /*
     318             :  * DatumGetCommandId
     319             :  *      Returns command identifier value of a datum.
     320             :  */
     321             : static inline CommandId
     322         194 : DatumGetCommandId(Datum X)
     323             : {
     324         194 :     return (CommandId) X;
     325             : }
     326             : 
     327             : /*
     328             :  * CommandIdGetDatum
     329             :  *      Returns datum representation for a command identifier.
     330             :  */
     331             : static inline Datum
     332         192 : CommandIdGetDatum(CommandId X)
     333             : {
     334         192 :     return (Datum) X;
     335             : }
     336             : 
     337             : /*
     338             :  * DatumGetPointer
     339             :  *      Returns pointer value of a datum.
     340             :  */
     341             : static inline Pointer
     342  1723478106 : DatumGetPointer(Datum X)
     343             : {
     344  1723478106 :     return (Pointer) (uintptr_t) X;
     345             : }
     346             : 
     347             : /*
     348             :  * PointerGetDatum
     349             :  *      Returns datum representation for a pointer.
     350             :  */
     351             : static inline Datum
     352  1519313176 : PointerGetDatum(const void *X)
     353             : {
     354  1519313176 :     return (Datum) (uintptr_t) X;
     355             : }
     356             : 
     357             : /*
     358             :  * DatumGetCString
     359             :  *      Returns C string (null-terminated string) value of a datum.
     360             :  *
     361             :  * Note: C string is not a full-fledged Postgres type at present,
     362             :  * but type input functions use this conversion for their inputs.
     363             :  */
     364             : static inline char *
     365   112039982 : DatumGetCString(Datum X)
     366             : {
     367   112039982 :     return (char *) DatumGetPointer(X);
     368             : }
     369             : 
     370             : /*
     371             :  * CStringGetDatum
     372             :  *      Returns datum representation for a C string (null-terminated string).
     373             :  *
     374             :  * Note: C string is not a full-fledged Postgres type at present,
     375             :  * but type output functions use this conversion for their outputs.
     376             :  * Note: CString is pass-by-reference; caller must ensure the pointed-to
     377             :  * value has adequate lifetime.
     378             :  */
     379             : static inline Datum
     380   106210466 : CStringGetDatum(const char *X)
     381             : {
     382   106210466 :     return PointerGetDatum(X);
     383             : }
     384             : 
     385             : /*
     386             :  * DatumGetName
     387             :  *      Returns name value of a datum.
     388             :  */
     389             : static inline Name
     390   196035634 : DatumGetName(Datum X)
     391             : {
     392   196035634 :     return (Name) DatumGetPointer(X);
     393             : }
     394             : 
     395             : /*
     396             :  * NameGetDatum
     397             :  *      Returns datum representation for a name.
     398             :  *
     399             :  * Note: Name is pass-by-reference; caller must ensure the pointed-to
     400             :  * value has adequate lifetime.
     401             :  */
     402             : static inline Datum
     403     3729478 : NameGetDatum(const NameData *X)
     404             : {
     405     3729478 :     return CStringGetDatum(NameStr(*X));
     406             : }
     407             : 
     408             : /*
     409             :  * DatumGetInt64
     410             :  *      Returns 64-bit integer value of a datum.
     411             :  */
     412             : static inline int64
     413   144222602 : DatumGetInt64(Datum X)
     414             : {
     415   144222602 :     return (int64) X;
     416             : }
     417             : 
     418             : /*
     419             :  * Int64GetDatum
     420             :  *      Returns datum representation for a 64-bit integer.
     421             :  */
     422             : static inline Datum
     423    91335162 : Int64GetDatum(int64 X)
     424             : {
     425    91335162 :     return (Datum) X;
     426             : }
     427             : 
     428             : /*
     429             :  * DatumGetUInt64
     430             :  *      Returns 64-bit unsigned integer value of a datum.
     431             :  */
     432             : static inline uint64
     433    14160820 : DatumGetUInt64(Datum X)
     434             : {
     435    14160820 :     return (uint64) X;
     436             : }
     437             : 
     438             : /*
     439             :  * UInt64GetDatum
     440             :  *      Returns datum representation for a 64-bit unsigned integer.
     441             :  */
     442             : static inline Datum
     443    10511256 : UInt64GetDatum(uint64 X)
     444             : {
     445    10511256 :     return (Datum) X;
     446             : }
     447             : 
     448             : /*
     449             :  * Float <-> Datum conversions
     450             :  *
     451             :  * These have to be implemented as inline functions rather than macros, when
     452             :  * passing by value, because many machines pass int and float function
     453             :  * parameters/results differently; so we need to play weird games with unions.
     454             :  */
     455             : 
     456             : /*
     457             :  * DatumGetFloat4
     458             :  *      Returns 4-byte floating point value of a datum.
     459             :  */
     460             : static inline float4
     461    31853818 : DatumGetFloat4(Datum X)
     462             : {
     463             :     union
     464             :     {
     465             :         int32       value;
     466             :         float4      retval;
     467             :     }           myunion;
     468             : 
     469    31853818 :     myunion.value = DatumGetInt32(X);
     470    31853818 :     return myunion.retval;
     471             : }
     472             : 
     473             : /*
     474             :  * Float4GetDatum
     475             :  *      Returns datum representation for a 4-byte floating point number.
     476             :  */
     477             : static inline Datum
     478     2508862 : Float4GetDatum(float4 X)
     479             : {
     480             :     union
     481             :     {
     482             :         float4      value;
     483             :         int32       retval;
     484             :     }           myunion;
     485             : 
     486     2508862 :     myunion.value = X;
     487     2508862 :     return Int32GetDatum(myunion.retval);
     488             : }
     489             : 
     490             : /*
     491             :  * DatumGetFloat8
     492             :  *      Returns 8-byte floating point value of a datum.
     493             :  */
     494             : static inline float8
     495    29175702 : DatumGetFloat8(Datum X)
     496             : {
     497             :     union
     498             :     {
     499             :         int64       value;
     500             :         float8      retval;
     501             :     }           myunion;
     502             : 
     503    29175702 :     myunion.value = DatumGetInt64(X);
     504    29175702 :     return myunion.retval;
     505             : }
     506             : 
     507             : /*
     508             :  * Float8GetDatum
     509             :  *      Returns datum representation for an 8-byte floating point number.
     510             :  */
     511             : static inline Datum
     512    13679762 : Float8GetDatum(float8 X)
     513             : {
     514             :     union
     515             :     {
     516             :         float8      value;
     517             :         int64       retval;
     518             :     }           myunion;
     519             : 
     520    13679762 :     myunion.value = X;
     521    13679762 :     return Int64GetDatum(myunion.retval);
     522             : }
     523             : 
     524             : /*
     525             :  * Int64GetDatumFast
     526             :  * Float8GetDatumFast
     527             :  *
     528             :  * These macros were intended to allow writing code that does not depend on
     529             :  * whether int64 and float8 are pass-by-reference types, while not
     530             :  * sacrificing performance when they are.  They are no longer different
     531             :  * from the regular functions, though we keep the assertions to protect
     532             :  * code that might get back-patched into older branches.
     533             :  */
     534             : 
     535             : #define Int64GetDatumFast(X) \
     536             :     (AssertVariableIsOfTypeMacro(X, int64), Int64GetDatum(X))
     537             : #define Float8GetDatumFast(X) \
     538             :     (AssertVariableIsOfTypeMacro(X, double), Float8GetDatum(X))
     539             : 
     540             : 
     541             : /* ----------------------------------------------------------------
     542             :  *              Section 2:  miscellaneous
     543             :  * ----------------------------------------------------------------
     544             :  */
     545             : 
     546             : /*
     547             :  * NON_EXEC_STATIC: It's sometimes useful to define a variable or function
     548             :  * that is normally static but extern when using EXEC_BACKEND (see
     549             :  * pg_config_manual.h).  There would then typically be some code in
     550             :  * postmaster.c that uses those extern symbols to transfer state between
     551             :  * processes or do whatever other things it needs to do in EXEC_BACKEND mode.
     552             :  */
     553             : #ifdef EXEC_BACKEND
     554             : #define NON_EXEC_STATIC
     555             : #else
     556             : #define NON_EXEC_STATIC static
     557             : #endif
     558             : 
     559             : #endif                          /* POSTGRES_H */

Generated by: LCOV version 1.16