diff --git a/doc/src/sgml/array.sgml b/doc/src/sgml/array.sgml
index c24646e43ca22d63db890e9765d63b229cdbf8ab..9255144999d6291afc93e192a06bce773e6b5f2a 100644
--- a/doc/src/sgml/array.sgml
+++ b/doc/src/sgml/array.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/array.sgml,v 1.47 2005/11/17 22:14:50 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/array.sgml,v 1.48 2005/11/19 01:50:08 tgl Exp $ -->
 
 <sect1 id="arrays">
  <title>Arrays</title>
@@ -391,13 +391,11 @@ SELECT ARRAY[5,6] || ARRAY[[1,2],[3,4]];
  </para>
 
  <para>
-  When a single element is pushed on to the beginning of a one-dimensional
-  array, the result is an array with a lower bound subscript equal to
-  the right-hand operand's lower bound subscript, minus one. When a single
-  element is pushed on to the end of a one-dimensional array, the result is
-  an array retaining the lower bound of the left-hand operand. For example:
+  When a single element is pushed on to either the beginning or end of a
+  one-dimensional array, the result is an array with the same lower bound
+  subscript as the array operand. For example:
 <programlisting>
-SELECT array_dims(1 || ARRAY[2,3]);
+SELECT array_dims(1 || '[0:1]={2,3}'::int[]);
  array_dims
 ------------
  [0:2]
@@ -441,7 +439,7 @@ SELECT array_dims(ARRAY[[1,2],[3,4]] || ARRAY[[5,6],[7,8],[9,0]]);
 SELECT array_dims(ARRAY[1,2] || ARRAY[[3,4],[5,6]]);
  array_dims
 ------------
- [0:2][1:2]
+ [1:3][1:2]
 (1 row)
 </programlisting>
  </para>
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 8bc963b02ff3a145564557e45fa9cc4e3b0b87c3..c0e364a30b87cca1c754d826b2e6cbc81ac68e47 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.293 2005/11/17 22:14:50 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.294 2005/11/19 01:50:08 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -7484,7 +7484,7 @@ SELECT NULLIF(value, '(none)') ...
     </entry>
         <entry><type>int</type></entry>
         <entry>returns lower bound of the requested array dimension</entry>
-        <entry><literal>array_lower(array_prepend(0, ARRAY[1,2,3]), 1)</literal></entry>
+        <entry><literal>array_lower('[0:2]={1,2,3}'::int[], 1)</literal></entry>
         <entry><literal>0</literal></entry>
        </row>
        <row>
diff --git a/src/backend/utils/adt/array_userfuncs.c b/src/backend/utils/adt/array_userfuncs.c
index 468e444e139c4e5839e2008ea4a83d9de183f1c2..e1fc3f26db06be33033492fab772fd0851a8c823 100644
--- a/src/backend/utils/adt/array_userfuncs.c
+++ b/src/backend/utils/adt/array_userfuncs.c
@@ -6,7 +6,7 @@
  * Copyright (c) 2003-2005, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/array_userfuncs.c,v 1.17 2005/11/17 22:14:52 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/array_userfuncs.c,v 1.18 2005/11/19 01:50:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -152,6 +152,13 @@ array_push(PG_FUNCTION_ARGS)
 	result = array_set(v, 1, &indx, newelem, isNull,
 					   -1, typlen, typbyval, typalign);
 
+	/*
+	 * Readjust result's LB to match the input's.  This does nothing in the
+	 * append case, but it's the simplest way to implement the prepend case.
+	 */
+	if (ARR_NDIM(v) == 1)
+		ARR_LBOUND(result)[0] = ARR_LBOUND(v)[0];
+
 	PG_RETURN_ARRAYTYPE_P(result);
 }
 
@@ -305,7 +312,7 @@ array_cat(PG_FUNCTION_ARGS)
 	{
 		/*
 		 * resulting array has the second argument as the outer array, with
-		 * the first argument appended to the front of the outer dimension
+		 * the first argument inserted at the front of the outer dimension
 		 */
 		ndims = ndims2;
 		dims = (int *) palloc(ndims * sizeof(int));
@@ -316,9 +323,6 @@ array_cat(PG_FUNCTION_ARGS)
 		/* increment number of elements in outer array */
 		dims[0] += 1;
 
-		/* decrement outer array lower bound */
-		lbs[0] -= 1;
-
 		/* make sure the added element matches our existing elements */
 		for (i = 0; i < ndims1; i++)
 		{
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index da218f0047c7f0e1438d93fb9e0ed7580b52699e..11b83ea993618f80c30b77c8871ac3368af6d5d0 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -224,9 +224,9 @@ SELECT array_append(array[42], 6) AS "{42,6}";
 (1 row)
 
 SELECT array_prepend(6, array[42]) AS "{6,42}";
-    {6,42}    
---------------
- [0:1]={6,42}
+ {6,42} 
+--------
+ {6,42}
 (1 row)
 
 SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}";
@@ -236,9 +236,9 @@ SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}";
 (1 row)
 
 SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}";
-      {{1,2},{3,4},{5,6}}       
---------------------------------
- [0:2][1:2]={{1,2},{3,4},{5,6}}
+ {{1,2},{3,4},{5,6}} 
+---------------------
+ {{1,2},{3,4},{5,6}}
 (1 row)
 
 SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}";
@@ -267,9 +267,9 @@ SELECT ARRAY[1,2] || 3 AS "{1,2,3}";
 (1 row)
 
 SELECT 0 || ARRAY[1,2] AS "{0,1,2}";
-    {0,1,2}    
----------------
- [0:2]={0,1,2}
+ {0,1,2} 
+---------
+ {0,1,2}
 (1 row)
 
 SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}";
@@ -297,9 +297,9 @@ SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}";
 (1 row)
 
 SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}";
-    {0,1,2,3}    
------------------
- [0:3]={0,1,2,3}
+ {0,1,2,3} 
+-----------
+ {0,1,2,3}
 (1 row)
 
 -- array casts