*** a/src/backend/utils/adt/arrayfuncs.c --- b/src/backend/utils/adt/arrayfuncs.c *************** *** 1551,1557 **** array_send(PG_FUNCTION_ARGS) Datum array_ndims(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); /* Sanity check: does it look like an array at all? */ if (ARR_NDIM(v) <= 0 || ARR_NDIM(v) > MAXDIM) --- 1551,1557 ---- Datum array_ndims(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_P(0); /* Sanity check: does it look like an array at all? */ if (ARR_NDIM(v) <= 0 || ARR_NDIM(v) > MAXDIM) *************** *** 1567,1573 **** array_ndims(PG_FUNCTION_ARGS) Datum array_dims(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); char *p; int i; int *dimv, --- 1567,1573 ---- Datum array_dims(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_P(0); char *p; int i; int *dimv, *************** *** 1605,1611 **** array_dims(PG_FUNCTION_ARGS) Datum array_lower(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); int reqdim = PG_GETARG_INT32(1); int *lb; int result; --- 1605,1611 ---- Datum array_lower(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_P(0); int reqdim = PG_GETARG_INT32(1); int *lb; int result; *************** *** 1632,1638 **** array_lower(PG_FUNCTION_ARGS) Datum array_upper(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); int reqdim = PG_GETARG_INT32(1); int *dimv, *lb; --- 1632,1638 ---- Datum array_upper(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_P(0); int reqdim = PG_GETARG_INT32(1); int *dimv, *lb; *************** *** 1662,1668 **** array_upper(PG_FUNCTION_ARGS) Datum array_length(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); int reqdim = PG_GETARG_INT32(1); int *dimv; int result; --- 1662,1668 ---- Datum array_length(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_P(0); int reqdim = PG_GETARG_INT32(1); int *dimv; int result; *** a/src/include/utils/array.h --- b/src/include/utils/array.h *************** *** 119,126 **** typedef struct ArrayMapState --- 119,129 ---- */ #define DatumGetArrayTypeP(X) ((ArrayType *) PG_DETOAST_DATUM(X)) #define DatumGetArrayTypePCopy(X) ((ArrayType *) PG_DETOAST_DATUM_COPY(X)) + #define DatamGetArrayTypeHeaderP(X) \ + ((ArrayType *) PG_DETOAST_DATUM_SLICE(X, 0, ARR_MAX_HEADER_SIZE)) #define PG_GETARG_ARRAYTYPE_P(n) DatumGetArrayTypeP(PG_GETARG_DATUM(n)) #define PG_GETARG_ARRAYTYPE_P_COPY(n) DatumGetArrayTypePCopy(PG_GETARG_DATUM(n)) + #define PG_GETARG_ARRAYTYPE_HEADER_P(n) DatamGetArrayTypeHeaderP(PG_GETARG_DATUM(n)) #define PG_RETURN_ARRAYTYPE_P(x) PG_RETURN_POINTER(x) /* *************** *** 172,177 **** typedef struct ArrayMapState --- 175,185 ---- #define ARR_DATA_PTR(a) \ (((char *) (a)) + ARR_DATA_OFFSET(a)) + /* + * Calculate the maximum size a header of an array can be + */ + #define ARR_MAX_HEADER_SIZE \ + ARR_OVERHEAD_NONULLS(MAXDIM) /* * GUC parameter