@@ -247,23 +247,27 @@ array_in(PG_FUNCTION_ARGS)
247247errmsg ("number of array dimensions (%d) exceeds the maximum allowed (%d)" ,
248248ndim + 1 ,MAXDIM )));
249249
250- for (q = p ;isdigit ((unsignedchar )* q )|| (* q == '-' )|| (* q == '+' );q ++ );
250+ for (q = p ;isdigit ((unsignedchar )* q )|| (* q == '-' )|| (* q == '+' );q ++ )
251+ /* skip */ ;
251252if (q == p )/* no digits? */
252253ereport (ERROR ,
253254(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
254- errmsg ("missing dimension value" )));
255+ errmsg ("malformed array literal: \"%s\"" ,string ),
256+ errdetail ("\"[\" must introduce explicitly-specified array dimensions." )));
255257
256258if (* q == ':' )
257259{
258260/* [m:n] format */
259261* q = '\0' ;
260262lBound [ndim ]= atoi (p );
261263p = q + 1 ;
262- for (q = p ;isdigit ((unsignedchar )* q )|| (* q == '-' )|| (* q == '+' );q ++ );
264+ for (q = p ;isdigit ((unsignedchar )* q )|| (* q == '-' )|| (* q == '+' );q ++ )
265+ /* skip */ ;
263266if (q == p )/* no digits? */
264267ereport (ERROR ,
265268(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
266- errmsg ("missing dimension value" )));
269+ errmsg ("malformed array literal: \"%s\"" ,string ),
270+ errdetail ("Missing array dimension value." )));
267271}
268272else
269273{
@@ -273,7 +277,9 @@ array_in(PG_FUNCTION_ARGS)
273277if (* q != ']' )
274278ereport (ERROR ,
275279(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
276- errmsg ("missing \"]\" in array dimensions" )));
280+ errmsg ("malformed array literal: \"%s\"" ,string ),
281+ errdetail ("Missing \"%s\" after array dimensions." ,
282+ "]" )));
277283
278284* q = '\0' ;
279285ub = atoi (p );
@@ -293,7 +299,8 @@ array_in(PG_FUNCTION_ARGS)
293299if (* p != '{' )
294300ereport (ERROR ,
295301(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
296- errmsg ("array value must start with \"{\" or dimension information" )));
302+ errmsg ("malformed array literal: \"%s\"" ,string ),
303+ errdetail ("Array value must start with \"{\" or dimension information." )));
297304ndim = ArrayCount (p ,dim ,typdelim );
298305for (i = 0 ;i < ndim ;i ++ )
299306lBound [i ]= 1 ;
@@ -307,7 +314,9 @@ array_in(PG_FUNCTION_ARGS)
307314if (strncmp (p ,ASSGN ,strlen (ASSGN ))!= 0 )
308315ereport (ERROR ,
309316(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
310- errmsg ("missing assignment operator" )));
317+ errmsg ("malformed array literal: \"%s\"" ,string ),
318+ errdetail ("Missing \"%s\" after array dimensions." ,
319+ ASSGN )));
311320p += strlen (ASSGN );
312321while (array_isspace (* p ))
313322p ++ ;
@@ -319,18 +328,21 @@ array_in(PG_FUNCTION_ARGS)
319328if (* p != '{' )
320329ereport (ERROR ,
321330(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
322- errmsg ("array value must start with \"{\" or dimension information" )));
331+ errmsg ("malformed array literal: \"%s\"" ,string ),
332+ errdetail ("Array contents must start with \"{\"." )));
323333ndim_braces = ArrayCount (p ,dim_braces ,typdelim );
324334if (ndim_braces != ndim )
325335ereport (ERROR ,
326336(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
327- errmsg ("array dimensions incompatible with array literal" )));
337+ errmsg ("malformed array literal: \"%s\"" ,string ),
338+ errdetail ("Specified array dimensions do not match array contents." )));
328339for (i = 0 ;i < ndim ;++ i )
329340{
330341if (dim [i ]!= dim_braces [i ])
331342ereport (ERROR ,
332343(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
333- errmsg ("array dimensions incompatible with array literal" )));
344+ errmsg ("malformed array literal: \"%s\"" ,string ),
345+ errdetail ("Specified array dimensions do not match array contents." )));
334346}
335347}
336348
@@ -460,7 +472,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
460472/* Signal a premature end of the string */
461473ereport (ERROR ,
462474(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
463- errmsg ("malformed array literal: \"%s\"" ,str )));
475+ errmsg ("malformed array literal: \"%s\"" ,str ),
476+ errdetail ("Unexpected end of input." )));
464477break ;
465478case '\\' :
466479
@@ -475,7 +488,9 @@ ArrayCount(const char *str, int *dim, char typdelim)
475488parse_state != ARRAY_ELEM_DELIMITED )
476489ereport (ERROR ,
477490(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
478- errmsg ("malformed array literal: \"%s\"" ,str )));
491+ errmsg ("malformed array literal: \"%s\"" ,str ),
492+ errdetail ("Unexpected \"%c\" character." ,
493+ '\\' )));
479494if (parse_state != ARRAY_QUOTED_ELEM_STARTED )
480495parse_state = ARRAY_ELEM_STARTED ;
481496/* skip the escaped character */
@@ -484,7 +499,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
484499else
485500ereport (ERROR ,
486501(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
487- errmsg ("malformed array literal: \"%s\"" ,str )));
502+ errmsg ("malformed array literal: \"%s\"" ,str ),
503+ errdetail ("Unexpected end of input." )));
488504break ;
489505case '\"' :
490506
@@ -498,7 +514,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
498514parse_state != ARRAY_ELEM_DELIMITED )
499515ereport (ERROR ,
500516(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
501- errmsg ("malformed array literal: \"%s\"" ,str )));
517+ errmsg ("malformed array literal: \"%s\"" ,str ),
518+ errdetail ("Unexpected array element." )));
502519in_quotes = !in_quotes ;
503520if (in_quotes )
504521parse_state = ARRAY_QUOTED_ELEM_STARTED ;
@@ -518,7 +535,9 @@ ArrayCount(const char *str, int *dim, char typdelim)
518535parse_state != ARRAY_LEVEL_DELIMITED )
519536ereport (ERROR ,
520537 (errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
521- errmsg ("malformed array literal: \"%s\"" ,str )));
538+ errmsg ("malformed array literal: \"%s\"" ,str ),
539+ errdetail ("Unexpected \"%c\" character." ,
540+ '{' )));
522541parse_state = ARRAY_LEVEL_STARTED ;
523542if (nest_level >=MAXDIM )
524543ereport (ERROR ,
@@ -546,21 +565,25 @@ ArrayCount(const char *str, int *dim, char typdelim)
546565!(nest_level == 1 && parse_state == ARRAY_LEVEL_STARTED ))
547566ereport (ERROR ,
548567 (errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
549- errmsg ("malformed array literal: \"%s\"" ,str )));
568+ errmsg ("malformed array literal: \"%s\"" ,str ),
569+ errdetail ("Unexpected \"%c\" character." ,
570+ '}' )));
550571parse_state = ARRAY_LEVEL_COMPLETED ;
551572if (nest_level == 0 )
552573ereport (ERROR ,
553574 (errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
554- errmsg ("malformed array literal: \"%s\"" ,str )));
575+ errmsg ("malformed array literal: \"%s\"" ,str ),
576+ errdetail ("Unmatched \"%c\" character." ,'}' )));
555577nest_level -- ;
556578
557579if (nelems_last [nest_level ]!= 0 &&
558580nelems [nest_level ]!= nelems_last [nest_level ])
559581ereport (ERROR ,
560582 (errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
561- errmsg ("multidimensional arrays must have "
562- "array expressions with matching "
563- "dimensions" )));
583+ errmsg ("malformed array literal: \"%s\"" ,str ),
584+ errdetail ("Multidimensional arrays must have "
585+ "sub-arrays with matching "
586+ "dimensions." )));
564587nelems_last [nest_level ]= nelems [nest_level ];
565588nelems [nest_level ]= 1 ;
566589if (nest_level == 0 )
@@ -591,7 +614,9 @@ ArrayCount(const char *str, int *dim, char typdelim)
591614parse_state != ARRAY_LEVEL_COMPLETED )
592615ereport (ERROR ,
593616(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
594- errmsg ("malformed array literal: \"%s\"" ,str )));
617+ errmsg ("malformed array literal: \"%s\"" ,str ),
618+ errdetail ("Unexpected \"%c\" character." ,
619+ typdelim )));
595620if (parse_state == ARRAY_LEVEL_COMPLETED )
596621parse_state = ARRAY_LEVEL_DELIMITED ;
597622else
@@ -612,7 +637,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
612637parse_state != ARRAY_ELEM_DELIMITED )
613638ereport (ERROR ,
614639(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
615- errmsg ("malformed array literal: \"%s\"" ,str )));
640+ errmsg ("malformed array literal: \"%s\"" ,str ),
641+ errdetail ("Unexpected array element." )));
616642parse_state = ARRAY_ELEM_STARTED ;
617643}
618644}
@@ -631,7 +657,8 @@ ArrayCount(const char *str, int *dim, char typdelim)
631657if (!array_isspace (* ptr ++ ))
632658ereport (ERROR ,
633659(errcode (ERRCODE_INVALID_TEXT_REPRESENTATION ),
634- errmsg ("malformed array literal: \"%s\"" ,str )));
660+ errmsg ("malformed array literal: \"%s\"" ,str ),
661+ errdetail ("Junk after closing right brace." )));
635662}
636663
637664/* special case for an empty array */
@@ -718,7 +745,8 @@ ReadArrayStr(char *arrayStr,
718745 * character.
719746 *
720747 * The error checking in this routine is mostly pro-forma, since we expect
721- * that ArrayCount() already validated the string.
748+ * that ArrayCount() already validated the string. So we don't bother
749+ * with errdetail messages.
722750 */
723751srcptr = arrayStr ;
724752while (!eoArray )