97 #define EA_MAGIC 689375833
242 #define DatumGetArrayTypeP(X) ((ArrayType *) PG_DETOAST_DATUM(X))
243 #define DatumGetArrayTypePCopy(X) ((ArrayType *) PG_DETOAST_DATUM_COPY(X))
244 #define PG_GETARG_ARRAYTYPE_P(n) DatumGetArrayTypeP(PG_GETARG_DATUM(n))
245 #define PG_GETARG_ARRAYTYPE_P_COPY(n) DatumGetArrayTypePCopy(PG_GETARG_DATUM(n))
246 #define PG_RETURN_ARRAYTYPE_P(x) PG_RETURN_POINTER(x)
249 #define PG_GETARG_EXPANDED_ARRAY(n) DatumGetExpandedArray(PG_GETARG_DATUM(n))
250 #define PG_GETARG_EXPANDED_ARRAYX(n, metacache) \
251 DatumGetExpandedArrayX(PG_GETARG_DATUM(n), metacache)
252 #define PG_RETURN_EXPANDED_ARRAY(x) PG_RETURN_DATUM(EOHPGetRWDatum(&(x)->hdr))
255 #define PG_GETARG_ANY_ARRAY(n) DatumGetAnyArray(PG_GETARG_DATUM(n))
270 #define ARR_SIZE(a) VARSIZE(a)
271 #define ARR_NDIM(a) ((a)->ndim)
272 #define ARR_HASNULL(a) ((a)->dataoffset != 0)
273 #define ARR_ELEMTYPE(a) ((a)->elemtype)
275 #define ARR_DIMS(a) \
276 ((int *) (((char *) (a)) + sizeof(ArrayType)))
277 #define ARR_LBOUND(a) \
278 ((int *) (((char *) (a)) + sizeof(ArrayType) + \
279 sizeof(int) * ARR_NDIM(a)))
281 #define ARR_NULLBITMAP(a) \
283 (bits8 *) (((char *) (a)) + sizeof(ArrayType) + \
284 2 * sizeof(int) * ARR_NDIM(a)) \
291 #define ARR_OVERHEAD_NONULLS(ndims) \
292 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims))
293 #define ARR_OVERHEAD_WITHNULLS(ndims, nitems) \
294 MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims) + \
297 #define ARR_DATA_OFFSET(a) \
298 (ARR_HASNULL(a) ? (a)->dataoffset : ARR_OVERHEAD_NONULLS(ARR_NDIM(a)))
303 #define ARR_DATA_PTR(a) \
304 (((char *) (a)) + ARR_DATA_OFFSET(a))
309 #define AARR_NDIM(a) \
310 (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.ndims : ARR_NDIM(&(a)->flt))
311 #define AARR_HASNULL(a) \
312 (VARATT_IS_EXPANDED_HEADER(a) ? \
313 ((a)->xpn.dvalues != NULL ? (a)->xpn.dnulls != NULL : ARR_HASNULL((a)->xpn.fvalue)) : \
314 ARR_HASNULL(&(a)->flt))
315 #define AARR_ELEMTYPE(a) \
316 (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.element_type : ARR_ELEMTYPE(&(a)->flt))
317 #define AARR_DIMS(a) \
318 (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.dims : ARR_DIMS(&(a)->flt))
319 #define AARR_LBOUND(a) \
320 (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.lbound : ARR_LBOUND(&(a)->flt))
373 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign,
376 Datum dataValue,
bool isNull,
377 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
379 int *upperIndx,
int *lowerIndx,
380 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
382 int *upperIndx,
int *lowerIndx,
383 Datum srcArrayDatum,
bool isNull,
384 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
387 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign,
390 Datum dataValue,
bool isNull,
391 int arraytyplen,
int elmlen,
bool elmbyval,
char elmalign);
397 const bits8 *srcbitmap,
int srcoffset,
402 int elmlen,
bool elmbyval,
char elmalign);
408 Oid elmtype,
int elmlen,
bool elmbyval,
char elmalign);
415 int elmlen,
bool elmbyval,
char elmalign,
416 Datum **elemsp,
bool **nullsp,
int *nelemsp);
422 Datum dvalue,
bool disnull,
433 Datum dvalue,
bool disnull,
442 Datum dvalue,
bool disnull,
456 extern int ArrayGetOffset(
int n,
const int *dim,
const int *lb,
const int *indx);
459 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)
ArrayType * construct_empty_array(Oid elmtype)
static struct cvec * range(struct vars *v, celt a, celt b, int cases)
ArrayBuildStateAny * accumArrayResultAny(ArrayBuildStateAny *astate, Datum dvalue, bool disnull, Oid input_type, MemoryContext rcontext)
Datum array_replace(PG_FUNCTION_ARGS)
Datum array_typanalyze(PG_FUNCTION_ARGS)
Datum array_recv(PG_FUNCTION_ARGS)
AnyArrayType * DatumGetAnyArray(Datum d)
Datum array_agg_transfn(PG_FUNCTION_ARGS)
Datum array_map(FunctionCallInfo fcinfo, Oid retType, ArrayMapState *amstate)
Datum array_position(PG_FUNCTION_ARGS)
Datum array_eq(PG_FUNCTION_ARGS)
Datum array_cardinality(PG_FUNCTION_ARGS)
Datum array_lt(PG_FUNCTION_ARGS)
void mda_get_range(int n, int *span, const int *st, const int *endp)
Datum array_larger(PG_FUNCTION_ARGS)
int mda_next_tuple(int n, int *curr, const int *span)
struct ArrayMetaState ArrayMetaState
Datum array_remove(PG_FUNCTION_ARGS)
Datum array_upper(PG_FUNCTION_ARGS)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
bool array_contains_nulls(ArrayType *array)
Datum generate_subscripts(PG_FUNCTION_ARGS)
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 array_length(PG_FUNCTION_ARGS)
Datum hash_array(PG_FUNCTION_ARGS)
Datum array_unnest(PG_FUNCTION_ARGS)
Datum expand_array(Datum arraydatum, MemoryContext parentcontext, ArrayMetaState *metacache)
Datum generate_subscripts_nodir(PG_FUNCTION_ARGS)
Datum makeArrayResultAny(ArrayBuildStateAny *astate, MemoryContext rcontext, bool release)
union AnyArrayType AnyArrayType
Datum arraycontained(PG_FUNCTION_ARGS)
Datum array_position_start(PG_FUNCTION_ARGS)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
Datum array_in(PG_FUNCTION_ARGS)
Datum array_smaller(PG_FUNCTION_ARGS)
Datum makeArrayResultArr(ArrayBuildStateArr *astate, MemoryContext rcontext, bool release)
int ArrayGetOffset0(int n, const int *tup, const int *scale)
ExpandedArrayHeader * DatumGetExpandedArrayX(Datum d, ArrayMetaState *metacache)
Datum array_set_slice(Datum arraydatum, int nSubscripts, int *upperIndx, int *lowerIndx, Datum srcArrayDatum, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
struct ArrayMapState ArrayMapState
struct ArrayIteratorData * ArrayIterator
ArrayBuildStateArr * initArrayResultArr(Oid array_type, Oid element_type, MemoryContext rcontext, bool subcontext)
Datum btarraycmp(PG_FUNCTION_ARGS)
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)
Datum array_ne(PG_FUNCTION_ARGS)
Datum arrayoverlap(PG_FUNCTION_ARGS)
int ArrayGetNItems(int ndim, const int *dims)
Datum array_prepend(PG_FUNCTION_ARGS)
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_agg_array_transfn(PG_FUNCTION_ARGS)
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)
Datum array_out(PG_FUNCTION_ARGS)
void array_free_iterator(ArrayIterator iterator)
Datum width_bucket_array(PG_FUNCTION_ARGS)
Datum array_positions(PG_FUNCTION_ARGS)
Datum array_append(PG_FUNCTION_ARGS)
void mda_get_prod(int n, const int *range, int *prod)
Datum array_fill_with_lower_bounds(PG_FUNCTION_ARGS)
struct ExpandedArrayHeader ExpandedArrayHeader
int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx)
Datum array_dims(PG_FUNCTION_ARGS)
Datum array_cat(PG_FUNCTION_ARGS)
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
Datum array_le(PG_FUNCTION_ARGS)
Datum array_lower(PG_FUNCTION_ARGS)
static Datum values[MAXATTR]
Datum array_agg_array_finalfn(PG_FUNCTION_ARGS)
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)
static celt element(struct vars *v, const chr *startp, const chr *endp)
Datum arraycontains(PG_FUNCTION_ARGS)
Datum array_get_slice(Datum arraydatum, int nSubscripts, int *upperIndx, int *lowerIndx, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
ArrayType * array_set(ArrayType *array, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
ArrayType * create_singleton_array(FunctionCallInfo fcinfo, Oid element_type, Datum element, bool isNull, int ndims)
Datum array_agg_finalfn(PG_FUNCTION_ARGS)
void deconstruct_expanded_array(ExpandedArrayHeader *eah)
Datum array_gt(PG_FUNCTION_ARGS)
Datum array_ge(PG_FUNCTION_ARGS)
Datum array_ndims(PG_FUNCTION_ARGS)
struct ArrayBuildState ArrayBuildState
Datum array_fill(PG_FUNCTION_ARGS)
Datum array_send(PG_FUNCTION_ARGS)
ArrayBuildStateAny * initArrayResultAny(Oid input_type, MemoryContext rcontext, bool subcontext)
ExpandedArrayHeader * construct_empty_expanded_array(Oid element_type, MemoryContext parentcontext, ArrayMetaState *metacache)