79 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
80 errmsg(
"could not determine input data type")));
84 (
errcode(ERRCODE_DATATYPE_MISMATCH),
85 errmsg(
"input data type is not an array")));
128 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
129 errmsg(
"integer out of range")));
131 else if (eah->
ndims == 0)
135 (
errcode(ERRCODE_DATA_EXCEPTION),
136 errmsg(
"argument must be empty or one-dimensional array")));
142 1, &indx, newelem, isNull,
180 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
181 errmsg(
"integer out of range")));
183 else if (eah->
ndims == 0)
190 (
errcode(ERRCODE_DATA_EXCEPTION),
191 errmsg(
"argument must be empty or one-dimensional array")));
197 1, &indx, newelem, isNull,
270 if (element_type1 != element_type2)
272 (
errcode(ERRCODE_DATATYPE_MISMATCH),
273 errmsg(
"cannot concatenate incompatible arrays"),
274 errdetail(
"Arrays with element types %s and %s are not "
275 "compatible for concatenation.",
280 element_type = element_type1;
300 if (ndims1 == 0 && ndims2 > 0)
307 if (ndims1 != ndims2 &&
308 ndims1 != ndims2 - 1 &&
309 ndims1 != ndims2 + 1)
311 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
312 errmsg(
"cannot concatenate incompatible arrays"),
313 errdetail(
"Arrays of %d and %d dimensions are not "
314 "compatible for concatenation.",
331 if (ndims1 == ndims2)
338 dims = (
int *)
palloc(ndims *
sizeof(
int));
339 lbs = (
int *)
palloc(ndims *
sizeof(
int));
341 dims[0] = dims1[0] + dims2[0];
344 for (
i = 1;
i < ndims;
i++)
346 if (dims1[
i] != dims2[
i] || lbs1[
i] != lbs2[
i])
348 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
349 errmsg(
"cannot concatenate incompatible arrays"),
350 errdetail(
"Arrays with differing element dimensions are "
351 "not compatible for concatenation.")));
357 else if (ndims1 == ndims2 - 1)
364 dims = (
int *)
palloc(ndims *
sizeof(
int));
365 lbs = (
int *)
palloc(ndims *
sizeof(
int));
366 memcpy(dims, dims2, ndims *
sizeof(
int));
367 memcpy(lbs, lbs2, ndims *
sizeof(
int));
373 for (
i = 0;
i < ndims1;
i++)
375 if (dims1[
i] != dims[
i + 1] || lbs1[
i] != lbs[
i + 1])
377 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
378 errmsg(
"cannot concatenate incompatible arrays"),
379 errdetail(
"Arrays with differing dimensions are not "
380 "compatible for concatenation.")));
392 dims = (
int *)
palloc(ndims *
sizeof(
int));
393 lbs = (
int *)
palloc(ndims *
sizeof(
int));
394 memcpy(dims, dims1, ndims *
sizeof(
int));
395 memcpy(lbs, lbs1, ndims *
sizeof(
int));
401 for (
i = 0;
i < ndims2;
i++)
403 if (dims2[
i] != dims[
i + 1] || lbs2[
i] != lbs[
i + 1])
405 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
406 errmsg(
"cannot concatenate incompatible arrays"),
407 errdetail(
"Arrays with differing dimensions are not "
408 "compatible for concatenation.")));
417 ndatabytes = ndatabytes1 + ndatabytes2;
421 nbytes = ndatabytes + dataoffset;
430 result->
ndim = ndims;
433 memcpy(
ARR_DIMS(result), dims, ndims *
sizeof(
int));
434 memcpy(
ARR_LBOUND(result), lbs, ndims *
sizeof(
int));
437 memcpy(
ARR_DATA_PTR(result) + ndatabytes1, dat2, ndatabytes2);
466 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
467 errmsg(
"could not determine input data type")));
478 elog(
ERROR,
"array_agg_transfn called in non-aggregate context");
518 dims[0] =
state->nelems;
546 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
547 errmsg(
"could not determine input data type")));
558 elog(
ERROR,
"array_agg_array_transfn called in non-aggregate context");
639 Datum searched_element,
662 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
663 errmsg(
"searching for elements in multidimensional arrays is not supported")));
670 searched_element = (
Datum) 0;
686 (
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
687 errmsg(
"initial position must not be null")));
700 if (my_extra == NULL)
719 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
720 errmsg(
"could not identify an equality operator for type %s",
735 if (position < position_min)
742 if (isnull || null_search)
744 if (isnull && null_search)
755 searched_element,
value)))
790 Datum searched_element,
814 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
815 errmsg(
"searching for elements in multidimensional arrays is not supported")));
824 searched_element = (
Datum) 0;
839 if (my_extra == NULL)
858 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
859 errmsg(
"could not identify an equality operator for type %s",
880 if (isnull || null_search)
882 if (isnull && null_search)
892 searched_element,
value)))
static bool array_iterator(ArrayType *la, PGCALL2 callback, void *param, ltree **found)
#define PG_GETARG_ARRAYTYPE_P(n)
#define ARR_NULLBITMAP(a)
#define ARR_OVERHEAD_WITHNULLS(ndims, nitems)
#define PG_RETURN_ARRAYTYPE_P(x)
#define ARR_OVERHEAD_NONULLS(ndims)
#define ARR_DATA_OFFSET(a)
#define PG_GETARG_EXPANDED_ARRAYX(n, metacache)
Datum array_prepend(PG_FUNCTION_ARGS)
Datum array_positions(PG_FUNCTION_ARGS)
static Datum array_position_common(FunctionCallInfo fcinfo)
Datum array_position(PG_FUNCTION_ARGS)
Datum array_append(PG_FUNCTION_ARGS)
Datum array_agg_finalfn(PG_FUNCTION_ARGS)
Datum array_agg_array_transfn(PG_FUNCTION_ARGS)
Datum array_position_start(PG_FUNCTION_ARGS)
static ExpandedArrayHeader * fetch_array_arg_replace_nulls(FunctionCallInfo fcinfo, int argno)
Datum array_cat(PG_FUNCTION_ARGS)
Datum array_agg_transfn(PG_FUNCTION_ARGS)
Datum array_agg_array_finalfn(PG_FUNCTION_ARGS)
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)
bool array_iterate(ArrayIterator iterator, Datum *value, bool *isnull)
void array_free_iterator(ArrayIterator iterator)
ArrayBuildStateArr * initArrayResultArr(Oid array_type, Oid element_type, MemoryContext rcontext, bool subcontext)
Datum makeArrayResultArr(ArrayBuildStateArr *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)
ArrayIterator array_create_iterator(ArrayType *arr, int slice_ndim, ArrayMetaState *mstate)
ArrayBuildStateArr * accumArrayResultArr(ArrayBuildStateArr *astate, Datum dvalue, bool disnull, Oid array_type, MemoryContext rcontext)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
void array_bitmap_copy(bits8 *destbitmap, int destoffset, const bits8 *srcbitmap, int srcoffset, int nitems)
ExpandedArrayHeader * construct_empty_expanded_array(Oid element_type, MemoryContext parentcontext, ArrayMetaState *metacache)
int ArrayGetNItems(int ndim, const int *dims)
void ArrayCheckBounds(int ndim, const int *dims, const int *lb)
#define OidIsValid(objectId)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define EOHPGetRWDatum(eohptr)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)
#define PG_FREE_IF_COPY(ptr, n)
#define PG_GETARG_POINTER(n)
#define PG_GETARG_DATUM(n)
#define PG_RETURN_INT32(x)
#define PG_GETARG_INT32(n)
#define PG_RETURN_DATUM(x)
#define PG_RETURN_POINTER(x)
#define PG_GET_COLLATION()
static bool pg_sub_s32_overflow(int32 a, int32 b, int32 *result)
static bool pg_add_s32_overflow(int32 a, int32 b, int32 *result)
Assert(fmt[strlen(fmt) - 1] !='\n')
Oid get_element_type(Oid typid)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
void * MemoryContextAlloc(MemoryContext context, Size size)
int AggCheckCallContext(FunctionCallInfo fcinfo, MemoryContext *aggcontext)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define SET_VARSIZE(PTR, len)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
#define TYPECACHE_EQ_OPR_FINFO