Updated version attached, this time without the compiler warning.

Sorry for the sloppy work.

...Robert
Index: doc/src/sgml/array.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql/doc/src/sgml/array.sgml,v
retrieving revision 1.67
diff -c -r1.67 array.sgml
*** doc/src/sgml/array.sgml	29 Oct 2008 11:24:52 -0000	1.67
--- doc/src/sgml/array.sgml	7 Nov 2008 04:04:33 -0000
***************
*** 325,330 ****
--- 325,342 ----
             2
  (1 row)
  </programlisting>
+ 
+  <function>array_length</function> will return the length of a specified
+  array dimension:
+ 
+ <programlisting>
+ SELECT array_length(schedule, 1) FROM sal_emp WHERE name = 'Carol';
+ 
+  array_length
+ --------------
+             2
+ (1 row)
+ </programlisting>
   </para>
   </sect2>
  
Index: doc/src/sgml/func.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql/doc/src/sgml/func.sgml,v
retrieving revision 1.455
diff -c -r1.455 func.sgml
*** doc/src/sgml/func.sgml	4 Nov 2008 14:49:11 -0000	1.455
--- doc/src/sgml/func.sgml	7 Nov 2008 04:04:44 -0000
***************
*** 9411,9416 ****
--- 9411,9427 ----
         <row>
          <entry>
           <literal>
+           <function>array_length</function>(<type>anyarray</type>, <type>int</type>)
+          </literal>
+         </entry>
+         <entry><type>int</type></entry>
+         <entry>returns length of the requested array dimension</entry>
+         <entry><literal>array_length(array[1,2,3], 1)</literal></entry>
+         <entry><literal>3</literal></entry>
+        </row>
+        <row>
+         <entry>
+          <literal>
            <function>array_lower</function>(<type>anyarray</type>, <type>int</type>)
           </literal>
          </entry>
Index: src/backend/utils/adt/arrayfuncs.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v
retrieving revision 1.148
diff -c -r1.148 arrayfuncs.c
*** src/backend/utils/adt/arrayfuncs.c	4 Nov 2008 14:49:11 -0000	1.148
--- src/backend/utils/adt/arrayfuncs.c	7 Nov 2008 04:04:49 -0000
***************
*** 1641,1646 ****
--- 1641,1674 ----
  }
  
  /*
+  * array_length :
+  *		returns the length, of the DIM requested, for
+  *		the array pointed to by "v", as an int4
+  */
+ Datum
+ array_length(PG_FUNCTION_ARGS)
+ {
+ 	ArrayType  *v = PG_GETARG_ARRAYTYPE_P(0);
+ 	int			reqdim = PG_GETARG_INT32(1);
+ 	int		   *dimv;
+ 	int			result;
+ 
+ 	/* Sanity check: does it look like an array at all? */
+ 	if (ARR_NDIM(v) <= 0 || ARR_NDIM(v) > MAXDIM)
+ 		PG_RETURN_NULL();
+ 
+ 	/* Sanity check: was the requested dim valid */
+ 	if (reqdim <= 0 || reqdim > ARR_NDIM(v))
+ 		PG_RETURN_NULL();
+ 
+ 	dimv = ARR_DIMS(v);
+ 
+ 	result = dimv[reqdim - 1];
+ 
+ 	PG_RETURN_INT32(result);
+ }
+ 
+ /*
   * array_ref :
   *	  This routine takes an array pointer and a subscript array and returns
   *	  the referenced item as a Datum.  Note that for a pass-by-reference
Index: src/include/catalog/pg_proc.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/catalog/pg_proc.h,v
retrieving revision 1.524
diff -c -r1.524 pg_proc.h
*** src/include/catalog/pg_proc.h	4 Nov 2008 14:49:11 -0000	1.524
--- src/include/catalog/pg_proc.h	7 Nov 2008 04:05:01 -0000
***************
*** 996,1001 ****
--- 996,1003 ----
  DESCR("array lower dimension");
  DATA(insert OID = 2092 (  array_upper	   PGNSP PGUID 12 1 0 0 f f t f i 2 23 "2277 23" _null_ _null_ _null_ array_upper _null_ _null_ _null_ ));
  DESCR("array upper dimension");
+ DATA(insert OID = 2176 (  array_length     PGNSP PGUID 12 1 0 0 f f t f i 2 23 "2277 23" _null_ _null_ _null_ array_length _null_ _null_ _null_ ));
+ DESCR("array length");
  DATA(insert OID = 378 (  array_append	   PGNSP PGUID 12 1 0 0 f f f f i 2 2277 "2277 2283" _null_ _null_ _null_ array_push _null_ _null_ _null_ ));
  DESCR("append element onto end of array");
  DATA(insert OID = 379 (  array_prepend	   PGNSP PGUID 12 1 0 0 f f f f i 2 2277 "2283 2277" _null_ _null_ _null_ array_push _null_ _null_ _null_ ));
Index: src/include/utils/array.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/array.h,v
retrieving revision 1.69
diff -c -r1.69 array.h
*** src/include/utils/array.h	4 Nov 2008 14:49:12 -0000	1.69
--- src/include/utils/array.h	7 Nov 2008 04:05:02 -0000
***************
*** 199,204 ****
--- 199,205 ----
  extern Datum array_dims(PG_FUNCTION_ARGS);
  extern Datum array_lower(PG_FUNCTION_ARGS);
  extern Datum array_upper(PG_FUNCTION_ARGS);
+ extern Datum array_length(PG_FUNCTION_ARGS);
  extern Datum array_larger(PG_FUNCTION_ARGS);
  extern Datum array_smaller(PG_FUNCTION_ARGS);
  extern Datum generate_subscripts(PG_FUNCTION_ARGS);
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to