diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 743351b..933c6b0 100644
*** a/src/backend/utils/adt/arrayfuncs.c
--- b/src/backend/utils/adt/arrayfuncs.c
*************** array_in(PG_FUNCTION_ARGS)
*** 247,257 ****
  					 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? */
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("missing dimension value")));
  
  		if (*q == ':')
  		{
--- 247,259 ----
  					 errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)",
  							ndim + 1, MAXDIM)));
  
! 		for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++)
! 			 /* skip */ ;
  		if (q == p)				/* no digits? */
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("malformed array literal: \"%s\"", string),
! 					 errdetail("\"[\" must introduce explicitly-specified array dimensions.")));
  
  		if (*q == ':')
  		{
*************** array_in(PG_FUNCTION_ARGS)
*** 259,269 ****
  			*q = '\0';
  			lBound[ndim] = atoi(p);
  			p = q + 1;
! 			for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++);
  			if (q == p)			/* no digits? */
  				ereport(ERROR,
  						(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 						 errmsg("missing dimension value")));
  		}
  		else
  		{
--- 261,273 ----
  			*q = '\0';
  			lBound[ndim] = atoi(p);
  			p = q + 1;
! 			for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++)
! 				 /* skip */ ;
  			if (q == p)			/* no digits? */
  				ereport(ERROR,
  						(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 						 errmsg("malformed array literal: \"%s\"", string),
! 						 errdetail("Missing array dimension value.")));
  		}
  		else
  		{
*************** array_in(PG_FUNCTION_ARGS)
*** 273,279 ****
  		if (*q != ']')
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("missing \"]\" in array dimensions")));
  
  		*q = '\0';
  		ub = atoi(p);
--- 277,285 ----
  		if (*q != ']')
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("malformed array literal: \"%s\"", string),
! 					 errdetail("Missing \"%s\" after array dimensions.",
! 							   "]")));
  
  		*q = '\0';
  		ub = atoi(p);
*************** array_in(PG_FUNCTION_ARGS)
*** 293,299 ****
  		if (*p != '{')
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("array value must start with \"{\" or dimension information")));
  		ndim = ArrayCount(p, dim, typdelim);
  		for (i = 0; i < ndim; i++)
  			lBound[i] = 1;
--- 299,306 ----
  		if (*p != '{')
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("malformed array literal: \"%s\"", string),
! 					 errdetail("Array value must start with \"{\" or dimension information.")));
  		ndim = ArrayCount(p, dim, typdelim);
  		for (i = 0; i < ndim; i++)
  			lBound[i] = 1;
*************** array_in(PG_FUNCTION_ARGS)
*** 307,313 ****
  		if (strncmp(p, ASSGN, strlen(ASSGN)) != 0)
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("missing assignment operator")));
  		p += strlen(ASSGN);
  		while (array_isspace(*p))
  			p++;
--- 314,322 ----
  		if (strncmp(p, ASSGN, strlen(ASSGN)) != 0)
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("malformed array literal: \"%s\"", string),
! 					 errdetail("Missing \"%s\" after array dimensions.",
! 							   ASSGN)));
  		p += strlen(ASSGN);
  		while (array_isspace(*p))
  			p++;
*************** array_in(PG_FUNCTION_ARGS)
*** 319,336 ****
  		if (*p != '{')
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("array value must start with \"{\" or dimension information")));
  		ndim_braces = ArrayCount(p, dim_braces, typdelim);
  		if (ndim_braces != ndim)
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 				errmsg("array dimensions incompatible with array literal")));
  		for (i = 0; i < ndim; ++i)
  		{
  			if (dim[i] != dim_braces[i])
  				ereport(ERROR,
  						(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 				errmsg("array dimensions incompatible with array literal")));
  		}
  	}
  
--- 328,348 ----
  		if (*p != '{')
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("malformed array literal: \"%s\"", string),
! 					 errdetail("Array contents must start with \"{\".")));
  		ndim_braces = ArrayCount(p, dim_braces, typdelim);
  		if (ndim_braces != ndim)
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("malformed array literal: \"%s\"", string),
! 					 errdetail("Specified array dimensions do not match array contents.")));
  		for (i = 0; i < ndim; ++i)
  		{
  			if (dim[i] != dim_braces[i])
  				ereport(ERROR,
  						(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 						 errmsg("malformed array literal: \"%s\"", string),
! 						 errdetail("Specified array dimensions do not match array contents.")));
  		}
  	}
  
*************** ArrayCount(const char *str, int *dim, ch
*** 460,466 ****
  					/* Signal a premature end of the string */
  					ereport(ERROR,
  							(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							 errmsg("malformed array literal: \"%s\"", str)));
  					break;
  				case '\\':
  
--- 472,479 ----
  					/* Signal a premature end of the string */
  					ereport(ERROR,
  							(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							 errmsg("malformed array literal: \"%s\"", str),
! 							 errdetail("Unexpected end of input.")));
  					break;
  				case '\\':
  
*************** ArrayCount(const char *str, int *dim, ch
*** 475,481 ****
  						parse_state != ARRAY_ELEM_DELIMITED)
  						ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							errmsg("malformed array literal: \"%s\"", str)));
  					if (parse_state != ARRAY_QUOTED_ELEM_STARTED)
  						parse_state = ARRAY_ELEM_STARTED;
  					/* skip the escaped character */
--- 488,496 ----
  						parse_state != ARRAY_ELEM_DELIMITED)
  						ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							  errmsg("malformed array literal: \"%s\"", str),
! 								 errdetail("Unexpected \"%c\" character.",
! 										   '\\')));
  					if (parse_state != ARRAY_QUOTED_ELEM_STARTED)
  						parse_state = ARRAY_ELEM_STARTED;
  					/* skip the escaped character */
*************** ArrayCount(const char *str, int *dim, ch
*** 484,490 ****
  					else
  						ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							errmsg("malformed array literal: \"%s\"", str)));
  					break;
  				case '\"':
  
--- 499,506 ----
  					else
  						ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							  errmsg("malformed array literal: \"%s\"", str),
! 								 errdetail("Unexpected end of input.")));
  					break;
  				case '\"':
  
*************** ArrayCount(const char *str, int *dim, ch
*** 498,504 ****
  						parse_state != ARRAY_ELEM_DELIMITED)
  						ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							errmsg("malformed array literal: \"%s\"", str)));
  					in_quotes = !in_quotes;
  					if (in_quotes)
  						parse_state = ARRAY_QUOTED_ELEM_STARTED;
--- 514,521 ----
  						parse_state != ARRAY_ELEM_DELIMITED)
  						ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							  errmsg("malformed array literal: \"%s\"", str),
! 								 errdetail("Unexpected array element.")));
  					in_quotes = !in_quotes;
  					if (in_quotes)
  						parse_state = ARRAY_QUOTED_ELEM_STARTED;
*************** ArrayCount(const char *str, int *dim, ch
*** 518,524 ****
  							parse_state != ARRAY_LEVEL_DELIMITED)
  							ereport(ERROR,
  							   (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							errmsg("malformed array literal: \"%s\"", str)));
  						parse_state = ARRAY_LEVEL_STARTED;
  						if (nest_level >= MAXDIM)
  							ereport(ERROR,
--- 535,543 ----
  							parse_state != ARRAY_LEVEL_DELIMITED)
  							ereport(ERROR,
  							   (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							  errmsg("malformed array literal: \"%s\"", str),
! 								errdetail("Unexpected \"%c\" character.",
! 										  '{')));
  						parse_state = ARRAY_LEVEL_STARTED;
  						if (nest_level >= MAXDIM)
  							ereport(ERROR,
*************** ArrayCount(const char *str, int *dim, ch
*** 546,566 ****
  							!(nest_level == 1 && parse_state == ARRAY_LEVEL_STARTED))
  							ereport(ERROR,
  							   (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							errmsg("malformed array literal: \"%s\"", str)));
  						parse_state = ARRAY_LEVEL_COMPLETED;
  						if (nest_level == 0)
  							ereport(ERROR,
  							   (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							errmsg("malformed array literal: \"%s\"", str)));
  						nest_level--;
  
  						if (nelems_last[nest_level] != 0 &&
  							nelems[nest_level] != nelems_last[nest_level])
  							ereport(ERROR,
  							   (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 								errmsg("multidimensional arrays must have "
! 									   "array expressions with matching "
! 									   "dimensions")));
  						nelems_last[nest_level] = nelems[nest_level];
  						nelems[nest_level] = 1;
  						if (nest_level == 0)
--- 565,589 ----
  							!(nest_level == 1 && parse_state == ARRAY_LEVEL_STARTED))
  							ereport(ERROR,
  							   (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							  errmsg("malformed array literal: \"%s\"", str),
! 								errdetail("Unexpected \"%c\" character.",
! 										  '}')));
  						parse_state = ARRAY_LEVEL_COMPLETED;
  						if (nest_level == 0)
  							ereport(ERROR,
  							   (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							  errmsg("malformed array literal: \"%s\"", str),
! 							 errdetail("Unmatched \"%c\" character.", '}')));
  						nest_level--;
  
  						if (nelems_last[nest_level] != 0 &&
  							nelems[nest_level] != nelems_last[nest_level])
  							ereport(ERROR,
  							   (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 							  errmsg("malformed array literal: \"%s\"", str),
! 								errdetail("Multidimensional arrays must have "
! 										  "sub-arrays with matching "
! 										  "dimensions.")));
  						nelems_last[nest_level] = nelems[nest_level];
  						nelems[nest_level] = 1;
  						if (nest_level == 0)
*************** ArrayCount(const char *str, int *dim, ch
*** 591,597 ****
  								parse_state != ARRAY_LEVEL_COMPLETED)
  								ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 								 errmsg("malformed array literal: \"%s\"", str)));
  							if (parse_state == ARRAY_LEVEL_COMPLETED)
  								parse_state = ARRAY_LEVEL_DELIMITED;
  							else
--- 614,622 ----
  								parse_state != ARRAY_LEVEL_COMPLETED)
  								ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 								 errmsg("malformed array literal: \"%s\"", str),
! 								 errdetail("Unexpected \"%c\" character.",
! 										   typdelim)));
  							if (parse_state == ARRAY_LEVEL_COMPLETED)
  								parse_state = ARRAY_LEVEL_DELIMITED;
  							else
*************** ArrayCount(const char *str, int *dim, ch
*** 612,618 ****
  								parse_state != ARRAY_ELEM_DELIMITED)
  								ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 								 errmsg("malformed array literal: \"%s\"", str)));
  							parse_state = ARRAY_ELEM_STARTED;
  						}
  					}
--- 637,644 ----
  								parse_state != ARRAY_ELEM_DELIMITED)
  								ereport(ERROR,
  								(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 								 errmsg("malformed array literal: \"%s\"", str),
! 								 errdetail("Unexpected array element.")));
  							parse_state = ARRAY_ELEM_STARTED;
  						}
  					}
*************** ArrayCount(const char *str, int *dim, ch
*** 631,637 ****
  		if (!array_isspace(*ptr++))
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("malformed array literal: \"%s\"", str)));
  	}
  
  	/* special case for an empty array */
--- 657,664 ----
  		if (!array_isspace(*ptr++))
  			ereport(ERROR,
  					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
! 					 errmsg("malformed array literal: \"%s\"", str),
! 					 errdetail("Junk after closing right brace.")));
  	}
  
  	/* special case for an empty array */
*************** ReadArrayStr(char *arrayStr,
*** 718,724 ****
  	 * character.
  	 *
  	 * The error checking in this routine is mostly pro-forma, since we expect
! 	 * that ArrayCount() already validated the string.
  	 */
  	srcptr = arrayStr;
  	while (!eoArray)
--- 745,752 ----
  	 * character.
  	 *
  	 * The error checking in this routine is mostly pro-forma, since we expect
! 	 * that ArrayCount() already validated the string.  So we don't bother
! 	 * with errdetail messages.
  	 */
  	srcptr = arrayStr;
  	while (!eoArray)
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index cb606af..d33c9b9 100644
*** a/src/test/regress/expected/arrays.out
--- b/src/test/regress/expected/arrays.out
*************** select '{{1,{2}},{2,3}}'::text[];
*** 1065,1090 ****
--- 1065,1096 ----
  ERROR:  malformed array literal: "{{1,{2}},{2,3}}"
  LINE 1: select '{{1,{2}},{2,3}}'::text[];
                 ^
+ DETAIL:  Unexpected "{" character.
  select '{{},{}}'::text[];
  ERROR:  malformed array literal: "{{},{}}"
  LINE 1: select '{{},{}}'::text[];
                 ^
+ DETAIL:  Unexpected "}" character.
  select E'{{1,2},\\{2,3}}'::text[];
  ERROR:  malformed array literal: "{{1,2},\{2,3}}"
  LINE 1: select E'{{1,2},\\{2,3}}'::text[];
                 ^
+ DETAIL:  Unexpected "\" character.
  select '{{"1 2" x},{3}}'::text[];
  ERROR:  malformed array literal: "{{"1 2" x},{3}}"
  LINE 1: select '{{"1 2" x},{3}}'::text[];
                 ^
+ DETAIL:  Unexpected array element.
  select '{}}'::text[];
  ERROR:  malformed array literal: "{}}"
  LINE 1: select '{}}'::text[];
                 ^
+ DETAIL:  Junk after closing right brace.
  select '{ }}'::text[];
  ERROR:  malformed array literal: "{ }}"
  LINE 1: select '{ }}'::text[];
                 ^
+ DETAIL:  Junk after closing right brace.
  select array[];
  ERROR:  cannot determine type of empty array
  LINE 1: select array[];
