Re: array concat, et al patch (was: [GENERAL] join of array) - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: array concat, et al patch (was: [GENERAL] join of array) |
Date | |
Msg-id | 200308261837.h7QIbqD02928@candle.pha.pa.us Whole thread Raw |
In response to | array concat, et al patch (was: [GENERAL] join of array) (Joe Conway <mail@joeconway.com>) |
List | pgsql-patches |
Tom applied this patch. Thanks. --------------------------------------------------------------------------- Joe Conway wrote: > Tom Lane wrote: > > Could you look at how big a change it'd be, anyway? Offhand I think it > > may just mean that the subscript-checking done in parse_expr.c needs to > > be done at runtime instead. Remember parse_expr should only be > > concerned about determining datatype, and for its purposes all arrays of > > a given element type are the same --- subscript checking should happen > > at runtime. (It seems likely that having an ndims field in ArrayExpr > > is inappropriate.) > > The attached patch fixes code and regression tests for the following > (docs to follow once applied): > > ======================================================================== > 1) Array concatenation of equidimensional arrays: > ======================================================================== > regression=# select ARRAY[1,2] || ARRAY[3,4]; > ?column? > ----------- > {1,2,3,4} > (1 row) > > regression=# select ARRAY[[1],[2],[3]] || ARRAY[[4],[5]]; > ?column? > ----------------------- > {{1},{2},{3},{4},{5}} > (1 row) > > regression=# select ARRAY[[1,2],[2,3],[3,4]] || ARRAY[[4,5],[5,6]]; > ?column? > --------------------------------- > {{1,2},{2,3},{3,4},{4,5},{5,6}} > (1 row) > > > ======================================================================== > 2) Array literals or vars in ARRAY expressions: > ======================================================================== > regression=# create table arr(f1 int[], f2 int[]); > CREATE TABLE > regression=# insert into arr values (ARRAY[[1,2],[3,4]],ARRAY[[5,6],[7,8]]); > INSERT 2635544 1 > regression=# select ARRAY[f1,f2] from arr; > array > ------------------------------- > {{{1,2},{3,4}},{{5,6},{7,8}}} > (1 row) > > regression=# select ARRAY['{{1,2},{3,4}}'::int[],'{{5,6},{7,8}}'::int[]]; > array > ------------------------------- > {{{1,2},{3,4}},{{5,6},{7,8}}} > (1 row) > > > ======================================================================== > 3) Lower bound of outer array adjusted downward when an "element" (which > could itself be an array) is concatenated onto the front of an array: > ======================================================================== > regression=# create table arr(f1 int[]); > CREATE TABLE > regression=# insert into arr values ('{}'); > INSERT 2635538 1 > regression=# update arr set f1[-2] = 1; > UPDATE 1 > regression=# select array_lower(f1,1) from arr; > array_lower > ------------- > -2 > (1 row) > > regression=# select array_lower(f1 || 2, 1) from arr; > array_lower > ------------- > -2 > (1 row) > > regression=# select array_lower(0 || f1, 1) from arr; > array_lower > ------------- > -3 > (1 row) > > regression=# update arr set f1 = ARRAY[[1,2],[3,4]]; > UPDATE 1 > regression=# select array_lower(f1,1) from arr; > array_lower > ------------- > 1 > (1 row) > > regression=# select array_lower(f1 || ARRAY[5,6], 1) from arr; > array_lower > ------------- > 1 > (1 row) > > regression=# select array_lower(ARRAY[-1,0] || f1, 1) from arr; > array_lower > ------------- > 0 > (1 row) > > > Compiles without warnings and passes all regression tests. If there are > no objections, please apply. As I mentioned above, docs to follow once > I'm sure what actually ends up being committed. > > Joe > Index: src/backend/executor/execQual.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/executor/execQual.c,v > retrieving revision 1.141 > diff -c -r1.141 execQual.c > *** src/backend/executor/execQual.c 8 Aug 2003 21:41:39 -0000 1.141 > --- src/backend/executor/execQual.c 15 Aug 2003 21:52:30 -0000 > *************** > *** 1620,1635 **** > ArrayType *result; > List *element; > Oid element_type = arrayExpr->element_typeid; > ! int ndims = arrayExpr->ndims; > int dims[MAXDIM]; > int lbs[MAXDIM]; > > ! if (ndims == 1) > { > int nelems; > Datum *dvalues; > int i = 0; > > nelems = length(astate->elements); > > /* Shouldn't happen here, but if length is 0, return NULL */ > --- 1620,1637 ---- > ArrayType *result; > List *element; > Oid element_type = arrayExpr->element_typeid; > ! int ndims = 0; > int dims[MAXDIM]; > int lbs[MAXDIM]; > > ! if (!arrayExpr->multidims) > { > + /* Elements are presumably of scalar type */ > int nelems; > Datum *dvalues; > int i = 0; > > + ndims = 1; > nelems = length(astate->elements); > > /* Shouldn't happen here, but if length is 0, return NULL */ > *************** > *** 1667,1672 **** > --- 1669,1675 ---- > } > else > { > + /* Must be nested array expressions */ > char *dat = NULL; > Size ndatabytes = 0; > int nbytes; > *************** > *** 1677,1688 **** > bool firstone = true; > int i; > > - if (ndims <= 0 || ndims > MAXDIM) > - ereport(ERROR, > - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), > - errmsg("number of array dimensions exceeds the maximum allowed, %d", > - MAXDIM))); > - > /* loop through and get data area from each element */ > foreach(element, astate->elements) > { > --- 1680,1685 ---- > *************** > *** 1705,1714 **** > --- 1702,1719 ---- > { > /* Get sub-array details from first member */ > elem_ndims = ARR_NDIM(array); > + ndims = elem_ndims + 1; > + if (ndims <= 0 || ndims > MAXDIM) > + ereport(ERROR, > + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), > + errmsg("number of array dimensions exceeds " \ > + "the maximum allowed, %d", MAXDIM))); > + > elem_dims = (int *) palloc(elem_ndims * sizeof(int)); > memcpy(elem_dims, ARR_DIMS(array), elem_ndims * sizeof(int)); > elem_lbs = (int *) palloc(elem_ndims * sizeof(int)); > memcpy(elem_lbs, ARR_LBOUND(array), elem_ndims * sizeof(int)); > + > firstone = false; > } > else > Index: src/backend/nodes/copyfuncs.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/nodes/copyfuncs.c,v > retrieving revision 1.263 > diff -c -r1.263 copyfuncs.c > *** src/backend/nodes/copyfuncs.c 8 Aug 2003 21:41:43 -0000 1.263 > --- src/backend/nodes/copyfuncs.c 15 Aug 2003 21:44:30 -0000 > *************** > *** 947,953 **** > COPY_SCALAR_FIELD(array_typeid); > COPY_SCALAR_FIELD(element_typeid); > COPY_NODE_FIELD(elements); > ! COPY_SCALAR_FIELD(ndims); > > return newnode; > } > --- 947,953 ---- > COPY_SCALAR_FIELD(array_typeid); > COPY_SCALAR_FIELD(element_typeid); > COPY_NODE_FIELD(elements); > ! COPY_SCALAR_FIELD(multidims); > > return newnode; > } > Index: src/backend/nodes/equalfuncs.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/nodes/equalfuncs.c,v > retrieving revision 1.207 > diff -c -r1.207 equalfuncs.c > *** src/backend/nodes/equalfuncs.c 8 Aug 2003 21:41:43 -0000 1.207 > --- src/backend/nodes/equalfuncs.c 15 Aug 2003 21:44:44 -0000 > *************** > *** 409,415 **** > COMPARE_SCALAR_FIELD(array_typeid); > COMPARE_SCALAR_FIELD(element_typeid); > COMPARE_NODE_FIELD(elements); > ! COMPARE_SCALAR_FIELD(ndims); > > return true; > } > --- 409,415 ---- > COMPARE_SCALAR_FIELD(array_typeid); > COMPARE_SCALAR_FIELD(element_typeid); > COMPARE_NODE_FIELD(elements); > ! COMPARE_SCALAR_FIELD(multidims); > > return true; > } > Index: src/backend/nodes/outfuncs.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/nodes/outfuncs.c,v > retrieving revision 1.217 > diff -c -r1.217 outfuncs.c > *** src/backend/nodes/outfuncs.c 8 Aug 2003 21:41:44 -0000 1.217 > --- src/backend/nodes/outfuncs.c 15 Aug 2003 21:45:34 -0000 > *************** > *** 785,791 **** > WRITE_OID_FIELD(array_typeid); > WRITE_OID_FIELD(element_typeid); > WRITE_NODE_FIELD(elements); > ! WRITE_INT_FIELD(ndims); > } > > static void > --- 785,791 ---- > WRITE_OID_FIELD(array_typeid); > WRITE_OID_FIELD(element_typeid); > WRITE_NODE_FIELD(elements); > ! WRITE_BOOL_FIELD(multidims); > } > > static void > Index: src/backend/nodes/readfuncs.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/nodes/readfuncs.c,v > retrieving revision 1.161 > diff -c -r1.161 readfuncs.c > *** src/backend/nodes/readfuncs.c 4 Aug 2003 02:39:59 -0000 1.161 > --- src/backend/nodes/readfuncs.c 15 Aug 2003 21:46:05 -0000 > *************** > *** 659,665 **** > READ_OID_FIELD(array_typeid); > READ_OID_FIELD(element_typeid); > READ_NODE_FIELD(elements); > ! READ_INT_FIELD(ndims); > > READ_DONE(); > } > --- 659,665 ---- > READ_OID_FIELD(array_typeid); > READ_OID_FIELD(element_typeid); > READ_NODE_FIELD(elements); > ! READ_BOOL_FIELD(multidims); > > READ_DONE(); > } > Index: src/backend/optimizer/util/clauses.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/optimizer/util/clauses.c,v > retrieving revision 1.152 > diff -c -r1.152 clauses.c > *** src/backend/optimizer/util/clauses.c 8 Aug 2003 21:41:55 -0000 1.152 > --- src/backend/optimizer/util/clauses.c 15 Aug 2003 21:48:03 -0000 > *************** > *** 1515,1521 **** > newarray->array_typeid = arrayexpr->array_typeid; > newarray->element_typeid = arrayexpr->element_typeid; > newarray->elements = FastListValue(&newelems); > ! newarray->ndims = arrayexpr->ndims; > > if (all_const) > return (Node *) evaluate_expr((Expr *) newarray, > --- 1515,1521 ---- > newarray->array_typeid = arrayexpr->array_typeid; > newarray->element_typeid = arrayexpr->element_typeid; > newarray->elements = FastListValue(&newelems); > ! newarray->multidims = arrayexpr->multidims; > > if (all_const) > return (Node *) evaluate_expr((Expr *) newarray, > Index: src/backend/parser/parse_expr.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/parser/parse_expr.c,v > retrieving revision 1.160 > diff -c -r1.160 parse_expr.c > *** src/backend/parser/parse_expr.c 4 Aug 2003 02:40:01 -0000 1.160 > --- src/backend/parser/parse_expr.c 15 Aug 2003 21:38:10 -0000 > *************** > *** 748,754 **** > List *element; > Oid array_type; > Oid element_type; > - int ndims; > > /* Transform the element expressions */ > foreach(element, a->elements) > --- 748,753 ---- > *************** > *** 781,791 **** > if (array_type != InvalidOid) > { > /* Elements are presumably of scalar type */ > ! ndims = 1; > } > else > { > /* Must be nested array expressions */ > array_type = element_type; > element_type = get_element_type(array_type); > if (!OidIsValid(element_type)) > --- 780,792 ---- > if (array_type != InvalidOid) > { > /* Elements are presumably of scalar type */ > ! newa->multidims = false; > } > else > { > /* Must be nested array expressions */ > + newa->multidims = true; > + > array_type = element_type; > element_type = get_element_type(array_type); > if (!OidIsValid(element_type)) > *************** > *** 793,839 **** > (errcode(ERRCODE_UNDEFINED_OBJECT), > errmsg("could not find array type for datatype %s", > format_type_be(array_type)))); > - > - /* > - * make sure the element expressions all have the same > - * number of dimensions > - */ > - ndims = 0; > - foreach(element, newcoercedelems) > - { > - ArrayExpr *e = (ArrayExpr *) lfirst(element); > - > - if (!IsA(e, ArrayExpr)) > - ereport(ERROR, > - (errcode(ERRCODE_SYNTAX_ERROR), > - errmsg("multidimensional ARRAY[] must be built from nested array expressions"))); > - if (ndims == 0) > - ndims = e->ndims; > - else if (e->ndims != ndims) > - ereport(ERROR, > - (errcode(ERRCODE_SYNTAX_ERROR), > - errmsg("nested array expressions must have common number of dimensions"))); > - if (e->element_typeid != element_type) > - ereport(ERROR, > - (errcode(ERRCODE_SYNTAX_ERROR), > - errmsg("nested array expressions must have common element type"))); > - > - } > - /* increment the number of dimensions */ > - ndims++; > - > - /* make sure we don't have too many dimensions now */ > - if (ndims > MAXDIM) > - ereport(ERROR, > - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), > - errmsg("number of array dimensions exceeds the maximum allowed, %d", > - MAXDIM))); > } > > newa->array_typeid = array_type; > newa->element_typeid = element_type; > newa->elements = newcoercedelems; > - newa->ndims = ndims; > > result = (Node *) newa; > break; > --- 794,804 ---- > Index: src/backend/utils/adt/array_userfuncs.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/utils/adt/array_userfuncs.c,v > retrieving revision 1.7 > diff -c -r1.7 array_userfuncs.c > *** src/backend/utils/adt/array_userfuncs.c 4 Aug 2003 00:43:25 -0000 1.7 > --- src/backend/utils/adt/array_userfuncs.c 15 Aug 2003 22:41:12 -0000 > *************** > *** 132,138 **** > > /*----------------------------------------------------------------------------- > * array_cat : > ! * concatenate two nD arrays to form an (n+1)D array, or > * push an (n-1)D array onto the end of an nD array > *---------------------------------------------------------------------------- > */ > --- 132,138 ---- > > /*----------------------------------------------------------------------------- > * array_cat : > ! * concatenate two nD arrays to form an nD array, or > * push an (n-1)D array onto the end of an nD array > *---------------------------------------------------------------------------- > */ > *************** > *** 223,251 **** > if (ndims1 == ndims2) > { > /* > ! * resulting array has two element outer array made up of input > ! * argument arrays > */ > int i; > > ! ndims = ndims1 + 1; > dims = (int *) palloc(ndims * sizeof(int)); > lbs = (int *) palloc(ndims * sizeof(int)); > > ! dims[0] = 2; /* outer array made up of two input arrays */ > ! lbs[0] = 1; /* start lower bound at 1 */ > > ! for (i = 0; i < ndims1; i++) > { > if (dims1[i] != dims2[i] || lbs1[i] != lbs2[i]) > ereport(ERROR, > (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), > errmsg("cannot concatenate incompatible arrays"), > ! errdetail("Arrays with differing dimensions are not " > ! "compatible for concatenation."))); > > ! dims[i + 1] = dims1[i]; > ! lbs[i + 1] = lbs1[i]; > } > } > else if (ndims1 == ndims2 - 1) > --- 223,251 ---- > if (ndims1 == ndims2) > { > /* > ! * resulting array is made up of the elements (possibly arrays themselves) > ! * of the input argument arrays > */ > int i; > > ! ndims = ndims1; > dims = (int *) palloc(ndims * sizeof(int)); > lbs = (int *) palloc(ndims * sizeof(int)); > > ! dims[0] = dims1[0] + dims2[0]; > ! lbs[0] = lbs1[0]; > > ! for (i = 1; i < ndims; i++) > { > if (dims1[i] != dims2[i] || lbs1[i] != lbs2[i]) > ereport(ERROR, > (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), > errmsg("cannot concatenate incompatible arrays"), > ! errdetail("Arrays with differing element dimensions are " > ! "not compatible for concatenation."))); > > ! dims[i] = dims1[i]; > ! lbs[i] = lbs1[i]; > } > } > else if (ndims1 == ndims2 - 1) > *************** > *** 264,269 **** > --- 264,272 ---- > /* 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++) > { > *************** > *** 276,284 **** > } > } > else > - /* (ndims1 == ndims2 + 1) */ > { > ! /* > * resulting array has the first argument as the outer array, with > * the second argument appended to the end of the outer dimension > */ > --- 279,287 ---- > } > } > else > { > ! /* (ndims1 == ndims2 + 1) > ! * > * resulting array has the first argument as the outer array, with > * the second argument appended to the end of the outer dimension > */ > Index: src/include/nodes/primnodes.h > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/include/nodes/primnodes.h,v > retrieving revision 1.91 > diff -c -r1.91 primnodes.h > *** src/include/nodes/primnodes.h 11 Aug 2003 23:04:50 -0000 1.91 > --- src/include/nodes/primnodes.h 15 Aug 2003 21:37:35 -0000 > *************** > *** 596,602 **** > Oid array_typeid; /* type of expression result */ > Oid element_typeid; /* common type of expression elements */ > List *elements; /* the array elements */ > ! int ndims; /* number of array dimensions */ > } ArrayExpr; > > /* > --- 596,602 ---- > Oid array_typeid; /* type of expression result */ > Oid element_typeid; /* common type of expression elements */ > List *elements; /* the array elements */ > ! bool multidims; /* true if elements are also ArrayExprs */ > } ArrayExpr; > > /* > Index: src/test/regress/expected/arrays.out > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/test/regress/expected/arrays.out,v > retrieving revision 1.17 > diff -c -r1.17 arrays.out > *** src/test/regress/expected/arrays.out 21 Jul 2003 20:29:40 -0000 1.17 > --- src/test/regress/expected/arrays.out 15 Aug 2003 23:09:19 -0000 > *************** > *** 190,199 **** > {6,42} > (1 row) > > ! SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{{1,2},{3,4}}"; > ! {{1,2},{3,4}} > ! --------------- > ! {{1,2},{3,4}} > (1 row) > > SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; > --- 190,199 ---- > {6,42} > (1 row) > > ! SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}"; > ! {1,2,3,4} > ! ----------- > ! {1,2,3,4} > (1 row) > > SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; > *************** > *** 233,248 **** > {0,1,2} > (1 row) > > ! SELECT ARRAY[1,2] || ARRAY[3,4] AS "{{1,2},{3,4}}"; > ! {{1,2},{3,4}} > ! --------------- > ! {{1,2},{3,4}} > (1 row) > > SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; > ! ARRAY > ! ------------------------------------------ > ! {{{{hello,world}}},{{{happy,birthday}}}} > (1 row) > > SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; > --- 233,248 ---- > {0,1,2} > (1 row) > > ! SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}"; > ! {1,2,3,4} > ! ----------- > ! {1,2,3,4} > (1 row) > > SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; > ! ARRAY > ! -------------------------------------- > ! {{{hello,world}},{{happy,birthday}}} > (1 row) > > SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; > *************** > *** 251,260 **** > {{1,2},{3,4},{5,6}} > (1 row) > > ! SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{{0,0},{1,1},{2,2}}"; > ! {{0,0},{1,1},{2,2}} > ! --------------------- > ! {{0,0},{1,1},{2,2}} > (1 row) > > SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; > --- 251,260 ---- > {{1,2},{3,4},{5,6}} > (1 row) > > ! SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; > ! {0,0,1,1,2,2} > ! --------------- > ! {0,0,1,1,2,2} > (1 row) > > SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; > Index: src/test/regress/sql/arrays.sql > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/test/regress/sql/arrays.sql,v > retrieving revision 1.14 > diff -c -r1.14 arrays.sql > *** src/test/regress/sql/arrays.sql 29 Jun 2003 00:33:44 -0000 1.14 > --- src/test/regress/sql/arrays.sql 15 Aug 2003 23:02:06 -0000 > *************** > *** 132,138 **** > -- functions > SELECT array_append(array[42], 6) AS "{42,6}"; > SELECT array_prepend(6, array[42]) AS "{6,42}"; > ! SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{{1,2},{3,4}}"; > SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; > SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}"; > > --- 132,138 ---- > -- functions > SELECT array_append(array[42], 6) AS "{42,6}"; > SELECT array_prepend(6, array[42]) AS "{6,42}"; > ! SELECT array_cat(ARRAY[1,2], ARRAY[3,4]) AS "{1,2,3,4}"; > SELECT array_cat(ARRAY[1,2], ARRAY[[3,4],[5,6]]) AS "{{1,2},{3,4},{5,6}}"; > SELECT array_cat(ARRAY[[3,4],[5,6]], ARRAY[1,2]) AS "{{3,4},{5,6},{1,2}}"; > > *************** > *** 141,150 **** > SELECT NOT ARRAY[1.1,1.2,1.3] = ARRAY[1.1,1.2,1.3] AS "FALSE"; > SELECT ARRAY[1,2] || 3 AS "{1,2,3}"; > SELECT 0 || ARRAY[1,2] AS "{0,1,2}"; > ! SELECT ARRAY[1,2] || ARRAY[3,4] AS "{{1,2},{3,4}}"; > SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; > SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; > ! SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{{0,0},{1,1},{2,2}}"; > SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; > > -- array casts > --- 141,150 ---- > SELECT NOT ARRAY[1.1,1.2,1.3] = ARRAY[1.1,1.2,1.3] AS "FALSE"; > SELECT ARRAY[1,2] || 3 AS "{1,2,3}"; > SELECT 0 || ARRAY[1,2] AS "{0,1,2}"; > ! SELECT ARRAY[1,2] || ARRAY[3,4] AS "{1,2,3,4}"; > SELECT ARRAY[[['hello','world']]] || ARRAY[[['happy','birthday']]] AS "ARRAY"; > SELECT ARRAY[[1,2],[3,4]] || ARRAY[5,6] AS "{{1,2},{3,4},{5,6}}"; > ! SELECT ARRAY[0,0] || ARRAY[1,1] || ARRAY[2,2] AS "{0,0,1,1,2,2}"; > SELECT 0 || ARRAY[1,2] || 3 AS "{0,1,2,3}"; > > -- array casts > > ---------------------------(end of broadcast)--------------------------- > TIP 2: you can get off all lists at once with the unregister command > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
pgsql-patches by date: