106 #define EA_MAGIC 689375833
254 #define DatumGetArrayTypeP(X) ((ArrayType *) PG_DETOAST_DATUM(X))
255 #define DatumGetArrayTypePCopy(X) ((ArrayType *) PG_DETOAST_DATUM_COPY(X))
256 #define PG_GETARG_ARRAYTYPE_P(n) DatumGetArrayTypeP(PG_GETARG_DATUM(n))
257 #define PG_GETARG_ARRAYTYPE_P_COPY(n) DatumGetArrayTypePCopy(PG_GETARG_DATUM(n))
258 #define PG_RETURN_ARRAYTYPE_P(x) PG_RETURN_POINTER(x)
261 #define PG_GETARG_EXPANDED_ARRAY(n) DatumGetExpandedArray(PG_GETARG_DATUM(n))
262 #define PG_GETARG_EXPANDED_ARRAYX(n, metacache) \
263 DatumGetExpandedArrayX(PG_GETARG_DATUM(n), metacache)
264 #define PG_RETURN_EXPANDED_ARRAY(x) PG_RETURN_DATUM(EOHPGetRWDatum(&(x)->hdr))
267 #define PG_GETARG_ANY_ARRAY_P(n) DatumGetAnyArrayP(PG_GETARG_DATUM(n))
282 #define ARR_SIZE(a) VARSIZE(a)
283 #define ARR_NDIM(a) ((a)->ndim)
284 #define ARR_HASNULL(a) ((a)->dataoffset != 0)
285 #define ARR_ELEMTYPE(a) ((a)->elemtype)
287 #define ARR_DIMS(a) \
288 ((int *) (((char *) (a)) + sizeof(ArrayType)))
289 #define ARR_LBOUND(a) \
290 ((int *) (((char *) (a)) + sizeof(ArrayType) + \
291 sizeof(int) * ARR_NDIM(a)))
293 #define ARR_NULLBITMAP(a) \
295 (bits8 *) (((char *) (a)) + sizeof(ArrayType) + \
296 2 * sizeof(int) * ARR_NDIM(a)) \
303 #define ARR_OVERHEAD_NONULLS(ndims) \
304 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims))
305 #define ARR_OVERHEAD_WITHNULLS(ndims, nitems) \
306 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims) + \
309 #define ARR_DATA_OFFSET(a) \
310 (ARR_HASNULL(a) ? (a)->dataoffset : ARR_OVERHEAD_NONULLS(ARR_NDIM(a)))
315 #define ARR_DATA_PTR(a) \
316 (((char *) (a)) + ARR_DATA_OFFSET(a))
321 #define AARR_NDIM(a) \
322 (VARATT_IS_EXPANDED_HEADER(a) ? \
323 (a)->xpn.ndims : ARR_NDIM((ArrayType *) (a)))
324 #define AARR_HASNULL(a) \
325 (VARATT_IS_EXPANDED_HEADER(a) ? \
326 ((a)->xpn.dvalues != NULL ? (a)->xpn.dnulls != NULL : ARR_HASNULL((a)->xpn.fvalue)) : \
327 ARR_HASNULL((ArrayType *) (a)))
328 #define AARR_ELEMTYPE(a) \
329 (VARATT_IS_EXPANDED_HEADER(a) ? \
330 (a)->xpn.element_type : ARR_ELEMTYPE((ArrayType *) (a)))
331 #define AARR_DIMS(a) \
332 (VARATT_IS_EXPANDED_HEADER(a) ? \
333 (a)->xpn.dims : ARR_DIMS((ArrayType *) (a)))
334 #define AARR_LBOUND(a) \
335 (VARATT_IS_EXPANDED_HEADER(a) ? \
336 (a)->xpn.lbound : ARR_LBOUND((ArrayType *) (a)))
357 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign,
360 Datum dataValue,
bool isNull,
361 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
363 int *upperIndx,
int *lowerIndx,
364 bool *upperProvided,
bool *lowerProvided,
365 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
367 int *upperIndx,
int *lowerIndx,
368 bool *upperProvided,
bool *lowerProvided,
369 Datum srcArrayDatum,
bool isNull,
370 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
373 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign,
376 Datum dataValue,
bool isNull,
377 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
384 const bits8 *srcbitmap,
int srcoffset,
389 int elmlen,
bool elmbyval,
char elmalign);
396 Oid elmtype,
int elmlen,
bool elmbyval,
char elmalign);
403 int elmlen,
bool elmbyval,
char elmalign,
404 Datum **elemsp,
bool **nullsp,
int *nelemsp);
407 Datum **elemsp,
bool **nullsp,
int *nelemsp);
414 bool subcontext,
int initsize);
416 Datum dvalue,
bool disnull,
427 Datum dvalue,
bool disnull,
436 Datum dvalue,
bool disnull,
450 extern int ArrayGetOffset(
int n,
const int *dim,
const int *lb,
const int *indx);
454 struct Node *escontext);
457 struct Node *escontext);
458 extern void mda_get_range(
int n,
int *span,
const int *st,
const int *endp);
struct ArrayMapState ArrayMapState
void mda_get_offset_values(int n, int *dist, const int *prod, const int *span)
ExpandedArrayHeader * DatumGetExpandedArray(Datum d)
int ArrayGetNItemsSafe(int ndim, const int *dims, struct Node *escontext)
bool array_contains_nulls(ArrayType *array)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
ArrayType * construct_array_builtin(Datum *elems, int nelems, Oid elmtype)
struct ExpandedArrayHeader ExpandedArrayHeader
bool array_iterate(ArrayIterator iterator, Datum *value, bool *isnull)
bool ArrayCheckBoundsSafe(int ndim, const int *dims, const int *lb, struct Node *escontext)
ArrayBuildState * initArrayResultWithSize(Oid element_type, MemoryContext rcontext, bool subcontext, int initsize)
void array_free_iterator(ArrayIterator iterator)
int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx)
ArrayBuildStateArr * initArrayResultArr(Oid array_type, Oid element_type, MemoryContext rcontext, bool subcontext)
ArrayBuildStateAny * initArrayResultAny(Oid input_type, MemoryContext rcontext, bool subcontext)
ArrayBuildStateAny * accumArrayResultAny(ArrayBuildStateAny *astate, Datum dvalue, bool disnull, Oid input_type, MemoryContext rcontext)
void CopyArrayEls(ArrayType *array, Datum *values, bool *nulls, int nitems, int typlen, bool typbyval, char typalign, bool freedata)
struct ArrayBuildStateAny ArrayBuildStateAny
Datum expand_array(Datum arraydatum, MemoryContext parentcontext, ArrayMetaState *metacache)
ArrayType * array_set(ArrayType *array, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
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)
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
int ArrayGetOffset0(int n, const int *tup, const int *scale)
ExpandedArrayHeader * DatumGetExpandedArrayX(Datum d, ArrayMetaState *metacache)
void ArrayCheckBounds(int ndim, const int *dims, const int *lb)
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)
ArrayType * construct_empty_array(Oid elmtype)
ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
struct ArrayIteratorData * ArrayIterator
AnyArrayType * DatumGetAnyArrayP(Datum d)
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)
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)
ArrayBuildStateArr * accumArrayResultArr(ArrayBuildStateArr *astate, Datum dvalue, bool disnull, Oid array_type, MemoryContext rcontext)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
ArrayType * construct_md_array(Datum *elems, bool *nulls, int ndims, int *dims, int *lbs, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
struct ArrayType ArrayType
void array_bitmap_copy(bits8 *destbitmap, int destoffset, const bits8 *srcbitmap, int srcoffset, int nitems)
int32 * ArrayGetIntegerTypmods(ArrayType *arr, int *n)
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)
ExpandedArrayHeader * construct_empty_expanded_array(Oid element_type, MemoryContext parentcontext, ArrayMetaState *metacache)
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
static Datum values[MAXATTR]
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
ArrayBuildStateArr * arraystate
ArrayBuildState * scalarstate