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 ****
  
       <row>
        <entry><function>max(<replaceable class="parameter">expression</replaceable>)</function></entry>
!       <entry>any numeric, string, or date/time type</entry>
        <entry>same as argument type</entry>
        <entry>
         maximum value of <replaceable
--- 7024,7030 ----
  
       <row>
        <entry><function>max(<replaceable class="parameter">expression</replaceable>)</function></entry>
!       <entry>any array, any numeric, string, or date/time type</entry>
        <entry>same as argument type</entry>
        <entry>
         maximum value of <replaceable
***************
*** 7035,7041 ****
  
       <row>
        <entry><function>min(<replaceable class="parameter">expression</replaceable>)</function></entry>
!       <entry>any numeric, string, or date/time type</entry>
        <entry>same as argument type</entry>
        <entry>
         minimum value of <replaceable
--- 7035,7041 ----
  
       <row>
        <entry><function>min(<replaceable class="parameter">expression</replaceable>)</function></entry>
!       <entry>any array, any numeric, string, or date/time type</entry>
        <entry>same as argument type</entry>
        <entry>
         minimum value of <replaceable
Index: src/backend/utils/adt/arrayfuncs.c
===================================================================
RCS file: /usr/local/cvsroot/pgsql-server/src/backend/utils/adt/arrayfuncs.c,v
retrieving revision 1.107
diff -c -r1.107 arrayfuncs.c
*** src/backend/utils/adt/arrayfuncs.c	8 Aug 2004 05:01:55 -0000	1.107
--- src/backend/utils/adt/arrayfuncs.c	8 Aug 2004 22:32:35 -0000
***************
*** 3342,3344 ****
--- 3342,3375 ----
  
  	return PointerGetDatum(result);
  }
+ 
+ Datum
+ array_larger(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);
+ }
+ 
+ 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;
