66 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
67 errmsg(
"could not determine input data type")));
71 (
errcode(ERRCODE_DATATYPE_MISMATCH),
72 errmsg(
"input data type is not an array")));
113 ub = dimv[0] + lb[0] - 1;
119 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
120 errmsg(
"integer out of range")));
122 else if (eah->
ndims == 0)
126 (
errcode(ERRCODE_DATA_EXCEPTION),
127 errmsg(
"argument must be empty or one-dimensional array")));
133 1, &indx, newelem, isNull,
173 (
errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
174 errmsg(
"integer out of range")));
176 else if (eah->
ndims == 0)
183 (
errcode(ERRCODE_DATA_EXCEPTION),
184 errmsg(
"argument must be empty or one-dimensional array")));
190 1, &indx, newelem, isNull,
263 if (element_type1 != element_type2)
265 (
errcode(ERRCODE_DATATYPE_MISMATCH),
266 errmsg(
"cannot concatenate incompatible arrays"),
267 errdetail(
"Arrays with element types %s and %s are not "
268 "compatible for concatenation.",
273 element_type = element_type1;
293 if (ndims1 == 0 && ndims2 > 0)
300 if (ndims1 != ndims2 &&
301 ndims1 != ndims2 - 1 &&
302 ndims1 != ndims2 + 1)
304 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
305 errmsg(
"cannot concatenate incompatible arrays"),
306 errdetail(
"Arrays of %d and %d dimensions are not "
307 "compatible for concatenation.",
324 if (ndims1 == ndims2)
331 dims = (
int *)
palloc(ndims *
sizeof(
int));
332 lbs = (
int *)
palloc(ndims *
sizeof(
int));
334 dims[0] = dims1[0] + dims2[0];
337 for (i = 1; i < ndims; i++)
339 if (dims1[i] != dims2[i] || lbs1[i] != lbs2[i])
341 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
342 errmsg(
"cannot concatenate incompatible arrays"),
343 errdetail(
"Arrays with differing element dimensions are "
344 "not compatible for concatenation.")));
350 else if (ndims1 == ndims2 - 1)
357 dims = (
int *)
palloc(ndims *
sizeof(
int));
358 lbs = (
int *)
palloc(ndims *
sizeof(
int));
359 memcpy(dims, dims2, ndims *
sizeof(
int));
360 memcpy(lbs, lbs2, ndims *
sizeof(
int));
366 for (i = 0; i < ndims1; i++)
368 if (dims1[i] != dims[i + 1] || lbs1[i] != lbs[i + 1])
370 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
371 errmsg(
"cannot concatenate incompatible arrays"),
372 errdetail(
"Arrays with differing dimensions are not "
373 "compatible for concatenation.")));
385 dims = (
int *)
palloc(ndims *
sizeof(
int));
386 lbs = (
int *)
palloc(ndims *
sizeof(
int));
387 memcpy(dims, dims1, ndims *
sizeof(
int));
388 memcpy(lbs, lbs1, ndims *
sizeof(
int));
394 for (i = 0; i < ndims2; i++)
396 if (dims2[i] != dims[i + 1] || lbs2[i] != lbs[i + 1])
398 (
errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
399 errmsg(
"cannot concatenate incompatible arrays"),
400 errdetail(
"Arrays with differing dimensions are not "
401 "compatible for concatenation.")));
409 ndatabytes = ndatabytes1 + ndatabytes2;
413 nbytes = ndatabytes + dataoffset;
422 result->
ndim = ndims;
425 memcpy(
ARR_DIMS(result), dims, ndims *
sizeof(
int));
426 memcpy(
ARR_LBOUND(result), lbs, ndims *
sizeof(
int));
429 memcpy(
ARR_DATA_PTR(result) + ndatabytes1, dat2, ndatabytes2);
467 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
468 errmsg(
"invalid number of dimensions: %d", ndims)));
471 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
472 errmsg(
"number of array dimensions (%d) exceeds the maximum allowed (%d)",
478 for (i = 0; i < ndims; i++)
489 if (my_extra ==
NULL)
506 typlen = my_extra->
typlen;
511 typlen, typbyval, typalign);
528 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
529 errmsg(
"could not determine input data type")));
540 elog(
ERROR,
"array_agg_transfn called in non-aggregate context");
608 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
609 errmsg(
"could not determine input data type")));
620 elog(
ERROR,
"array_agg_array_transfn called in non-aggregate context");
701 Datum searched_element,
724 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
725 errmsg(
"searching for elements in multidimensional arrays is not supported")));
732 searched_element = (
Datum) 0;
748 (
errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
749 errmsg(
"initial position should not be NULL")));
762 if (my_extra ==
NULL)
781 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
782 errmsg(
"could not identify an equality operator for type %s",
796 if (position < position_min)
803 if (isnull || null_search)
805 if (isnull && null_search)
816 searched_element, value)))
851 Datum searched_element,
875 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
876 errmsg(
"searching for elements in multidimensional arrays is not supported")));
885 searched_element = (
Datum) 0;
900 if (my_extra ==
NULL)
919 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
920 errmsg(
"could not identify an equality operator for type %s",
940 if (isnull || null_search)
942 if (isnull && null_search)
952 searched_element, value)))
#define PG_RETURN_POINTER(x)
ArrayIterator array_create_iterator(ArrayType *arr, int slice_ndim, ArrayMetaState *mstate)
Datum makeArrayResultArr(ArrayBuildStateArr *astate, MemoryContext rcontext, bool release)
Datum makeMdArrayResult(ArrayBuildState *astate, int ndims, int *dims, int *lbs, MemoryContext rcontext, bool release)
#define PG_GETARG_INT32(n)
#define ARR_OVERHEAD_NONULLS(ndims)
ArrayBuildState * initArrayResult(Oid element_type, MemoryContext rcontext, bool subcontext)
Datum array_agg_finalfn(PG_FUNCTION_ARGS)
Oid get_element_type(Oid typid)
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
#define PG_GETARG_DATUM(n)
Datum array_agg_transfn(PG_FUNCTION_ARGS)
#define TYPECACHE_EQ_OPR_FINFO
void array_bitmap_copy(bits8 *destbitmap, int destoffset, const bits8 *srcbitmap, int srcoffset, int nitems)
#define PG_GETARG_EXPANDED_ARRAYX(n, metacache)
int ArrayGetNItems(int ndim, const int *dims)
#define PG_RETURN_INT32(x)
int errcode(int sqlerrcode)
Datum array_set_element(Datum arraydatum, int nSubscripts, int *indx, Datum dataValue, bool isNull, int arraytyplen, int elmlen, bool elmbyval, char elmalign)
#define PG_GETARG_POINTER(n)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
#define OidIsValid(objectId)
#define ARR_OVERHEAD_WITHNULLS(ndims, nitems)
#define PG_GET_COLLATION()
ArrayBuildStateArr * initArrayResultArr(Oid array_type, Oid element_type, MemoryContext rcontext, bool subcontext)
#define ARR_DATA_OFFSET(a)
Datum array_cat(PG_FUNCTION_ARGS)
static ExpandedArrayHeader * fetch_array_arg_replace_nulls(FunctionCallInfo fcinfo, int argno)
#define PG_GETARG_ARRAYTYPE_P(n)
bool array_iterate(ArrayIterator iterator, Datum *value, bool *isnull)
Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum)
void fmgr_info(Oid functionId, FmgrInfo *finfo)
static Datum array_position_common(FunctionCallInfo fcinfo)
ArrayBuildStateArr * accumArrayResultArr(ArrayBuildStateArr *astate, Datum dvalue, bool disnull, Oid array_type, MemoryContext rcontext)
static bool array_iterator(ArrayType *la, PGCALL2 callback, void *param, ltree **found)
int errdetail(const char *fmt,...)
Datum array_position_start(PG_FUNCTION_ARGS)
ArrayType * create_singleton_array(FunctionCallInfo fcinfo, Oid element_type, Datum element, bool isNull, int ndims)
Datum array_position(PG_FUNCTION_ARGS)
MemoryContext CurrentMemoryContext
#define PG_RETURN_ARRAYTYPE_P(x)
#define ereport(elevel, rest)
Datum makeArrayResult(ArrayBuildState *astate, MemoryContext rcontext)
Datum array_agg_array_transfn(PG_FUNCTION_ARGS)
ExpandedArrayHeader * construct_empty_expanded_array(Oid element_type, MemoryContext parentcontext, ArrayMetaState *metacache)
void * palloc0(Size size)
#define PG_RETURN_DATUM(x)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
void array_free_iterator(ArrayIterator iterator)
#define Assert(condition)
Datum array_positions(PG_FUNCTION_ARGS)
int AggCheckCallContext(FunctionCallInfo fcinfo, MemoryContext *aggcontext)
#define PG_FREE_IF_COPY(ptr, n)
#define EOHPGetRWDatum(eohptr)
ArrayBuildState * accumArrayResult(ArrayBuildState *astate, Datum dvalue, bool disnull, Oid element_type, MemoryContext rcontext)
int errmsg(const char *fmt,...)
void * MemoryContextAlloc(MemoryContext context, Size size)
static celt element(struct vars *v, const chr *startp, const chr *endp)
#define SET_VARSIZE(PTR, len)
Datum array_agg_array_finalfn(PG_FUNCTION_ARGS)
Datum array_append(PG_FUNCTION_ARGS)
Datum array_prepend(PG_FUNCTION_ARGS)
ArrayType * construct_md_array(Datum *elems, bool *nulls, int ndims, int *dims, int *lbs, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
bool array_contains_nulls(ArrayType *array)
#define ARR_NULLBITMAP(a)