*** a/src/backend/utils/adt/arrayfuncs.c --- b/src/backend/utils/adt/arrayfuncs.c *************** *** 1552,1558 **** 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) --- 1552,1558 ---- Datum array_ndims(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_NONULL_P(0); /* Sanity check: does it look like an array at all? */ if (ARR_NDIM(v) <= 0 || ARR_NDIM(v) > MAXDIM) *************** *** 1568,1574 **** array_ndims(PG_FUNCTION_ARGS) Datum array_dims(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); char *p; int i; int *dimv, --- 1568,1574 ---- Datum array_dims(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_NONULL_P(0); char *p; int i; int *dimv, *************** *** 1606,1612 **** 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; --- 1606,1612 ---- Datum array_lower(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_NONULL_P(0); int reqdim = PG_GETARG_INT32(1); int *lb; int result; *************** *** 1633,1639 **** 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; --- 1633,1639 ---- Datum array_upper(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_NONULL_P(0); int reqdim = PG_GETARG_INT32(1); int *dimv, *lb; *************** *** 1663,1669 **** 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; --- 1663,1669 ---- Datum array_length(PG_FUNCTION_ARGS) { ! ArrayType *v = PG_GETARG_ARRAYTYPE_HEADER_NONULL_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,132 ---- */ #define DatumGetArrayTypeP(X) ((ArrayType *) PG_DETOAST_DATUM(X)) #define DatumGetArrayTypePCopy(X) ((ArrayType *) PG_DETOAST_DATUM_COPY(X)) + /* detoasts ArrayType up to and including */ + #define DatamGetArrayTypeHeaderNonullP(X) \ + ((ArrayType *) PG_DETOAST_DATUM_SLICE(X, 0, ARR_OVERHEAD_NONULLS(MAXDIM))) + #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_NONULL_P(n) \ + DatamGetArrayTypeHeaderNonullP(PG_GETARG_DATUM(n)) #define PG_RETURN_ARRAYTYPE_P(x) PG_RETURN_POINTER(x) /* *************** *** 172,178 **** typedef struct ArrayMapState #define ARR_DATA_PTR(a) \ (((char *) (a)) + ARR_DATA_OFFSET(a)) - /* * GUC parameter */ --- 178,183 ----