PostgreSQL Source Code: src/include/utils/array.h Source File (original) (raw)
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#ifndef ARRAY_H
62#define ARRAY_H
63
66
67
70
71
72
73
74
75#define MAXDIM 6
76
77
78
79
80
81
82#define MaxArraySize ((Size) (MaxAllocSize / sizeof(Datum)))
83
84
85
86
87
88
89
90
91
93{
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113#define EA_MAGIC 689375833
114
116{
117
119
120
122
123
127
128
133
134
135
136
137
138
139
140
141
142
143
144
145
148 int dvalueslen;
150
151
152
153
154
155
157
158
159
160
161
162
163
164
169
170
171
172
173
174
175
176
178{
182
183
184
185
186
188{
200
201
202
203
204
206{
221
222
223
224
225
227{
228
232
233
234
235
237{
247
248
249
250
252{
256
257
259
260
261#define DatumGetArrayTypeP(X) ((ArrayType *) PG_DETOAST_DATUM(X))
262#define DatumGetArrayTypePCopy(X) ((ArrayType *) PG_DETOAST_DATUM_COPY(X))
263#define PG_GETARG_ARRAYTYPE_P(n) DatumGetArrayTypeP(PG_GETARG_DATUM(n))
264#define PG_GETARG_ARRAYTYPE_P_COPY(n) DatumGetArrayTypePCopy(PG_GETARG_DATUM(n))
265#define PG_RETURN_ARRAYTYPE_P(x) PG_RETURN_POINTER(x)
266
267
268#define PG_GETARG_EXPANDED_ARRAY(n) DatumGetExpandedArray(PG_GETARG_DATUM(n))
269#define PG_GETARG_EXPANDED_ARRAYX(n, metacache) \
270 DatumGetExpandedArrayX(PG_GETARG_DATUM(n), metacache)
271#define PG_RETURN_EXPANDED_ARRAY(x) PG_RETURN_DATUM(EOHPGetRWDatum(&(x)->hdr))
272
273
274#define PG_GETARG_ANY_ARRAY_P(n) DatumGetAnyArrayP(PG_GETARG_DATUM(n))
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289#define ARR_SIZE(a) VARSIZE(a)
290#define ARR_NDIM(a) ((a)->ndim)
291#define ARR_HASNULL(a) ((a)->dataoffset != 0)
292#define ARR_ELEMTYPE(a) ((a)->elemtype)
293
294#define ARR_DIMS(a) \
295 ((int *) (((char *) (a)) + sizeof(ArrayType)))
296#define ARR_LBOUND(a) \
297 ((int *) (((char *) (a)) + sizeof(ArrayType) + \
298 sizeof(int) * ARR_NDIM(a)))
299
300#define ARR_NULLBITMAP(a) \
301 (ARR_HASNULL(a) ? \
302 (bits8 *) (((char *) (a)) + sizeof(ArrayType) + \
303 2 * sizeof(int) * ARR_NDIM(a)) \
304 : (bits8 *) NULL)
305
306
307
308
309
310#define ARR_OVERHEAD_NONULLS(ndims) \
311 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims))
312#define ARR_OVERHEAD_WITHNULLS(ndims, nitems) \
313 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims) + \
314 ((nitems) + 7) / 8)
315
316#define ARR_DATA_OFFSET(a) \
317 (ARR_HASNULL(a) ? (a)->dataoffset : ARR_OVERHEAD_NONULLS(ARR_NDIM(a)))
318
319
320
321
322#define ARR_DATA_PTR(a) \
323 (((char *) (a)) + ARR_DATA_OFFSET(a))
324
325
326
327
328#define AARR_NDIM(a) \
329 (VARATT_IS_EXPANDED_HEADER(a) ? \
330 (a)->xpn.ndims : ARR_NDIM((ArrayType *) (a)))
331#define AARR_HASNULL(a) \
332 (VARATT_IS_EXPANDED_HEADER(a) ? \
333 ((a)->xpn.dvalues != NULL ? (a)->xpn.dnulls != NULL : ARR_HASNULL((a)->xpn.fvalue)) : \
334 ARR_HASNULL((ArrayType *) (a)))
335#define AARR_ELEMTYPE(a) \
336 (VARATT_IS_EXPANDED_HEADER(a) ? \
337 (a)->xpn.element_type : ARR_ELEMTYPE((ArrayType *) (a)))
338#define AARR_DIMS(a) \
339 (VARATT_IS_EXPANDED_HEADER(a) ? \
340 (a)->xpn.dims : ARR_DIMS((ArrayType *) (a)))
341#define AARR_LBOUND(a) \
342 (VARATT_IS_EXPANDED_HEADER(a) ? \
343 (a)->xpn.lbound : ARR_LBOUND((ArrayType *) (a)))
344
345
346
347
348
350
351
352
353
356 bool *nulls,
361 bool freedata);
362
364 int arraytyplen, int elmlen, bool elmbyval, char elmalign,
365 bool *isNull);
367 Datum dataValue, bool isNull,
368 int arraytyplen, int elmlen, bool elmbyval, char elmalign);
370 int *upperIndx, int *lowerIndx,
371 bool *upperProvided, bool *lowerProvided,
372 int arraytyplen, int elmlen, bool elmbyval, char elmalign);
374 int *upperIndx, int *lowerIndx,
375 bool *upperProvided, bool *lowerProvided,
376 Datum srcArrayDatum, bool isNull,
377 int arraytyplen, int elmlen, bool elmbyval, char elmalign);
378
380 int arraytyplen, int elmlen, bool elmbyval, char elmalign,
381 bool *isNull);
383 Datum dataValue, bool isNull,
384 int arraytyplen, int elmlen, bool elmbyval, char elmalign);
385
389
391 const bits8 *srcbitmap, int srcoffset,
393
395 Oid elmtype,
396 int elmlen, bool elmbyval, char elmalign);
399 bool *nulls,
400 int ndims,
401 int *dims,
402 int *lbs,
403 Oid elmtype, int elmlen, bool elmbyval, char elmalign);
409 Oid elmtype,
410 int elmlen, bool elmbyval, char elmalign,
411 Datum **elemsp, bool **nullsp, int *nelemsp);
413 Oid elmtype,
414 Datum **elemsp, bool **nullsp, int *nelemsp);
416
421 bool subcontext, int initsize);
423 Datum dvalue, bool disnull,
424 Oid element_type,
429 int *dims, int *lbs, MemoryContext rcontext, bool release);
430
434 Datum dvalue, bool disnull,
435 Oid array_type,
439
443 Datum dvalue, bool disnull,
444 Oid input_type,
448
452
453
454
455
456
457extern int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx);
460 struct Node *escontext);
461extern void ArrayCheckBounds(int ndim, const int *dims, const int *lb);
463 struct Node *escontext);
464extern void mda_get_range(int n, int *span, const int *st, const int *endp);
466extern void mda_get_offset_values(int n, int *dist, const int *prod, const int *span);
467extern int mda_next_tuple(int n, int *curr, const int *span);
469
470
471
472
480
481#endif
struct ArrayMapState ArrayMapState
void mda_get_offset_values(int n, int *dist, const int *prod, const int *span)
int ArrayGetNItemsSafe(int ndim, const int *dims, struct Node *escontext)
ArrayType * array_set(ArrayType *array, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
bool array_contains_nulls(ArrayType *array)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
struct ExpandedArrayHeader ExpandedArrayHeader
ExpandedArrayHeader * construct_empty_expanded_array(Oid element_type, MemoryContext parentcontext, ArrayMetaState *metacache)
bool array_iterate(ArrayIterator iterator, Datum *value, bool *isnull)
bool ArrayCheckBoundsSafe(int ndim, const int *dims, const int *lb, struct Node *escontext)
void array_free_iterator(ArrayIterator iterator)
int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx)
ArrayBuildStateAny * initArrayResultAny(Oid input_type, MemoryContext rcontext, bool subcontext)
ArrayBuildStateAny * accumArrayResultAny(ArrayBuildStateAny *astate, Datum dvalue, bool disnull, Oid input_type, MemoryContext rcontext)
ArrayType * construct_empty_array(Oid elmtype)
void CopyArrayEls(ArrayType *array, Datum *values, bool *nulls, int nitems, int typlen, bool typbyval, char typalign, bool freedata)
struct ArrayBuildStateAny ArrayBuildStateAny
ExpandedArrayHeader * DatumGetExpandedArrayX(Datum d, ArrayMetaState *metacache)
Datum expand_array(Datum arraydatum, MemoryContext parentcontext, ArrayMetaState *metacache)
Datum makeArrayResultArr(ArrayBuildStateArr *astate, MemoryContext rcontext, bool release)
void mda_get_range(int n, int *span, const int *st, const int *endp)
int ArrayGetNItems(int ndim, const int *dims)
Datum makeArrayResultAny(ArrayBuildStateAny *astate, MemoryContext rcontext, bool release)
ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
Datum array_set_element(Datum arraydatum, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
Datum makeMdArrayResult(ArrayBuildState *astate, int ndims, int *dims, int *lbs, MemoryContext rcontext, bool release)
void mda_get_prod(int n, const int *range, int *prod)
PGDLLIMPORT bool Array_nulls
ArrayBuildStateArr * initArrayResultArr(Oid array_type, Oid element_type, MemoryContext rcontext, bool subcontext)
void ArrayCheckBounds(int ndim, const int *dims, const int *lb)
ArrayBuildStateArr * accumArrayResultArr(ArrayBuildStateArr *astate, Datum dvalue, bool disnull, Oid array_type, MemoryContext rcontext)
struct ArrayMetaState ArrayMetaState
ArrayIterator array_create_iterator(ArrayType *arr, int slice_ndim, ArrayMetaState *mstate)
int mda_next_tuple(int n, int *curr, const int *span)
struct ArrayIteratorData * ArrayIterator
Datum array_ref(ArrayType *array, int nSubscripts, int *indx, int arraytyplen, int elmlen, bool elmbyval, char elmalign, bool *isNull)
Datum array_map(Datum arrayd, struct ExprState *exprstate, struct ExprContext *econtext, Oid retType, ArrayMapState *amstate)
ArrayBuildState * initArrayResultWithSize(Oid element_type, MemoryContext rcontext, bool subcontext, int initsize)
struct ArrayBuildStateArr ArrayBuildStateArr
void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
void deconstruct_array_builtin(ArrayType *array, Oid elmtype, Datum **elemsp, bool **nullsp, int *nelemsp)
void deconstruct_expanded_array(ExpandedArrayHeader *eah)
ArrayType * construct_md_array(Datum *elems, bool *nulls, int ndims, int *dims, int *lbs, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
ExpandedArrayHeader * DatumGetExpandedArray(Datum d)
ArrayType * construct_array_builtin(Datum *elems, int nelems, Oid elmtype)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
struct ArrayType ArrayType
AnyArrayType * DatumGetAnyArrayP(Datum d)
void array_bitmap_copy(bits8 *destbitmap, int destoffset, const bits8 *srcbitmap, int srcoffset, int nitems)
struct ArrayBuildState ArrayBuildState
Datum array_get_element(Datum arraydatum, int nSubscripts, int *indx, int arraytyplen, int elmlen, bool elmbyval, char elmalign, bool *isNull)
Datum array_get_slice(Datum arraydatum, int nSubscripts, int *upperIndx, int *lowerIndx, bool *upperProvided, bool *lowerProvided, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
Datum array_set_slice(Datum arraydatum, int nSubscripts, int *upperIndx, int *lowerIndx, bool *upperProvided, bool *lowerProvided, Datum srcArrayDatum, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
union AnyArrayType AnyArrayType
int32 * ArrayGetIntegerTypmods(ArrayType *arr, int *n)
static Datum values[MAXATTR]
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
ArrayBuildStateArr * arraystate
ArrayBuildState * scalarstate