-<!-- $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>
</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]
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>
<!--
-$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
-->
</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>
* 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 $
*
*-------------------------------------------------------------------------
*/
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);
}
{
/*
* 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));
/* 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++)
{
(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}";
(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}}";
(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}";
(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