1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*--------------------------------------------------------------------
* Symbols referenced in this file:
* - DatumGetEOHP
* - EOH_get_flat_size
* - EOH_flatten_into
*--------------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
*
* expandeddatum.c
* Support functions for "expanded" value representations.
*
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
* src/backend/utils/adt/expandeddatum.c
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "utils/expandeddatum.h"
#include "utils/memutils.h"
/*
* DatumGetEOHP
*
* Given a Datum that is an expanded-object reference, extract the pointer.
*
* This is a bit tedious since the pointer may not be properly aligned;
* compare VARATT_EXTERNAL_GET_POINTER().
*/
ExpandedObjectHeader *
DatumGetEOHP(Datum d)
{
varattrib_1b_e *datum = (varattrib_1b_e *) DatumGetPointer(d);
varatt_expanded ptr;
Assert(VARATT_IS_EXTERNAL_EXPANDED(datum));
memcpy(&ptr, VARDATA_EXTERNAL(datum), sizeof(ptr));
Assert(VARATT_IS_EXPANDED_HEADER(ptr.eohptr));
return ptr.eohptr;
}
/*
* EOH_init_header
*
* Initialize the common header of an expanded object.
*
* The main thing this encapsulates is initializing the TOAST pointers.
*/
/*
* EOH_get_flat_size
* EOH_flatten_into
*
* Convenience functions for invoking the "methods" of an expanded object.
*/
Size
EOH_get_flat_size(ExpandedObjectHeader *eohptr)
{
return eohptr->eoh_methods->get_flat_size(eohptr);
}
void
EOH_flatten_into(ExpandedObjectHeader *eohptr,
void *result, Size allocated_size)
{
eohptr->eoh_methods->flatten_into(eohptr, result, allocated_size);
}
/*
* If the Datum represents a R/W expanded object, change it to R/O.
* Otherwise return the original Datum.
*
* Caller must ensure that the datum is a non-null varlena value. Typically
* this is invoked via MakeExpandedObjectReadOnly(), which checks that.
*/
/*
* Transfer ownership of an expanded object to a new parent memory context.
* The object must be referenced by a R/W pointer, and what we return is
* always its "standard" R/W pointer, which is certain to have the same
* lifespan as the object itself. (The passed-in pointer might not, and
* in any case wouldn't provide a unique identifier if it's not that one.)
*/
/*
* Delete an expanded object (must be referenced by a R/W pointer).
*/