detoast-headers-for-array-functions-003.patch

application/octet-stream

Filename: detoast-headers-for-array-functions-003.patch
Type: application/octet-stream
Part: 0
Message: Re: Performance Enhancement/Fix for Array Utility Functions

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/backend/utils/adt/arrayfuncs.c 5 0
src/include/utils/array.h 6 0
*** 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 <lower bnds> */
+ #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 ----