PostgreSQL Source Code  git master
datum.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

Size datumGetSize (Datum value, bool typByVal, int typLen)
 
Datum datumCopy (Datum value, bool typByVal, int typLen)
 
Datum datumTransfer (Datum value, bool typByVal, int typLen)
 
bool datumIsEqual (Datum value1, Datum value2, bool typByVal, int typLen)
 
bool datum_image_eq (Datum value1, Datum value2, bool typByVal, int typLen)
 
Size datumEstimateSpace (Datum value, bool isnull, bool typByVal, int typLen)
 
void datumSerialize (Datum value, bool isnull, bool typByVal, int typLen, char **start_address)
 
Datum datumRestore (char **start_address, bool *isnull)
 

Function Documentation

◆ datum_image_eq()

bool datum_image_eq ( Datum  value1,
Datum  value2,
bool  typByVal,
int  typLen 
)

Definition at line 264 of file datum.c.

References DatumGetPointer, pfree(), PG_DETOAST_DATUM_PACKED, toast_raw_datum_size(), VARDATA_ANY, and VARHDRSZ.

Referenced by record_image_eq(), and ri_KeysEqual().

265 {
266  bool result = true;
267 
268  if (typLen == -1)
269  {
270  Size len1,
271  len2;
272 
273  len1 = toast_raw_datum_size(value1);
274  len2 = toast_raw_datum_size(value2);
275  /* No need to de-toast if lengths don't match. */
276  if (len1 != len2)
277  result = false;
278  else
279  {
280  struct varlena *arg1val;
281  struct varlena *arg2val;
282 
283  arg1val = PG_DETOAST_DATUM_PACKED(value1);
284  arg2val = PG_DETOAST_DATUM_PACKED(value2);
285 
286  result = (memcmp(VARDATA_ANY(arg1val),
287  VARDATA_ANY(arg2val),
288  len1 - VARHDRSZ) == 0);
289 
290  /* Only free memory if it's a copy made here. */
291  if ((Pointer) arg1val != (Pointer) value1)
292  pfree(arg1val);
293  if ((Pointer) arg2val != (Pointer) value2)
294  pfree(arg2val);
295  }
296  }
297  else if (typByVal)
298  {
299  result = (value1 == value2);
300  }
301  else
302  {
303  result = (memcmp(DatumGetPointer(value1),
304  DatumGetPointer(value2),
305  typLen) == 0);
306  }
307 
308  return result;
309 }
#define VARDATA_ANY(PTR)
Definition: postgres.h:348
#define VARHDRSZ
Definition: c.h:555
void pfree(void *pointer)
Definition: mcxt.c:1031
char * Pointer
Definition: c.h:335
#define PG_DETOAST_DATUM_PACKED(datum)
Definition: fmgr.h:243
Size toast_raw_datum_size(Datum value)
Definition: detoast.c:768
size_t Size
Definition: c.h:466
#define DatumGetPointer(X)
Definition: postgres.h:549
Definition: c.h:549

◆ datumCopy()

Datum datumCopy ( Datum  value,
bool  typByVal,
int  typLen 
)

Definition at line 130 of file datum.c.

References DatumGetEOHP(), DatumGetPointer, datumGetSize(), EOH_flatten_into(), EOH_get_flat_size(), palloc(), PointerGetDatum, value, VARATT_IS_EXTERNAL_EXPANDED, and VARSIZE_ANY.

Referenced by _copyConst(), accumArrayResult(), advance_transition_function(), advance_windowaggregate(), advance_windowaggregate_base(), array_set_element_expanded(), assign_simple_var(), brin_deform_tuple(), brin_inclusion_add_value(), brin_inclusion_union(), brin_minmax_add_value(), brin_minmax_union(), CatCacheCopyKeys(), collectMatchBitmap(), compute_array_stats(), compute_distinct_stats(), compute_index_stats(), compute_scalar_stats(), copyParamList(), create_list_bounds(), create_range_bounds(), CreateTupleDescCopyConstr(), datumTransfer(), eval_const_expressions_mutator(), eval_windowaggregates(), eval_windowfunction(), evaluate_expr(), exec_eval_using_params(), ExecAggInitGroup(), ExecAggTransReparent(), ExecComputeStoredGenerated(), ExecWindowAgg(), expanded_record_set_field_internal(), expanded_record_set_fields(), finalize_aggregate(), finalize_partialaggregate(), finalize_windowaggregate(), get_actual_variable_endpoint(), get_qual_for_list(), get_variable_range(), getDatumCopy(), initialize_aggregate(), initialize_windowaggregate(), partition_bounds_copy(), pattern_fixed_prefix(), postquel_get_single_result(), RelationBuildTupleDesc(), reorderqueue_push(), spg_range_quad_inner_consistent(), spg_text_inner_consistent(), spgMakeInnerItem(), spgNewHeapItem(), tuplesort_getdatum(), and tuplesort_putdatum().

131 {
132  Datum res;
133 
134  if (typByVal)
135  res = value;
136  else if (typLen == -1)
137  {
138  /* It is a varlena datatype */
139  struct varlena *vl = (struct varlena *) DatumGetPointer(value);
140 
142  {
143  /* Flatten into the caller's memory context */
145  Size resultsize;
146  char *resultptr;
147 
148  resultsize = EOH_get_flat_size(eoh);
149  resultptr = (char *) palloc(resultsize);
150  EOH_flatten_into(eoh, (void *) resultptr, resultsize);
151  res = PointerGetDatum(resultptr);
152  }
153  else
154  {
155  /* Otherwise, just copy the varlena datum verbatim */
156  Size realSize;
157  char *resultptr;
158 
159  realSize = (Size) VARSIZE_ANY(vl);
160  resultptr = (char *) palloc(realSize);
161  memcpy(resultptr, vl, realSize);
162  res = PointerGetDatum(resultptr);
163  }
164  }
165  else
166  {
167  /* Pass by reference, but not varlena, so not toasted */
168  Size realSize;
169  char *resultptr;
170 
171  realSize = datumGetSize(value, typByVal, typLen);
172 
173  resultptr = (char *) palloc(realSize);
174  memcpy(resultptr, DatumGetPointer(value), realSize);
175  res = PointerGetDatum(resultptr);
176  }
177  return res;
178 }
#define VARATT_IS_EXTERNAL_EXPANDED(PTR)
Definition: postgres.h:322
#define PointerGetDatum(X)
Definition: postgres.h:556
static struct @144 value
Size EOH_get_flat_size(ExpandedObjectHeader *eohptr)
Definition: expandeddatum.c:75
ExpandedObjectHeader * DatumGetEOHP(Datum d)
Definition: expandeddatum.c:29
uintptr_t Datum
Definition: postgres.h:367
void EOH_flatten_into(ExpandedObjectHeader *eohptr, void *result, Size allocated_size)
Definition: expandeddatum.c:81
#define VARSIZE_ANY(PTR)
Definition: postgres.h:335
size_t Size
Definition: c.h:466
#define DatumGetPointer(X)
Definition: postgres.h:549
void * palloc(Size size)
Definition: mcxt.c:924
Definition: c.h:549
Size datumGetSize(Datum value, bool typByVal, int typLen)
Definition: datum.c:63

◆ datumEstimateSpace()

Size datumEstimateSpace ( Datum  value,
bool  isnull,
bool  typByVal,
int  typLen 
)

Definition at line 319 of file datum.c.

References DatumGetEOHP(), DatumGetPointer, datumGetSize(), EOH_get_flat_size(), and VARATT_IS_EXTERNAL_EXPANDED.

Referenced by EstimateParamExecSpace(), and EstimateParamListSpace().

320 {
321  Size sz = sizeof(int);
322 
323  if (!isnull)
324  {
325  /* no need to use add_size, can't overflow */
326  if (typByVal)
327  sz += sizeof(Datum);
328  else if (typLen == -1 &&
330  {
331  /* Expanded objects need to be flattened, see comment below */
333  }
334  else
335  sz += datumGetSize(value, typByVal, typLen);
336  }
337 
338  return sz;
339 }
#define VARATT_IS_EXTERNAL_EXPANDED(PTR)
Definition: postgres.h:322
static struct @144 value
Size EOH_get_flat_size(ExpandedObjectHeader *eohptr)
Definition: expandeddatum.c:75
ExpandedObjectHeader * DatumGetEOHP(Datum d)
Definition: expandeddatum.c:29
uintptr_t Datum
Definition: postgres.h:367
size_t Size
Definition: c.h:466
#define DatumGetPointer(X)
Definition: postgres.h:549
Size datumGetSize(Datum value, bool typByVal, int typLen)
Definition: datum.c:63

◆ datumGetSize()

Size datumGetSize ( Datum  value,
bool  typByVal,
int  typLen 
)

Definition at line 63 of file datum.c.

References Assert, DatumGetPointer, elog, ereport, errcode(), errmsg(), ERROR, PointerIsValid, and VARSIZE_ANY.

Referenced by datumCopy(), datumEstimateSpace(), datumIsEqual(), datumSerialize(), outDatum(), and writetup_datum().

64 {
65  Size size;
66 
67  if (typByVal)
68  {
69  /* Pass-by-value types are always fixed-length */
70  Assert(typLen > 0 && typLen <= sizeof(Datum));
71  size = (Size) typLen;
72  }
73  else
74  {
75  if (typLen > 0)
76  {
77  /* Fixed-length pass-by-ref type */
78  size = (Size) typLen;
79  }
80  else if (typLen == -1)
81  {
82  /* It is a varlena datatype */
83  struct varlena *s = (struct varlena *) DatumGetPointer(value);
84 
85  if (!PointerIsValid(s))
86  ereport(ERROR,
87  (errcode(ERRCODE_DATA_EXCEPTION),
88  errmsg("invalid Datum pointer")));
89 
90  size = (Size) VARSIZE_ANY(s);
91  }
92  else if (typLen == -2)
93  {
94  /* It is a cstring datatype */
95  char *s = (char *) DatumGetPointer(value);
96 
97  if (!PointerIsValid(s))
98  ereport(ERROR,
99  (errcode(ERRCODE_DATA_EXCEPTION),
100  errmsg("invalid Datum pointer")));
101 
102  size = (Size) (strlen(s) + 1);
103  }
104  else
105  {
106  elog(ERROR, "invalid typLen: %d", typLen);
107  size = 0; /* keep compiler quiet */
108  }
109  }
110 
111  return size;
112 }
static struct @144 value
int errcode(int sqlerrcode)
Definition: elog.c:570
#define ERROR
Definition: elog.h:43
#define ereport(elevel, rest)
Definition: elog.h:141
uintptr_t Datum
Definition: postgres.h:367
#define VARSIZE_ANY(PTR)
Definition: postgres.h:335
#define Assert(condition)
Definition: c.h:732
size_t Size
Definition: c.h:466
#define DatumGetPointer(X)
Definition: postgres.h:549
int errmsg(const char *fmt,...)
Definition: elog.c:784
#define elog(elevel,...)
Definition: elog.h:226
Definition: c.h:549
#define PointerIsValid(pointer)
Definition: c.h:626

◆ datumIsEqual()

bool datumIsEqual ( Datum  value1,
Datum  value2,
bool  typByVal,
int  typLen 
)

Definition at line 221 of file datum.c.

References DatumGetPointer, datumGetSize(), s1, and s2.

Referenced by _bt_keep_natts_fast(), _equalConst(), coerce_type(), equalTupleDescs(), find_compatible_pertrans(), heap_tuple_attr_equals(), and partition_bounds_equal().

222 {
223  bool res;
224 
225  if (typByVal)
226  {
227  /*
228  * just compare the two datums. NOTE: just comparing "len" bytes will
229  * not do the work, because we do not know how these bytes are aligned
230  * inside the "Datum". We assume instead that any given datatype is
231  * consistent about how it fills extraneous bits in the Datum.
232  */
233  res = (value1 == value2);
234  }
235  else
236  {
237  Size size1,
238  size2;
239  char *s1,
240  *s2;
241 
242  /*
243  * Compare the bytes pointed by the pointers stored in the datums.
244  */
245  size1 = datumGetSize(value1, typByVal, typLen);
246  size2 = datumGetSize(value2, typByVal, typLen);
247  if (size1 != size2)
248  return false;
249  s1 = (char *) DatumGetPointer(value1);
250  s2 = (char *) DatumGetPointer(value2);
251  res = (memcmp(s1, s2, size1) == 0);
252  }
253  return res;
254 }
char * s1
char * s2
size_t Size
Definition: c.h:466
#define DatumGetPointer(X)
Definition: postgres.h:549
Size datumGetSize(Datum value, bool typByVal, int typLen)
Definition: datum.c:63

◆ datumRestore()

Datum datumRestore ( char **  start_address,
bool isnull 
)

Definition at line 428 of file datum.c.

References Assert, header(), palloc(), PointerGetDatum, and val.

Referenced by RestoreParamExecParams(), and RestoreParamList().

429 {
430  int header;
431  void *d;
432 
433  /* Read header word. */
434  memcpy(&header, *start_address, sizeof(int));
435  *start_address += sizeof(int);
436 
437  /* If this datum is NULL, we can stop here. */
438  if (header == -2)
439  {
440  *isnull = true;
441  return (Datum) 0;
442  }
443 
444  /* OK, datum is not null. */
445  *isnull = false;
446 
447  /* If this datum is pass-by-value, sizeof(Datum) bytes follow. */
448  if (header == -1)
449  {
450  Datum val;
451 
452  memcpy(&val, *start_address, sizeof(Datum));
453  *start_address += sizeof(Datum);
454  return val;
455  }
456 
457  /* Pass-by-reference case; copy indicated number of bytes. */
458  Assert(header > 0);
459  d = palloc(header);
460  memcpy(d, *start_address, header);
461  *start_address += header;
462  return PointerGetDatum(d);
463 }
#define PointerGetDatum(X)
Definition: postgres.h:556
uintptr_t Datum
Definition: postgres.h:367
#define Assert(condition)
Definition: c.h:732
static void header(const char *fmt,...) pg_attribute_printf(1
Definition: pg_regress.c:210
void * palloc(Size size)
Definition: mcxt.c:924
long val
Definition: informix.c:684

◆ datumSerialize()

void datumSerialize ( Datum  value,
bool  isnull,
bool  typByVal,
int  typLen,
char **  start_address 
)

Definition at line 366 of file datum.c.

References DatumGetEOHP(), DatumGetPointer, datumGetSize(), EOH_flatten_into(), EOH_get_flat_size(), header(), palloc(), pfree(), and VARATT_IS_EXTERNAL_EXPANDED.

Referenced by SerializeParamExecParams(), and SerializeParamList().

368 {
369  ExpandedObjectHeader *eoh = NULL;
370  int header;
371 
372  /* Write header word. */
373  if (isnull)
374  header = -2;
375  else if (typByVal)
376  header = -1;
377  else if (typLen == -1 &&
379  {
380  eoh = DatumGetEOHP(value);
381  header = EOH_get_flat_size(eoh);
382  }
383  else
384  header = datumGetSize(value, typByVal, typLen);
385  memcpy(*start_address, &header, sizeof(int));
386  *start_address += sizeof(int);
387 
388  /* If not null, write payload bytes. */
389  if (!isnull)
390  {
391  if (typByVal)
392  {
393  memcpy(*start_address, &value, sizeof(Datum));
394  *start_address += sizeof(Datum);
395  }
396  else if (eoh)
397  {
398  char *tmp;
399 
400  /*
401  * EOH_flatten_into expects the target address to be maxaligned,
402  * so we can't store directly to *start_address.
403  */
404  tmp = (char *) palloc(header);
405  EOH_flatten_into(eoh, (void *) tmp, header);
406  memcpy(*start_address, tmp, header);
407  *start_address += header;
408 
409  /* be tidy. */
410  pfree(tmp);
411  }
412  else
413  {
414  memcpy(*start_address, DatumGetPointer(value), header);
415  *start_address += header;
416  }
417  }
418 }
#define VARATT_IS_EXTERNAL_EXPANDED(PTR)
Definition: postgres.h:322
static struct @144 value
void pfree(void *pointer)
Definition: mcxt.c:1031
Size EOH_get_flat_size(ExpandedObjectHeader *eohptr)
Definition: expandeddatum.c:75
ExpandedObjectHeader * DatumGetEOHP(Datum d)
Definition: expandeddatum.c:29
uintptr_t Datum
Definition: postgres.h:367
void EOH_flatten_into(ExpandedObjectHeader *eohptr, void *result, Size allocated_size)
Definition: expandeddatum.c:81
static void header(const char *fmt,...) pg_attribute_printf(1
Definition: pg_regress.c:210
#define DatumGetPointer(X)
Definition: postgres.h:549
void * palloc(Size size)
Definition: mcxt.c:924
Size datumGetSize(Datum value, bool typByVal, int typLen)
Definition: datum.c:63

◆ datumTransfer()

Datum datumTransfer ( Datum  value,
bool  typByVal,
int  typLen 
)

Definition at line 192 of file datum.c.

References CurrentMemoryContext, datumCopy(), DatumGetPointer, TransferExpandedObject(), value, and VARATT_IS_EXTERNAL_EXPANDED_RW.

Referenced by exec_assign_value(), exec_stmt_block(), and SPI_datumTransfer().

193 {
194  if (!typByVal && typLen == -1 &&
197  else
198  value = datumCopy(value, typByVal, typLen);
199  return value;
200 }
static struct @144 value
Datum TransferExpandedObject(Datum d, MemoryContext new_parent)
MemoryContext CurrentMemoryContext
Definition: mcxt.c:38
Datum datumCopy(Datum value, bool typByVal, int typLen)
Definition: datum.c:130
#define DatumGetPointer(X)
Definition: postgres.h:549
#define VARATT_IS_EXTERNAL_EXPANDED_RW(PTR)
Definition: postgres.h:320