101 #define EA_MAGIC 689375833 246 #define DatumGetArrayTypeP(X) ((ArrayType *) PG_DETOAST_DATUM(X)) 247 #define DatumGetArrayTypePCopy(X) ((ArrayType *) PG_DETOAST_DATUM_COPY(X)) 248 #define PG_GETARG_ARRAYTYPE_P(n) DatumGetArrayTypeP(PG_GETARG_DATUM(n)) 249 #define PG_GETARG_ARRAYTYPE_P_COPY(n) DatumGetArrayTypePCopy(PG_GETARG_DATUM(n)) 250 #define PG_RETURN_ARRAYTYPE_P(x) PG_RETURN_POINTER(x) 253 #define PG_GETARG_EXPANDED_ARRAY(n) DatumGetExpandedArray(PG_GETARG_DATUM(n)) 254 #define PG_GETARG_EXPANDED_ARRAYX(n, metacache) \ 255 DatumGetExpandedArrayX(PG_GETARG_DATUM(n), metacache) 256 #define PG_RETURN_EXPANDED_ARRAY(x) PG_RETURN_DATUM(EOHPGetRWDatum(&(x)->hdr)) 259 #define PG_GETARG_ANY_ARRAY_P(n) DatumGetAnyArrayP(PG_GETARG_DATUM(n)) 274 #define ARR_SIZE(a) VARSIZE(a) 275 #define ARR_NDIM(a) ((a)->ndim) 276 #define ARR_HASNULL(a) ((a)->dataoffset != 0) 277 #define ARR_ELEMTYPE(a) ((a)->elemtype) 279 #define ARR_DIMS(a) \ 280 ((int *) (((char *) (a)) + sizeof(ArrayType))) 281 #define ARR_LBOUND(a) \ 282 ((int *) (((char *) (a)) + sizeof(ArrayType) + \ 283 sizeof(int) * ARR_NDIM(a))) 285 #define ARR_NULLBITMAP(a) \ 287 (bits8 *) (((char *) (a)) + sizeof(ArrayType) + \ 288 2 * sizeof(int) * ARR_NDIM(a)) \ 295 #define ARR_OVERHEAD_NONULLS(ndims) \ 296 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims)) 297 #define ARR_OVERHEAD_WITHNULLS(ndims, nitems) \ 298 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims) + \ 301 #define ARR_DATA_OFFSET(a) \ 302 (ARR_HASNULL(a) ? (a)->dataoffset : ARR_OVERHEAD_NONULLS(ARR_NDIM(a))) 307 #define ARR_DATA_PTR(a) \ 308 (((char *) (a)) + ARR_DATA_OFFSET(a)) 313 #define AARR_NDIM(a) \ 314 (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.ndims : ARR_NDIM(&(a)->flt)) 315 #define AARR_HASNULL(a) \ 316 (VARATT_IS_EXPANDED_HEADER(a) ? \ 317 ((a)->xpn.dvalues != NULL ? (a)->xpn.dnulls != NULL : ARR_HASNULL((a)->xpn.fvalue)) : \ 318 ARR_HASNULL(&(a)->flt)) 319 #define AARR_ELEMTYPE(a) \ 320 (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.element_type : ARR_ELEMTYPE(&(a)->flt)) 321 #define AARR_DIMS(a) \ 322 (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.dims : ARR_DIMS(&(a)->flt)) 323 #define AARR_LBOUND(a) \ 324 (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.lbound : ARR_LBOUND(&(a)->flt)) 345 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign,
348 Datum dataValue,
bool isNull,
349 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
351 int *upperIndx,
int *lowerIndx,
352 bool *upperProvided,
bool *lowerProvided,
353 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
355 int *upperIndx,
int *lowerIndx,
356 bool *upperProvided,
bool *lowerProvided,
357 Datum srcArrayDatum,
bool isNull,
358 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
361 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign,
364 Datum dataValue,
bool isNull,
365 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
372 const bits8 *srcbitmap,
int srcoffset,
377 int elmlen,
bool elmbyval,
char elmalign);
383 Oid elmtype,
int elmlen,
bool elmbyval,
char elmalign);
390 int elmlen,
bool elmbyval,
char elmalign,
391 Datum **elemsp,
bool **nullsp,
int *nelemsp);
397 Datum dvalue,
bool disnull,
408 Datum dvalue,
bool disnull,
417 Datum dvalue,
bool disnull,
431 extern int ArrayGetOffset(
int n,
const int *dim,
const int *lb,
const int *indx);
434 extern void mda_get_range(
int n,
int *span,
const int *st,
const int *endp);
void mda_get_offset_values(int n, int *dist, const int *prod, const int *span)
void CopyArrayEls(ArrayType *array, Datum *values, bool *nulls, int nitems, int typlen, bool typbyval, char typalign, bool freedata)
Datum array_get_slice(Datum arraydatum, int nSubscripts, int *upperIndx, int *lowerIndx, bool *upperProvided, bool *lowerProvided, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
ArrayType * construct_empty_array(Oid elmtype)
ArrayBuildStateAny * accumArrayResultAny(ArrayBuildStateAny *astate, Datum dvalue, bool disnull, Oid input_type, MemoryContext rcontext)
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)
Datum array_map(Datum arrayd, struct ExprState *exprstate, struct ExprContext *econtext, Oid retType, ArrayMapState *amstate)
void mda_get_range(int n, int *span, const int *st, const int *endp)
int mda_next_tuple(int n, int *curr, const int *span)
struct ArrayMetaState ArrayMetaState
AnyArrayType * DatumGetAnyArrayP(Datum d)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
bool array_contains_nulls(ArrayType *array)
Datum array_set_element(Datum arraydatum, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
ArrayBuildState * scalarstate
Datum expand_array(Datum arraydatum, MemoryContext parentcontext, ArrayMetaState *metacache)
Datum makeArrayResultAny(ArrayBuildStateAny *astate, MemoryContext rcontext, bool release)
union AnyArrayType AnyArrayType
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
Datum makeArrayResultArr(ArrayBuildStateArr *astate, MemoryContext rcontext, bool release)
int ArrayGetOffset0(int n, const int *tup, const int *scale)
ExpandedArrayHeader * DatumGetExpandedArrayX(Datum d, ArrayMetaState *metacache)
struct ArrayMapState ArrayMapState
struct ArrayIteratorData * ArrayIterator
ArrayBuildStateArr * initArrayResultArr(Oid array_type, Oid element_type, MemoryContext rcontext, bool subcontext)
ArrayIterator array_create_iterator(ArrayType *arr, int slice_ndim, ArrayMetaState *mstate)
Datum array_ref(ArrayType *array, int nSubscripts, int *indx, int arraytyplen, int elmlen, bool elmbyval, char elmalign, bool *isNull)
Datum makeMdArrayResult(ArrayBuildState *astate, int ndims, int *dims, int *lbs, MemoryContext rcontext, bool release)
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
int ArrayGetNItems(int ndim, const int *dims)
ExpandedArrayHeader * DatumGetExpandedArray(Datum d)
ArrayType * construct_md_array(Datum *elems, bool *nulls, int ndims, int *dims, int *lbs, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
Datum array_get_element(Datum arraydatum, int nSubscripts, int *indx, int arraytyplen, int elmlen, bool elmbyval, char elmalign, bool *isNull)
bool array_iterate(ArrayIterator iterator, Datum *value, bool *isnull)
ArrayBuildStateArr * arraystate
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
ArrayBuildStateArr * accumArrayResultArr(ArrayBuildStateArr *astate, Datum dvalue, bool disnull, Oid array_type, MemoryContext rcontext)
void array_free_iterator(ArrayIterator iterator)
void mda_get_prod(int n, const int *range, int *prod)
struct ExpandedArrayHeader ExpandedArrayHeader
int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx)
ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
void array_bitmap_copy(bits8 *destbitmap, int destoffset, const bits8 *srcbitmap, int srcoffset, int nitems)
struct ArrayBuildStateAny ArrayBuildStateAny
struct ArrayBuildStateArr ArrayBuildStateArr
static Datum values[MAXATTR]
int32 * ArrayGetIntegerTypmods(ArrayType *arr, int *n)
void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
ArrayType * array_set(ArrayType *array, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
void deconstruct_expanded_array(ExpandedArrayHeader *eah)
struct ArrayBuildState ArrayBuildState
ArrayBuildStateAny * initArrayResultAny(Oid input_type, MemoryContext rcontext, bool subcontext)
ExpandedArrayHeader * construct_empty_expanded_array(Oid element_type, MemoryContext parentcontext, ArrayMetaState *metacache)