PostgreSQL Source Code git master
Loading...
Searching...
No Matches
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)
 
uint32 datum_image_hash (Datum value, 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 
)
extern

Definition at line 271 of file datum.c.

272{
273 Size len1,
274 len2;
275 bool result = true;
276
277 if (typByVal)
278 {
279 switch (typLen)
280 {
281 case sizeof(char):
283 break;
284 case sizeof(int16):
286 break;
287 case sizeof(int32):
289 break;
290 default:
291 result = (value1 == value2);
292 break;
293 }
294 }
295 else if (typLen > 0)
296 {
299 typLen) == 0);
300 }
301 else if (typLen == -1)
302 {
305 /* No need to de-toast if lengths don't match. */
306 if (len1 != len2)
307 result = false;
308 else
309 {
312
315
318 len1 - VARHDRSZ) == 0);
319
320 /* Only free memory if it's a copy made here. */
322 pfree(arg1val);
324 pfree(arg2val);
325 }
326 }
327 else if (typLen == -2)
328 {
329 char *s1,
330 *s2;
331
332 /* Compare cstring datums */
335 len1 = strlen(s1) + 1;
336 len2 = strlen(s2) + 1;
337 if (len1 != len2)
338 return false;
339 result = (memcmp(s1, s2, len1) == 0);
340 }
341 else
342 elog(ERROR, "unexpected typLen: %d", typLen);
343
344 return result;
345}
#define VARHDRSZ
Definition c.h:781
int16_t int16
Definition c.h:619
int32_t int32
Definition c.h:620
size_t Size
Definition c.h:689
uint32 result
Size toast_raw_datum_size(Datum value)
Definition detoast.c:545
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
#define PG_DETOAST_DATUM_PACKED(datum)
Definition fmgr.h:248
void pfree(void *pointer)
Definition mcxt.c:1616
static char * DatumGetCString(Datum X)
Definition postgres.h:355
static Pointer DatumGetPointer(Datum X)
Definition postgres.h:332
static char DatumGetChar(Datum X)
Definition postgres.h:122
static int16 DatumGetInt16(Datum X)
Definition postgres.h:162
static int32 DatumGetInt32(Datum X)
Definition postgres.h:202
static int fb(int x)
char * s1
char * s2
Definition c.h:776
static char * VARDATA_ANY(const void *PTR)
Definition varatt.h:486

References DatumGetChar(), DatumGetCString(), DatumGetInt16(), DatumGetInt32(), DatumGetPointer(), elog, ERROR, fb(), pfree(), PG_DETOAST_DATUM_PACKED, result, s1, s2, toast_raw_datum_size(), VARDATA_ANY(), and VARHDRSZ.

Referenced by _bt_keep_natts_fast(), mcvs_equal(), MemoizeHash_equal(), record_image_eq(), and ri_KeysEqual().

◆ datum_image_hash()

uint32 datum_image_hash ( Datum  value,
bool  typByVal,
int  typLen 
)
extern

Definition at line 358 of file datum.c.

359{
360 Size len;
362
363 if (typByVal)
364 {
365 switch (typLen)
366 {
367 case sizeof(char):
369 break;
370 case sizeof(int16):
372 break;
373 case sizeof(int32):
375 break;
376 /* Nothing needs done for 64-bit types */
377 }
378
379 result = hash_bytes((unsigned char *) &value, sizeof(Datum));
380 }
381 else if (typLen > 0)
382 result = hash_bytes((unsigned char *) DatumGetPointer(value), typLen);
383 else if (typLen == -1)
384 {
385 varlena *val;
386
388
390
391 result = hash_bytes((unsigned char *) VARDATA_ANY(val), len - VARHDRSZ);
392
393 /* Only free memory if it's a copy made here. */
394 if (val != DatumGetPointer(value))
395 pfree(val);
396 }
397 else if (typLen == -2)
398 {
399 char *s;
400
402 len = strlen(s) + 1;
403
404 result = hash_bytes((unsigned char *) s, len);
405 }
406 else
407 {
408 elog(ERROR, "unexpected typLen: %d", typLen);
409 result = 0; /* keep compiler quiet */
410 }
411
412 return result;
413}
uint32_t uint32
Definition c.h:624
uint32 hash_bytes(const unsigned char *k, int keylen)
Definition hashfn.c:146
long val
Definition informix.c:689
static struct @177 value
const void size_t len
static Datum Int16GetDatum(int16 X)
Definition postgres.h:172
uint64_t Datum
Definition postgres.h:70
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
static Datum CharGetDatum(char X)
Definition postgres.h:132

References CharGetDatum(), DatumGetChar(), DatumGetCString(), DatumGetInt16(), DatumGetInt32(), DatumGetPointer(), elog, ERROR, fb(), hash_bytes(), Int16GetDatum(), Int32GetDatum(), len, pfree(), PG_DETOAST_DATUM_PACKED, result, toast_raw_datum_size(), val, value, VARDATA_ANY(), and VARHDRSZ.

Referenced by MemoizeHash_hash().

◆ datumCopy()

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

Definition at line 132 of file datum.c.

133{
134 Datum res;
135
136 if (typByVal)
137 res = value;
138 else if (typLen == -1)
139 {
140 /* It is a varlena datatype */
142
144 {
145 /* Flatten into the caller's memory context */
148 char *resultptr;
149
151 resultptr = (char *) palloc(resultsize);
154 }
155 else
156 {
157 /* Otherwise, just copy the varlena datum verbatim */
159 char *resultptr;
160
162 resultptr = (char *) palloc(realSize);
165 }
166 }
167 else
168 {
169 /* Pass by reference, but not varlena, so not toasted */
171 char *resultptr;
172
173 realSize = datumGetSize(value, typByVal, typLen);
174
175 resultptr = (char *) palloc(realSize);
178 }
179 return res;
180}
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
Size datumGetSize(Datum value, bool typByVal, int typLen)
Definition datum.c:65
ExpandedObjectHeader * DatumGetEOHP(Datum d)
void EOH_flatten_into(ExpandedObjectHeader *eohptr, void *result, Size allocated_size)
Size EOH_get_flat_size(ExpandedObjectHeader *eohptr)
void * palloc(Size size)
Definition mcxt.c:1387
static Datum PointerGetDatum(const void *X)
Definition postgres.h:342
static Size VARSIZE_ANY(const void *PTR)
Definition varatt.h:460
static bool VARATT_IS_EXTERNAL_EXPANDED(const void *PTR)
Definition varatt.h:389

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

Referenced by _bt_array_decrement(), _bt_array_increment(), _bt_skiparray_set_element(), _copyConst(), accumArrayResult(), advance_transition_function(), advance_windowaggregate(), advance_windowaggregate_base(), array_agg_combine(), array_set_element_expanded(), assign_simple_var(), brin_deform_tuple(), brin_inclusion_add_value(), brin_inclusion_union(), brin_minmax_add_value(), brin_minmax_union(), calculate_frame_offsets(), CatCacheCopyKeys(), collectMatchBitmap(), compute_array_stats(), compute_distinct_stats(), compute_expr_stats(), compute_index_stats(), compute_scalar_stats(), CopyIndexAttOptions(), copyParamList(), copyScalarSubstructure(), create_list_bounds(), create_range_bounds(), CreateTupleDescCopyConstr(), datumTransfer(), eval_const_expressions_mutator(), eval_windowaggregates(), eval_windowfunction(), evaluate_expr(), exec_eval_using_params(), ExecAggCopyTransValue(), ExecAggInitGroup(), ExecComputeStoredGenerated(), ExecEvalPreOrderedDistinctSingle(), expanded_record_set_field_internal(), expanded_record_set_fields(), get_actual_variable_endpoint(), get_attoptions(), get_qual_for_list(), get_stats_slot_range(), get_variable_range(), getDatumCopy(), getmissingattr(), GinBufferStoreTuple(), initialize_aggregate(), initialize_windowaggregate(), partition_bounds_copy(), pattern_fixed_prefix(), postquel_get_single_result(), process_ordered_aggregate_single(), range_add_value(), RelationBuildTupleDesc(), reorderqueue_push(), spg_range_quad_inner_consistent(), spg_text_inner_consistent(), spgist_name_inner_consistent(), spgMakeInnerItem(), spgNewHeapItem(), tuplesort_getdatum(), tuplesort_putdatum(), and union_tuples().

◆ datumEstimateSpace()

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

Definition at line 450 of file datum.c.

451{
452 Size sz = sizeof(int);
453
454 if (!isnull)
455 {
456 /* no need to use add_size, can't overflow */
457 if (typByVal)
458 sz += sizeof(Datum);
459 else if (typLen == -1 &&
461 {
462 /* Expanded objects need to be flattened, see comment below */
464 }
465 else
466 sz += datumGetSize(value, typByVal, typLen);
467 }
468
469 return sz;
470}

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

Referenced by btestimateparallelscan(), EstimateParamExecSpace(), and EstimateParamListSpace().

◆ datumGetSize()

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

Definition at line 65 of file datum.c.

66{
67 Size size;
68
69 if (typByVal)
70 {
71 /* Pass-by-value types are always fixed-length */
72 Assert(typLen > 0 && typLen <= sizeof(Datum));
73 size = (Size) typLen;
74 }
75 else
76 {
77 if (typLen > 0)
78 {
79 /* Fixed-length pass-by-ref type */
80 size = (Size) typLen;
81 }
82 else if (typLen == -1)
83 {
84 /* It is a varlena datatype */
86
87 if (!s)
90 errmsg("invalid Datum pointer")));
91
92 size = (Size) VARSIZE_ANY(s);
93 }
94 else if (typLen == -2)
95 {
96 /* It is a cstring datatype */
97 char *s = (char *) DatumGetPointer(value);
98
99 if (!s)
102 errmsg("invalid Datum pointer")));
103
104 size = (Size) (strlen(s) + 1);
105 }
106 else
107 {
108 elog(ERROR, "invalid typLen: %d", typLen);
109 size = 0; /* keep compiler quiet */
110 }
111 }
112
113 return size;
114}
#define Assert(condition)
Definition c.h:943
int errcode(int sqlerrcode)
Definition elog.c:874
#define ereport(elevel,...)
Definition elog.h:152
static char * errmsg

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

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

◆ datumIsEqual()

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

Definition at line 223 of file datum.c.

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

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

Referenced by _equalConst(), coerce_type(), equalTupleDescs(), find_compatible_trans(), heap_attr_equals(), and partition_bounds_equal().

◆ datumRestore()

Datum datumRestore ( char **  start_address,
bool isnull 
)
extern

Definition at line 559 of file datum.c.

560{
561 int header;
562 void *d;
563
564 /* Read header word. */
565 memcpy(&header, *start_address, sizeof(int));
566 *start_address += sizeof(int);
567
568 /* If this datum is NULL, we can stop here. */
569 if (header == -2)
570 {
571 *isnull = true;
572 return (Datum) 0;
573 }
574
575 /* OK, datum is not null. */
576 *isnull = false;
577
578 /* If this datum is pass-by-value, sizeof(Datum) bytes follow. */
579 if (header == -1)
580 {
581 Datum val;
582
583 memcpy(&val, *start_address, sizeof(Datum));
584 *start_address += sizeof(Datum);
585 return val;
586 }
587
588 /* Pass-by-reference case; copy indicated number of bytes. */
589 Assert(header > 0);
590 d = palloc(header);
591 memcpy(d, *start_address, header);
592 *start_address += header;
593 return PointerGetDatum(d);
594}

References Assert, fb(), memcpy(), palloc(), PointerGetDatum(), and val.

Referenced by _bt_parallel_restore_arrays(), RestoreParamExecParams(), and RestoreParamList().

◆ datumSerialize()

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

Definition at line 497 of file datum.c.

499{
501 int header;
502
503 /* Write header word. */
504 if (isnull)
505 header = -2;
506 else if (typByVal)
507 header = -1;
508 else if (typLen == -1 &&
510 {
512 header = EOH_get_flat_size(eoh);
513 }
514 else
515 header = datumGetSize(value, typByVal, typLen);
516 memcpy(*start_address, &header, sizeof(int));
517 *start_address += sizeof(int);
518
519 /* If not null, write payload bytes. */
520 if (!isnull)
521 {
522 if (typByVal)
523 {
524 memcpy(*start_address, &value, sizeof(Datum));
525 *start_address += sizeof(Datum);
526 }
527 else if (eoh)
528 {
529 char *tmp;
530
531 /*
532 * EOH_flatten_into expects the target address to be maxaligned,
533 * so we can't store directly to *start_address.
534 */
535 tmp = (char *) palloc(header);
536 EOH_flatten_into(eoh, tmp, header);
537 memcpy(*start_address, tmp, header);
538 *start_address += header;
539
540 /* be tidy. */
541 pfree(tmp);
542 }
543 else
544 {
546 *start_address += header;
547 }
548 }
549}

References DatumGetEOHP(), DatumGetPointer(), datumGetSize(), EOH_flatten_into(), EOH_get_flat_size(), fb(), memcpy(), palloc(), pfree(), value, and VARATT_IS_EXTERNAL_EXPANDED().

Referenced by _bt_parallel_serialize_arrays(), SerializeParamExecParams(), and SerializeParamList().

◆ datumTransfer()

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

Definition at line 194 of file datum.c.

195{
196 if (!typByVal && typLen == -1 &&
199 else
200 value = datumCopy(value, typByVal, typLen);
201 return value;
202}
Datum datumCopy(Datum value, bool typByVal, int typLen)
Definition datum.c:132
Datum TransferExpandedObject(Datum d, MemoryContext new_parent)
MemoryContext CurrentMemoryContext
Definition mcxt.c:160
static bool VARATT_IS_EXTERNAL_EXPANDED_RW(const void *PTR)
Definition varatt.h:382

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

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