Index: doc/src/sgml/func.sgml =================================================================== RCS file: /usr/local/cvsroot/pgsql-server/doc/src/sgml/func.sgml,v retrieving revision 1.216 diff -c -r1.216 func.sgml *** doc/src/sgml/func.sgml 4 Aug 2004 21:33:40 -0000 1.216 --- doc/src/sgml/func.sgml 8 Aug 2004 22:32:35 -0000 *************** *** 7024,7030 **** max(expression) ! any numeric, string, or date/time type same as argument type maximum value of max(expression) ! any array, any numeric, string, or date/time type same as argument type maximum value of min(expression) ! any numeric, string, or date/time type same as argument type minimum value of min(expression) ! any array, any numeric, string, or date/time type same as argument type minimum value of 0) ? v1 : v2); + + PG_RETURN_ARRAYTYPE_P(result); + } + + Datum + array_smaller(PG_FUNCTION_ARGS) + { + ArrayType *v1, + *v2, + *result; + + v1 = PG_GETARG_ARRAYTYPE_P(0); + v2 = PG_GETARG_ARRAYTYPE_P(1); + + result = ((array_cmp(fcinfo) < 0) ? v1 : v2); + + PG_RETURN_ARRAYTYPE_P(result); + } + Index: src/include/catalog/pg_aggregate.h =================================================================== RCS file: /usr/local/cvsroot/pgsql-server/src/include/catalog/pg_aggregate.h,v retrieving revision 1.44 diff -c -r1.44 pg_aggregate.h *** src/include/catalog/pg_aggregate.h 26 May 2004 18:14:36 -0000 1.44 --- src/include/catalog/pg_aggregate.h 8 Aug 2004 22:32:35 -0000 *************** *** 108,113 **** --- 108,114 ---- DATA(insert ( 2128 interval_larger - 1186 _null_ )); DATA(insert ( 2129 text_larger - 25 _null_ )); DATA(insert ( 2130 numeric_larger - 1700 _null_ )); + DATA(insert ( 2050 array_larger - 2277 _null_ )); /* min */ DATA(insert ( 2131 int8smaller - 20 _null_ )); *************** *** 126,131 **** --- 127,133 ---- DATA(insert ( 2144 interval_smaller - 1186 _null_ )); DATA(insert ( 2145 text_smaller - 25 _null_ )); DATA(insert ( 2146 numeric_smaller - 1700 _null_ )); + DATA(insert ( 2051 array_smaller - 2277 _null_ )); /* * Using int8inc for count() is cheating a little, since it really only Index: src/include/catalog/pg_proc.h =================================================================== RCS file: /usr/local/cvsroot/pgsql-server/src/include/catalog/pg_proc.h,v retrieving revision 1.343 diff -c -r1.343 pg_proc.h *** src/include/catalog/pg_proc.h 3 Aug 2004 20:32:35 -0000 1.343 --- src/include/catalog/pg_proc.h 8 Aug 2004 22:32:35 -0000 *************** *** 1034,1039 **** --- 1034,1043 ---- DESCR("split delimited text into text[]"); DATA(insert OID = 395 ( array_to_string PGNSP PGUID 12 f f t f i 2 25 "2277 25" _null_ array_to_text - _null_ )); DESCR("concatenate array elements, using delimiter, into text"); + DATA(insert OID = 515 ( array_larger PGNSP PGUID 12 f f t f i 2 2277 "2277 2277" _null_ array_larger - _null_ )); + DESCR("larger of two"); + DATA(insert OID = 516 ( array_smaller PGNSP PGUID 12 f f t f i 2 2277 "2277 2277" _null_ array_smaller - _null_ )); + DESCR("smaller of two"); DATA(insert OID = 760 ( smgrin PGNSP PGUID 12 f f t f s 1 210 "2275" _null_ smgrin - _null_ )); DESCR("I/O"); *************** *** 3035,3040 **** --- 3039,3045 ---- DATA(insert OID = 2128 ( max PGNSP PGUID 12 t f f f i 1 1186 "1186" _null_ aggregate_dummy - _null_ )); DATA(insert OID = 2129 ( max PGNSP PGUID 12 t f f f i 1 25 "25" _null_ aggregate_dummy - _null_ )); DATA(insert OID = 2130 ( max PGNSP PGUID 12 t f f f i 1 1700 "1700" _null_ aggregate_dummy - _null_ )); + DATA(insert OID = 2050 ( max PGNSP PGUID 12 t f f f i 1 2277 "2277" _null_ aggregate_dummy - _null_ )); DATA(insert OID = 2131 ( min PGNSP PGUID 12 t f f f i 1 20 "20" _null_ aggregate_dummy - _null_ )); DATA(insert OID = 2132 ( min PGNSP PGUID 12 t f f f i 1 23 "23" _null_ aggregate_dummy - _null_ )); *************** *** 3052,3057 **** --- 3057,3063 ---- DATA(insert OID = 2144 ( min PGNSP PGUID 12 t f f f i 1 1186 "1186" _null_ aggregate_dummy - _null_ )); DATA(insert OID = 2145 ( min PGNSP PGUID 12 t f f f i 1 25 "25" _null_ aggregate_dummy - _null_ )); DATA(insert OID = 2146 ( min PGNSP PGUID 12 t f f f i 1 1700 "1700" _null_ aggregate_dummy - _null_ )); + DATA(insert OID = 2051 ( min PGNSP PGUID 12 t f f f i 1 2277 "2277" _null_ aggregate_dummy - _null_ )); DATA(insert OID = 2147 ( count PGNSP PGUID 12 t f f f i 1 20 "2276" _null_ aggregate_dummy - _null_ )); Index: src/include/utils/array.h =================================================================== RCS file: /usr/local/cvsroot/pgsql-server/src/include/utils/array.h,v retrieving revision 1.48 diff -c -r1.48 array.h *** src/include/utils/array.h 16 Jun 2004 01:26:55 -0000 1.48 --- src/include/utils/array.h 8 Aug 2004 22:32:35 -0000 *************** *** 129,134 **** --- 129,136 ---- extern Datum array_type_coerce(PG_FUNCTION_ARGS); extern Datum array_type_length_coerce(PG_FUNCTION_ARGS); extern Datum array_length_coerce(PG_FUNCTION_ARGS); + extern Datum array_larger(PG_FUNCTION_ARGS); + extern Datum array_smaller(PG_FUNCTION_ARGS); extern Datum array_ref(ArrayType *array, int nSubscripts, int *indx, int arraylen, int elmlen, bool elmbyval, char elmalign, Index: src/test/regress/expected/arrays.out =================================================================== RCS file: /usr/local/cvsroot/pgsql-server/src/test/regress/expected/arrays.out,v retrieving revision 1.22 diff -c -r1.22 arrays.out *** src/test/regress/expected/arrays.out 5 Aug 2004 03:30:03 -0000 1.22 --- src/test/regress/expected/arrays.out 8 Aug 2004 22:52:49 -0000 *************** *** 425,427 **** --- 425,480 ---- t (1 row) + CREATE TEMP TABLE arraggtest ( f1 int[], f2 text [][], f3 float[]); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{1,2,3,4}','{{white, yellow},{pink,orange}}','{2.1,3.3,1.8,1.7,1.6}'); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{1,2,3}','{{black, red},{green,orange}}','{1.6,2.2,2.6,0.4}'); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{2}','{{grey, red},{blue,blue}}','{0.2}'); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{4,2,6,7,8,1}','{{red},{black},{purple},{blue},{blue}}','{1.16, 1.07, 1.09}'); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{3,3,2,4,5,6}','{{pink,white,blue,red,grey,orange}}','{2.1,1.87,1.4,2.2}'); + SELECT f1 from arraggtest order by 1; + f1 + --------------- + {1,2,3} + {1,2,3,4} + {2} + {3,3,2,4,5,6} + {4,2,6,7,8,1} + (5 rows) + + SELECT f2 from arraggtest order by 1; + f2 + ---------------------------------------- + {{black,red},{green,orange}} + {{grey,red},{blue,blue}} + {{pink,white,blue,red,grey,orange}} + {{red},{black},{purple},{blue},{blue}} + {{white,yellow},{pink,orange}} + (5 rows) + + SELECT f3 from arraggtest order by 1; + f3 + ----------------------- + {0.2} + {1.16,1.07,1.09} + {1.6,2.2,2.6,0.4} + {2.1,1.87,1.4,2.2} + {2.1,3.3,1.8,1.7,1.6} + (5 rows) + + SELECT max(f1), max(f2), max(f3) FROM arraggtest; + max | max | max + ---------------+--------------------------------+----------------------- + {4,2,6,7,8,1} | {{white,yellow},{pink,orange}} | {2.1,3.3,1.8,1.7,1.6} + (1 row) + + SELECT min(f1), min(f2), min(f3) FROM arraggtest; + min | min | min + ---------+------------------------------+------- + {1,2,3} | {{black,red},{green,orange}} | {0.2} + (1 row) + Index: src/test/regress/sql/arrays.sql =================================================================== RCS file: /usr/local/cvsroot/pgsql-server/src/test/regress/sql/arrays.sql,v retrieving revision 1.17 diff -c -r1.17 arrays.sql *** src/test/regress/sql/arrays.sql 9 Jun 2004 19:08:20 -0000 1.17 --- src/test/regress/sql/arrays.sql 8 Aug 2004 22:32:35 -0000 *************** *** 192,194 **** --- 192,212 ---- select 'foo' not like all (array['%a', '%o']); -- f select 'foo' ilike any (array['%A', '%O']); -- t select 'foo' ilike all (array['F%', '%O']); -- t + + CREATE TEMP TABLE arraggtest ( f1 int[], f2 text [][], f3 float[]); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{1,2,3,4}','{{white, yellow},{pink,orange}}','{2.1,3.3,1.8,1.7,1.6}'); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{1,2,3}','{{black, red},{green,orange}}','{1.6,2.2,2.6,0.4}'); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{2}','{{grey, red},{blue,blue}}','{0.2}'); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{4,2,6,7,8,1}','{{red},{black},{purple},{blue},{blue}}','{1.16, 1.07, 1.09}'); + INSERT INTO arraggtest (f1, f2, f3) VALUES + ('{3,3,2,4,5,6}','{{pink,white,blue,red,grey,orange}}','{2.1,1.87,1.4,2.2}'); + + SELECT f1 from arraggtest order by 1; + SELECT f2 from arraggtest order by 1; + SELECT f3 from arraggtest order by 1; + SELECT max(f1), max(f2), max(f3) FROM arraggtest; + SELECT min(f1), min(f2), min(f3) FROM arraggtest;