off-by-one mistake in array code error reporting

Started by Alexey Klyukinalmost 15 years ago2 messages
#1Alexey Klyukin
alexk@commandprompt.com
1 attachment(s)

Hi,

While working on PL/Perl patch for arrays as input arguments I've noticed that
PostgreSQL reports one less dimension in the 'number of array dimensions (%d)
exceeds the maximum allowed (%d)", i.e.

select '{{{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}, {{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}}' ::int[];

ERROR: number of array dimensions (6) exceeds the maximum allowed (6)

Attached is the simple fix for that.

/A

--
Alexey Klyukin
The PostgreSQL Company - Command Prompt, Inc.

Attachments:

array_error_msg_fix.diffapplication/octet-stream; name=array_error_msg_fix.diffDownload
*** a/src/backend/executor/execQual.c
--- b/src/backend/executor/execQual.c
***************
*** 296,302 **** ExecEvalArrayRef(ArrayRefExprState *astate,
  			ereport(ERROR,
  					(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
  					 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
! 							i, MAXDIM)));
  
  		upper.indx[i++] = DatumGetInt32(ExecEvalExpr(eltstate,
  													 econtext,
--- 296,302 ----
  			ereport(ERROR,
  					(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
  					 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
! 							i + 1, MAXDIM)));
  
  		upper.indx[i++] = DatumGetInt32(ExecEvalExpr(eltstate,
  													 econtext,
***************
*** 324,330 **** ExecEvalArrayRef(ArrayRefExprState *astate,
  				ereport(ERROR,
  						(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
  						 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
! 								i, MAXDIM)));
  
  			lower.indx[j++] = DatumGetInt32(ExecEvalExpr(eltstate,
  														 econtext,
--- 324,330 ----
  				ereport(ERROR,
  						(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
  						 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
! 								j + 1, MAXDIM)));
  
  			lower.indx[j++] = DatumGetInt32(ExecEvalExpr(eltstate,
  														 econtext,
*** a/src/backend/utils/adt/arrayfuncs.c
--- b/src/backend/utils/adt/arrayfuncs.c
***************
*** 202,208 **** array_in(PG_FUNCTION_ARGS)
  			ereport(ERROR,
  					(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
  					 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
! 							ndim, MAXDIM)));
  
  		for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++);
  		if (q == p)				/* no digits? */
--- 202,208 ----
  			ereport(ERROR,
  					(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
  					 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
! 							ndim + 1, MAXDIM)));
  
  		for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++);
  		if (q == p)				/* no digits? */
***************
*** 481,487 **** ArrayCount(const char *str, int *dim, char typdelim)
  							ereport(ERROR,
  									(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
  									 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
! 											nest_level, MAXDIM)));
  						temp[nest_level] = 0;
  						nest_level++;
  						if (ndim < nest_level)
--- 481,487 ----
  							ereport(ERROR,
  									(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
  									 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
! 											nest_level + 1, MAXDIM)));
  						temp[nest_level] = 0;
  						nest_level++;
  						if (ndim < nest_level)
#2Itagaki Takahiro
itagaki.takahiro@gmail.com
In reply to: Alexey Klyukin (#1)
Re: off-by-one mistake in array code error reporting

On Mon, Jan 31, 2011 at 17:19, Alexey Klyukin <alexk@commandprompt.com> wrote:

While working on PL/Perl patch for arrays as input arguments I've noticed that
PostgreSQL reports one less dimension in the 'number of array dimensions (%d)
exceeds the maximum allowed (%d)", i.e.

select '{{{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}},                                                                     {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}},          {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}},                                                                                {{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}},         {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}},          {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}}'                                                                               ::int[];

ERROR:  number of array dimensions (6) exceeds the maximum allowed (6)

Attached is the simple fix for that.

Thanks. I found one more same bug in PL/pgSQL.

s=# DO $$ DECLARE a int[]; BEGIN a = (ARRAY[1])[1][1][1][1][1][1][1]; END; $$;
ERROR: number of array dimensions (6) exceeds the maximum allowed (6)

--
Itagaki Takahiro