PostgreSQL Source Code git master
Loading...
Searching...
No Matches
postgres.h
Go to the documentation of this file.
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
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 */
84typedef struct NullableDatum
85{
86#define FIELDNO_NULLABLE_DATUM_DATUM 0
88#define FIELDNO_NULLABLE_DATUM_ISNULL 1
89 bool isnull;
90 /* due to alignment padding this could be used for flags for free */
92
93/*
94 * DatumGetBool
95 * Returns boolean value of a datum.
96 *
97 * Note: any nonzero value will be considered true.
98 */
99static inline bool
101{
102 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 */
111static inline Datum
113{
114 return (Datum) (X ? 1 : 0);
115}
116
117/*
118 * DatumGetChar
119 * Returns character value of a datum.
120 */
121static inline char
123{
124 return (char) X;
125}
126
127/*
128 * CharGetDatum
129 * Returns datum representation for a character.
130 */
131static inline Datum
133{
134 return (Datum) X;
135}
136
137/*
138 * DatumGetUInt8
139 * Returns 8-bit unsigned integer value of a datum.
140 */
141static inline uint8
143{
144 return (uint8) X;
145}
146
147/*
148 * UInt8GetDatum
149 * Returns datum representation for an 8-bit unsigned integer.
150 */
151static inline Datum
153{
154 return (Datum) X;
155}
156
157/*
158 * DatumGetInt16
159 * Returns 16-bit integer value of a datum.
160 */
161static inline int16
163{
164 return (int16) X;
165}
166
167/*
168 * Int16GetDatum
169 * Returns datum representation for a 16-bit integer.
170 */
171static inline Datum
173{
174 return (Datum) X;
175}
176
177/*
178 * DatumGetUInt16
179 * Returns 16-bit unsigned integer value of a datum.
180 */
181static inline uint16
183{
184 return (uint16) X;
185}
186
187/*
188 * UInt16GetDatum
189 * Returns datum representation for a 16-bit unsigned integer.
190 */
191static inline Datum
193{
194 return (Datum) X;
195}
196
197/*
198 * DatumGetInt32
199 * Returns 32-bit integer value of a datum.
200 */
201static inline int32
203{
204 return (int32) X;
205}
206
207/*
208 * Int32GetDatum
209 * Returns datum representation for a 32-bit integer.
210 */
211static inline Datum
213{
214 return (Datum) X;
215}
216
217/*
218 * DatumGetUInt32
219 * Returns 32-bit unsigned integer value of a datum.
220 */
221static inline uint32
223{
224 return (uint32) X;
225}
226
227/*
228 * UInt32GetDatum
229 * Returns datum representation for a 32-bit unsigned integer.
230 */
231static inline Datum
233{
234 return (Datum) X;
235}
236
237/*
238 * DatumGetObjectId
239 * Returns object identifier value of a datum.
240 */
241static inline Oid
243{
244 return (Oid) X;
245}
246
247/*
248 * ObjectIdGetDatum
249 * Returns datum representation for an object identifier.
250 */
251static inline Datum
253{
254 return (Datum) X;
255}
256
257/*
258 * DatumGetObjectId8
259 * Returns 8-byte object identifier value of a datum.
260 */
261static inline Oid8
263{
264 return (Oid8) X;
265}
266
267/*
268 * ObjectId8GetDatum
269 * Returns datum representation for an 8-byte object identifier
270 */
271static inline Datum
273{
274 return (Datum) X;
275}
276
277/*
278 * DatumGetTransactionId
279 * Returns transaction identifier value of a datum.
280 */
281static inline TransactionId
283{
284 return (TransactionId) X;
285}
286
287/*
288 * TransactionIdGetDatum
289 * Returns datum representation for a transaction identifier.
290 */
291static inline Datum
293{
294 return (Datum) X;
295}
296
297/*
298 * MultiXactIdGetDatum
299 * Returns datum representation for a multixact identifier.
300 */
301static inline Datum
303{
304 return (Datum) X;
305}
306
307/*
308 * DatumGetCommandId
309 * Returns command identifier value of a datum.
310 */
311static inline CommandId
313{
314 return (CommandId) X;
315}
316
317/*
318 * CommandIdGetDatum
319 * Returns datum representation for a command identifier.
320 */
321static inline Datum
323{
324 return (Datum) X;
325}
326
327/*
328 * DatumGetPointer
329 * Returns pointer value of a datum.
330 */
331static inline Pointer
333{
334 return (Pointer) (uintptr_t) X;
335}
336
337/*
338 * PointerGetDatum
339 * Returns datum representation for a pointer.
340 *
341 * This used to be defined as "static inline Datum PointerGetDatum(const void
342 * *X) ", but it had the problem that the compiler would see the const
343 * attribute, and could rightly assume that the function won't modify *X.
344 * While PointerGetDatum() itself doesn't modify *X, the resulting Datum could
345 * later be passed to a function that converts it back to a non-const pointer
346 * and modifies it. Most functions don't modify their arguments passed by
347 * reference - that would be very bogus for any operators or functions exposed
348 * in SQL - but some functions like GIN support functions do have output
349 * arguments that are pointer Datums.
350 *
351 * The odd-looking "true ? (X) : NULL" conditional expression has the effect
352 * of producing a compiler error if X is not a pointer.
353 */
354#define PointerGetDatum(X) \
355 ((Datum) (uintptr_t) (true ? (X) : NULL))
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 */
364static inline char *
366{
367 return (char *) DatumGetPointer(X);
368}
369
370/*
371 * CStringGetDatum
372 * Returns datum representation for a C string (null-terminated string).
373 *
374 * We assume that the resulting Datum is not used to modify the string, hence
375 * the argument can be marked as const.
376 *
377 * Note: C string is not a full-fledged Postgres type at present,
378 * but type output functions use this conversion for their outputs.
379 * Note: CString is pass-by-reference; caller must ensure the pointed-to
380 * value has adequate lifetime.
381 */
382static inline Datum
383CStringGetDatum(const char *X)
384{
385 return PointerGetDatum(X);
386}
387
388/*
389 * DatumGetName
390 * Returns name value of a datum.
391 */
392static inline Name
394{
395 return (Name) DatumGetPointer(X);
396}
397
398/*
399 * NameGetDatum
400 * Returns datum representation for a name.
401 *
402 * Note: Name is pass-by-reference; caller must ensure the pointed-to
403 * value has adequate lifetime.
404 */
405static inline Datum
407{
408 return CStringGetDatum(NameStr(*X));
409}
410
411/*
412 * DatumGetInt64
413 * Returns 64-bit integer value of a datum.
414 */
415static inline int64
417{
418 return (int64) X;
419}
420
421/*
422 * Int64GetDatum
423 * Returns datum representation for a 64-bit integer.
424 */
425static inline Datum
427{
428 return (Datum) X;
429}
430
431/*
432 * DatumGetUInt64
433 * Returns 64-bit unsigned integer value of a datum.
434 */
435static inline uint64
437{
438 return (uint64) X;
439}
440
441/*
442 * UInt64GetDatum
443 * Returns datum representation for a 64-bit unsigned integer.
444 */
445static inline Datum
447{
448 return (Datum) X;
449}
450
451/*
452 * Float <-> Datum conversions
453 *
454 * These have to be implemented as inline functions rather than macros, when
455 * passing by value, because many machines pass int and float function
456 * parameters/results differently; so we need to play weird games with unions.
457 */
458
459/*
460 * DatumGetFloat4
461 * Returns 4-byte floating point value of a datum.
462 */
463static inline float4
465{
466 union
467 {
468 int32 value;
469 float4 retval;
470 } myunion;
471
472 myunion.value = DatumGetInt32(X);
473 return myunion.retval;
474}
475
476/*
477 * Float4GetDatum
478 * Returns datum representation for a 4-byte floating point number.
479 */
480static inline Datum
482{
483 union
484 {
486 int32 retval;
487 } myunion;
488
489 myunion.value = X;
490 return Int32GetDatum(myunion.retval);
491}
492
493/*
494 * DatumGetFloat8
495 * Returns 8-byte floating point value of a datum.
496 */
497static inline float8
499{
500 union
501 {
502 int64 value;
503 float8 retval;
504 } myunion;
505
506 myunion.value = DatumGetInt64(X);
507 return myunion.retval;
508}
509
510/*
511 * Float8GetDatum
512 * Returns datum representation for an 8-byte floating point number.
513 */
514static inline Datum
516{
517 union
518 {
520 int64 retval;
521 } myunion;
522
523 myunion.value = X;
524 return Int64GetDatum(myunion.retval);
525}
526
527/*
528 * Int64GetDatumFast
529 * Float8GetDatumFast
530 *
531 * These macros were intended to allow writing code that does not depend on
532 * whether int64 and float8 are pass-by-reference types, while not
533 * sacrificing performance when they are. They are no longer different
534 * from the regular functions, though we keep the assertions to protect
535 * code that might get back-patched into older branches.
536 */
537
538#define Int64GetDatumFast(X) \
539 (StaticAssertVariableIsOfTypeMacro(X, int64), Int64GetDatum(X))
540#define Float8GetDatumFast(X) \
541 (StaticAssertVariableIsOfTypeMacro(X, double), Float8GetDatum(X))
542
543
544/* ----------------------------------------------------------------
545 * Section 2: miscellaneous
546 * ----------------------------------------------------------------
547 */
548
549/*
550 * pg_ternary
551 * Boolean value with an extra "unset" value
552 *
553 * This enum can be used for values that want to distinguish between true,
554 * false, and unset.
555*/
562
563/*
564 * NON_EXEC_STATIC: It's sometimes useful to define a variable or function
565 * that is normally static but extern when using EXEC_BACKEND (see
566 * pg_config_manual.h). There would then typically be some code in
567 * postmaster.c that uses those extern symbols to transfer state between
568 * processes or do whatever other things it needs to do in EXEC_BACKEND mode.
569 */
570#ifdef EXEC_BACKEND
571#define NON_EXEC_STATIC
572#else
573#define NON_EXEC_STATIC static
574#endif
575
576#endif /* POSTGRES_H */
#define NameStr(name)
Definition c.h:835
uint64 Oid8
Definition c.h:756
uint8_t uint8
Definition c.h:622
int64_t int64
Definition c.h:621
double float8
Definition c.h:714
TransactionId MultiXactId
Definition c.h:746
int16_t int16
Definition c.h:619
int32_t int32
Definition c.h:620
uint64_t uint64
Definition c.h:625
uint16_t uint16
Definition c.h:623
uint32_t uint32
Definition c.h:624
float float4
Definition c.h:713
void * Pointer
Definition c.h:615
uint32 CommandId
Definition c.h:750
uint32 TransactionId
Definition c.h:736
static struct @177 value
static uint32 DatumGetUInt32(Datum X)
Definition postgres.h:222
static Datum Int64GetDatum(int64 X)
Definition postgres.h:426
static uint64 DatumGetUInt64(Datum X)
Definition postgres.h:436
static bool DatumGetBool(Datum X)
Definition postgres.h:100
static int64 DatumGetInt64(Datum X)
Definition postgres.h:416
static Name DatumGetName(Datum X)
Definition postgres.h:393
static Datum Float4GetDatum(float4 X)
Definition postgres.h:481
static Datum TransactionIdGetDatum(TransactionId X)
Definition postgres.h:292
static float4 DatumGetFloat4(Datum X)
Definition postgres.h:464
static Datum CommandIdGetDatum(CommandId X)
Definition postgres.h:322
pg_ternary
Definition postgres.h:557
@ PG_TERNARY_FALSE
Definition postgres.h:558
@ PG_TERNARY_TRUE
Definition postgres.h:559
@ PG_TERNARY_UNSET
Definition postgres.h:560
static Oid DatumGetObjectId(Datum X)
Definition postgres.h:242
static Datum UInt64GetDatum(uint64 X)
Definition postgres.h:446
static Datum Int16GetDatum(int16 X)
Definition postgres.h:172
static Datum MultiXactIdGetDatum(MultiXactId X)
Definition postgres.h:302
static CommandId DatumGetCommandId(Datum X)
Definition postgres.h:312
static Datum UInt16GetDatum(uint16 X)
Definition postgres.h:192
static Datum BoolGetDatum(bool X)
Definition postgres.h:112
static float8 DatumGetFloat8(Datum X)
Definition postgres.h:498
static Datum ObjectIdGetDatum(Oid X)
Definition postgres.h:252
static char * DatumGetCString(Datum X)
Definition postgres.h:365
static Datum ObjectId8GetDatum(Oid8 X)
Definition postgres.h:272
static Datum NameGetDatum(const NameData *X)
Definition postgres.h:406
static uint16 DatumGetUInt16(Datum X)
Definition postgres.h:182
uint64_t Datum
Definition postgres.h:70
static Pointer DatumGetPointer(Datum X)
Definition postgres.h:332
static TransactionId DatumGetTransactionId(Datum X)
Definition postgres.h:282
static uint8 DatumGetUInt8(Datum X)
Definition postgres.h:142
static Datum UInt8GetDatum(uint8 X)
Definition postgres.h:152
static Datum Float8GetDatum(float8 X)
Definition postgres.h:515
static char DatumGetChar(Datum X)
Definition postgres.h:122
static Datum CStringGetDatum(const char *X)
Definition postgres.h:383
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
static int16 DatumGetInt16(Datum X)
Definition postgres.h:162
static Datum UInt32GetDatum(uint32 X)
Definition postgres.h:232
static int32 DatumGetInt32(Datum X)
Definition postgres.h:202
#define PointerGetDatum(X)
Definition postgres.h:354
static Datum CharGetDatum(char X)
Definition postgres.h:132
static Oid8 DatumGetObjectId8(Datum X)
Definition postgres.h:262
unsigned int Oid
static int fb(int x)
Datum value
Definition postgres.h:87
Definition c.h:830