@@ -233,23 +233,27 @@ array_in(PG_FUNCTION_ARGS)
233233errmsg ("number of array dimensions (%d) exceeds the maximum allowed (%d)" ,
234234ndim + 1 ,MAXDIM )));
235235
236- for (q = p ;isdigit ((unsignedchar )* q )|| (* q == '-' )|| (* q == '+' );q ++ );
236+ for (q = p ;isdigit ((unsignedchar )* q )|| (* q == '-' )|| (* q == '+' );q ++ )
237+ /* skip */ ;
237238if (q == p )/* no digits? */
238239ereport (ERROR ,
239240(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
240- errmsg ("missing dimension value" )));
241+ errmsg ("malformed array literal: \"%s\"" ,string ),
242+ errdetail ("\"[\" must introduce explicitly-specified array dimensions." )));
241243
242244if (* q == ':' )
243245{
244246/* [m:n] format */
245247* q = '\0' ;
246248lBound [ndim ]= atoi (p );
247249p = q + 1 ;
248- for (q = p ;isdigit ((unsignedchar )* q )|| (* q == '-' )|| (* q == '+' );q ++ );
250+ for (q = p ;isdigit ((unsignedchar )* q )|| (* q == '-' )|| (* q == '+' );q ++ )
251+ /* skip */ ;
249252if (q == p )/* no digits? */
250253ereport (ERROR ,
251254(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
252- errmsg ("missing dimension value" )));
255+ errmsg ("malformed array literal: \"%s\"" ,string ),
256+ errdetail ("Missing array dimension value." )));
253257}
254258else
255259{
@@ -259,7 +263,9 @@ array_in(PG_FUNCTION_ARGS)
259263if (* q != ']' )
260264ereport (ERROR ,
261265(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
262- errmsg ("missing \"]\" in array dimensions" )));
266+ errmsg ("malformed array literal: \"%s\"" ,string ),
267+ errdetail ("Missing \"%s\" after array dimensions." ,
268+ "]" )));
263269
264270* q = '\0' ;
265271ub = atoi (p );
@@ -279,7 +285,8 @@ array_in(PG_FUNCTION_ARGS)
279285if (* p != '{' )
280286ereport (ERROR ,
281287(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
282- errmsg ("array value must start with \"{\" or dimension information" )));
288+ errmsg ("malformed array literal: \"%s\"" ,string ),
289+ errdetail ("Array value must start with \"{\" or dimension information." )));
283290ndim = ArrayCount (p ,dim ,typdelim );
284291for (i = 0 ;i < ndim ;i ++ )
285292lBound [i ]= 1 ;
@@ -293,7 +300,9 @@ array_in(PG_FUNCTION_ARGS)
293300if (strncmp (p ,ASSGN ,strlen (ASSGN ))!= 0 )
294301ereport (ERROR ,
295302(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
296- errmsg ("missing assignment operator" )));
303+ errmsg ("malformed array literal: \"%s\"" ,string ),
304+ errdetail ("Missing \"%s\" after array dimensions." ,
305+ ASSGN )));
297306p += strlen (ASSGN );
298307while (array_isspace (* p ))
299308p ++ ;
@@ -305,18 +314,21 @@ array_in(PG_FUNCTION_ARGS)
305314if (* p != '{' )
306315ereport (ERROR ,
307316(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
308- errmsg ("array value must start with \"{\" or dimension information" )));
317+ errmsg ("malformed array literal: \"%s\"" ,string ),
318+ errdetail ("Array contents must start with \"{\"." )));
309319ndim_braces = ArrayCount (p ,dim_braces ,typdelim );
310320if (ndim_braces != ndim )
311321ereport (ERROR ,
312322(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
313- errmsg ("array dimensions incompatible with array literal" )));
323+ errmsg ("malformed array literal: \"%s\"" ,string ),
324+ errdetail ("Specified array dimensions do not match array contents." )));
314325for (i = 0 ;i < ndim ;++ i )
315326{
316327if (dim [i ]!= dim_braces [i ])
317328ereport (ERROR ,
318329(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
319- errmsg ("array dimensions incompatible with array literal" )));
330+ errmsg ("malformed array literal: \"%s\"" ,string ),
331+ errdetail ("Specified array dimensions do not match array contents." )));
320332}
321333}
322334
@@ -446,7 +458,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
446458/* Signal a premature end of the string */
447459ereport (ERROR ,
448460(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
449- errmsg ("malformed array literal: \"%s\"" ,str )));
461+ errmsg ("malformed array literal: \"%s\"" ,str ),
462+ errdetail ("Unexpected end of input." )));
450463break ;
451464case '\\' :
452465
@@ -461,7 +474,9 @@ ArrayCount(const char *str, int *dim, char typdelim)
461474parse_state != ARRAY_ELEM_DELIMITED )
462475ereport (ERROR ,
463476(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
464- errmsg ("malformed array literal: \"%s\"" ,str )));
477+ errmsg ("malformed array literal: \"%s\"" ,str ),
478+ errdetail ("Unexpected \"%c\" character." ,
479+ '\\' )));
465480if (parse_state != ARRAY_QUOTED_ELEM_STARTED )
466481parse_state = ARRAY_ELEM_STARTED ;
467482/* skip the escaped character */
@@ -470,7 +485,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
470485else
471486ereport (ERROR ,
472487(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
473- errmsg ("malformed array literal: \"%s\"" ,str )));
488+ errmsg ("malformed array literal: \"%s\"" ,str ),
489+ errdetail ("Unexpected end of input." )));
474490break ;
475491case '\"' :
476492
@@ -484,7 +500,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
484500parse_state != ARRAY_ELEM_DELIMITED )
485501ereport (ERROR ,
486502(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
487- errmsg ("malformed array literal: \"%s\"" ,str )));
503+ errmsg ("malformed array literal: \"%s\"" ,str ),
504+ errdetail ("Unexpected array element." )));
488505in_quotes = !in_quotes ;
489506if (in_quotes )
490507parse_state = ARRAY_QUOTED_ELEM_STARTED ;
@@ -504,7 +521,9 @@ ArrayCount(const char *str, int *dim, char typdelim)
504521parse_state != ARRAY_LEVEL_DELIMITED )
505522ereport (ERROR ,
506523 (errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
507- errmsg ("malformed array literal: \"%s\"" ,str )));
524+ errmsg ("malformed array literal: \"%s\"" ,str ),
525+ errdetail ("Unexpected \"%c\" character." ,
526+ '{' )));
508527parse_state = ARRAY_LEVEL_STARTED ;
509528if (nest_level >=MAXDIM )
510529ereport (ERROR ,
@@ -532,21 +551,25 @@ ArrayCount(const char *str, int *dim, char typdelim)
532551!(nest_level == 1 && parse_state == ARRAY_LEVEL_STARTED ))
533552ereport (ERROR ,
534553 (errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
535- errmsg ("malformed array literal: \"%s\"" ,str )));
554+ errmsg ("malformed array literal: \"%s\"" ,str ),
555+ errdetail ("Unexpected \"%c\" character." ,
556+ '}' )));
536557parse_state = ARRAY_LEVEL_COMPLETED ;
537558if (nest_level == 0 )
538559ereport (ERROR ,
539560 (errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
540- errmsg ("malformed array literal: \"%s\"" ,str )));
561+ errmsg ("malformed array literal: \"%s\"" ,str ),
562+ errdetail ("Unmatched \"%c\" character." ,'}' )));
541563nest_level -- ;
542564
543565if (nelems_last [nest_level ]!= 0 &&
544566nelems [nest_level ]!= nelems_last [nest_level ])
545567ereport (ERROR ,
546568 (errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
547- errmsg ("multidimensional arrays must have "
548- "array expressions with matching "
549- "dimensions" )));
569+ errmsg ("malformed array literal: \"%s\"" ,str ),
570+ errdetail ("Multidimensional arrays must have "
571+ "sub-arrays with matching "
572+ "dimensions." )));
550573nelems_last [nest_level ]= nelems [nest_level ];
551574nelems [nest_level ]= 1 ;
552575if (nest_level == 0 )
@@ -577,7 +600,9 @@ ArrayCount(const char *str, int *dim, char typdelim)
577600parse_state != ARRAY_LEVEL_COMPLETED )
578601ereport (ERROR ,
579602(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
580- errmsg ("malformed array literal: \"%s\"" ,str )));
603+ errmsg ("malformed array literal: \"%s\"" ,str ),
604+ errdetail ("Unexpected \"%c\" character." ,
605+ typdelim )));
581606if (parse_state == ARRAY_LEVEL_COMPLETED )
582607parse_state = ARRAY_LEVEL_DELIMITED ;
583608else
@@ -598,7 +623,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
598623parse_state != ARRAY_ELEM_DELIMITED )
599624ereport (ERROR ,
600625(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
601- errmsg ("malformed array literal: \"%s\"" ,str )));
626+ errmsg ("malformed array literal: \"%s\"" ,str ),
627+ errdetail ("Unexpected array element." )));
602628parse_state = ARRAY_ELEM_STARTED ;
603629}
604630}
@@ -617,7 +643,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
617643if (!array_isspace (* ptr ++ ))
618644ereport (ERROR ,
619645(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
620- errmsg ("malformed array literal: \"%s\"" ,str )));
646+ errmsg ("malformed array literal: \"%s\"" ,str ),
647+ errdetail ("Junk after closing right brace." )));
621648}
622649
623650/* special case for an empty array */
@@ -704,7 +731,8 @@ ReadArrayStr(char *arrayStr,
704731 * character.
705732 *
706733 * The error checking in this routine is mostly pro-forma, since we expect
707- * that ArrayCount() already validated the string.
734+ * that ArrayCount() already validated the string. So we don't bother
735+ * with errdetail messages.
708736 */
709737srcptr = arrayStr ;
710738while (!eoArray )