<REFENTRY ID="SQL-CREATEAGGREGATE">
 <REFMETA>
  <REFENTRYTITLE>
   CREATE AGGREGATE
  </REFENTRYTITLE>
  <REFMISCINFO>SQL - Language Statements</REFMISCINFO>
 </REFMETA>

 <REFNAMEDIV>
  <REFNAME>
   CREATE AGGREGATE
  </REFNAME>
  <REFPURPOSE>
   Defines a new aggregate function
  </REFPURPOSE>
 </refnamediv>
 <REFSYNOPSISDIV>
  <REFSYNOPSISDIVINFO>
   <DATE>1998-09-09</DATE>
  </REFSYNOPSISDIVINFO>
  <SYNOPSIS>
CREATE AGGREGATE <REPLACEABLE CLASS="PARAMETER">name</REPLACEABLE> [ AS ]
    ( BASETYPE    = <REPLACEABLE CLASS="PARAMETER">data_type</REPLACEABLE>
    [ , SFUNC1    = <REPLACEABLE CLASS="PARAMETER">sfunc1</REPLACEABLE>
      , STYPE1    = <REPLACEABLE CLASS="PARAMETER">sfunc1_return_type</REPLACEABLE> ]
    [ , SFUNC2    = <REPLACEABLE CLASS="PARAMETER">sfunc2</REPLACEABLE>
      , STYPE2    = <REPLACEABLE CLASS="PARAMETER">sfunc2_return_type</REPLACEABLE> ]
    [ , FINALFUNC = <REPLACEABLE CLASS="PARAMETER">ffunc</REPLACEABLE> ]
    [ , INITCOND1 = <REPLACEABLE CLASS="PARAMETER">initial_condition1</REPLACEABLE> ]
    [ , INITCOND2 = <REPLACEABLE CLASS="PARAMETER">initial_condition2</REPLACEABLE> ]
    )
  </SYNOPSIS>

  <REFSECT2 ID="R2-SQL-CREATEAGGREGATE-1">
   <REFSECT2INFO>
    <DATE>1998-09-09</DATE>
   </REFSECT2INFO>
   <TITLE>
    Inputs
   </TITLE>
   <PARA>
   <VARIABLELIST>
    <VARLISTENTRY>
     <TERM>
      <REPLACEABLE CLASS="PARAMETER">name</REPLACEABLE>
     </TERM>
     <LISTITEM>
      <para>
       The name of an aggregate function to create.
      </para>
     </LISTITEM>
    </varlistentry>

    <varlistentry>
     <term>
      <REPLACEABLE CLASS="PARAMETER">data_type</REPLACEABLE>
     </term>
     <listitem>
      <para>
The fundamental data type on which this aggregate function operates.
      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>
      <REPLACEABLE CLASS="PARAMETER">sfunc1</REPLACEABLE>
     </term>
     <listitem>
      <para>
The state transition function
 to be called for every non-NULL field from the source column.
 It takes a variable of
type <REPLACEABLE CLASS="PARAMETER">sfunc1_return_type</REPLACEABLE> as
the first argument and that field as the
second argument.
      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>
      <REPLACEABLE CLASS="PARAMETER">sfunc1_return_type</REPLACEABLE>
     </term>
     <listitem>
      <para>
The return type of the first transition function.
      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>
      <REPLACEABLE CLASS="PARAMETER">sfunc2</REPLACEABLE>
     </term>
     <listitem>
      <para>
The state transition function
 to be called for every non-NULL field from the source column.
It takes a variable
of type <REPLACEABLE CLASS="PARAMETER">sfunc2_return_type</REPLACEABLE>
as the only argument and returns a variable of the same type.
      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>
      <REPLACEABLE CLASS="PARAMETER">sfunc2_return_type</REPLACEABLE>
     </term>
     <listitem>
      <para>
The return type of the second transition function.
      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>
      <REPLACEABLE CLASS="PARAMETER">ffunc</REPLACEABLE>
     </term>
     <listitem>
      <para>
The final function
 called after traversing all input fields. This function must
take two arguments of types
 <REPLACEABLE CLASS="PARAMETER">sfunc1_return_type</REPLACEABLE>
and
<REPLACEABLE CLASS="PARAMETER">sfunc2_return_type</REPLACEABLE>.
      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>
      <REPLACEABLE CLASS="PARAMETER">initial_condition1</REPLACEABLE>
     </term>
     <listitem>
      <para>
The initial value for the first transition function argument.
      </para>
     </listitem>
    </varlistentry>

    <varlistentry>
     <term>
      <REPLACEABLE CLASS="PARAMETER">initial_condition2</REPLACEABLE>
     </term>
     <listitem>
      <para>
The initial value for the second transition function argument.
      </para>
     </listitem>
     </varlistentry>
    </variablelist>
   </para>
  </REFSECT2>
  
  <REFSECT2 ID="R2-SQL-CREATEAGGREGATE-2">
   <REFSECT2INFO>
    <DATE>1998-09-09</DATE>
   </REFSECT2INFO>
   <TITLE>
    Outputs
   </TITLE>
   <PARA>
    
    <VARIABLELIST>
     <VARLISTENTRY>
      <TERM>
       <ReturnValue>CREATE</ReturnValue>
      </TERM>
      <LISTITEM>
       <PARA>
	Message returned if the command completes successfully.
       </para>
      </listitem>
     </varlistentry>
    </VARIABLELIST>
   </para>
  </REFSECT2>
 </REFSYNOPSISDIV>
 
 <REFSECT1 ID="R1-SQL-CREATEAGGREGATE-1">
  <REFSECT1INFO>
   <DATE>1998-09-09</DATE>
  </REFSECT1INFO>
  <TITLE>
   Description
  </TITLE>
  <para>
   <command>CREATE AGGREGATE</command> 
   allows a user or programmer to extend <productname>Postgres</productname>
   functionality by defining new aggregate functions. Some aggregate functions
   for base types such as <function>min(int4)</function>
   and <function>avg(float8)</function> are already provided in the base
   distribution. If one defines new types or needs an aggregate function not
   already provided then <command>CREATE AGGREGATE</command>
   can be used to provide the desired features.
  </para>
  <PARA>
   An  aggregate  function can require up to three functions, two
   state transition functions, 
   <REPLACEABLE CLASS="PARAMETER">sfunc1</REPLACEABLE>
   and <REPLACEABLE CLASS="PARAMETER">sfunc2</REPLACEABLE>:
   <programlisting>
    <REPLACEABLE CLASS="PARAMETER">sfunc1</REPLACEABLE>( internal-state1, next-data_item ) ---> next-internal-state1
    <REPLACEABLE CLASS="PARAMETER">sfunc2</REPLACEABLE>( internal-state2 ) ---> next-internal-state2
   </programlisting>
   and a final calculation function,
   <REPLACEABLE CLASS="PARAMETER">ffunc</REPLACEABLE>:
   <programlisting>
    <REPLACEABLE CLASS="PARAMETER">ffunc</REPLACEABLE>(internal-state1, internal-state2) ---> aggregate-value
   </programlisting>
  </para>
  <para>
   <productname>Postgres</productname> creates up to two temporary variables
   (referred to here as <REPLACEABLE CLASS="PARAMETER">temp1</REPLACEABLE>
   and <REPLACEABLE CLASS="PARAMETER">temp2</REPLACEABLE>)
   to hold intermediate results used as arguments to the transition functions.
  </para>
  <para>
   These transition functions are required to have the following properties:
   <itemizedlist>
    <listitem>
     <para>
      The  arguments  to 
      <REPLACEABLE CLASS="PARAMETER">sfunc1</REPLACEABLE>
      must be
      <REPLACEABLE CLASS="PARAMETER">temp1</REPLACEABLE>
      of type
      <REPLACEABLE CLASS="PARAMETER">sfunc1_return_type</REPLACEABLE>
      and
      <REPLACEABLE CLASS="PARAMETER">column_value</REPLACEABLE>
      of type <REPLACEABLE CLASS="PARAMETER">data_type</REPLACEABLE>.
      The return value must  be of type
      <REPLACEABLE CLASS="PARAMETER">sfunc1_return_type</REPLACEABLE>
      and will be used as the first argument in the next call to 
      <REPLACEABLE CLASS="PARAMETER">sfunc1</REPLACEABLE>.
     </para>
    </listitem>
    
    <listitem>
     <para>
      The  argument and return value of 
      <REPLACEABLE CLASS="PARAMETER">sfunc2</REPLACEABLE>
      must be
      <REPLACEABLE CLASS="PARAMETER">temp2</REPLACEABLE>
      of type
      <REPLACEABLE CLASS="PARAMETER">sfunc2_return_type</REPLACEABLE>.
     </para>
    </listitem>
    <listitem>     
     <para>
      The  arguments  to  the  final-calculation-function
      must  be
      <REPLACEABLE CLASS="PARAMETER">temp1</REPLACEABLE>
      and
      <REPLACEABLE CLASS="PARAMETER">temp2</REPLACEABLE>
      and its return value must
      be a <productname>Postgres</productname>
      base type (not necessarily
      <REPLACEABLE CLASS="PARAMETER">data_type</REPLACEABLE> 
      which had been specified for BASETYPE).
     </para>
    </listitem>
    <listitem>
     <para>	
      FINALFUNC should be specified
      if and only if both state-transition functions  are
      specified. 
     </para
    </listitem>
   </itemizedlist>
  </PARA>  
  
  <para>	
   An aggregate function may also  require  one or two initial conditions,
 one for
   each transition function.  These are specified and  stored
   in the database as fields of type <type>text</type>.
  </para>
  
  <REFSECT2 ID="R2-SQL-CREATEAGGREGATE-3">
   <REFSECT2INFO>
    <DATE>1998-09-09</DATE>
   </REFSECT2INFO>
   <TITLE>
    Notes
   </TITLE>
   <para>
    Use <command>DROP AGGREGATE</command>
  to drop aggregate functions.
   </para>

  <para>
  It  is possible to specify aggregate functions
   that have varying combinations of state  and  final  functions. 
   For example, the <function>count</function> aggregate requires SFUNC2
   (an incrementing function) but not  SFUNC1  or  FINALFUNC,
   whereas  the  <function>sum</function> aggregate requires SFUNC1 (an addition
   function) but not SFUNC2 or FINALFUNC  and  the  <function>avg</function>
   aggregate  requires 
 both  of the above state functions as
   well as a FINALFUNC (a division function) to  produce  its
   answer.   In any case, at least one state function must be
   defined, and any SFUNC2 must have  a  corresponding  INITCOND2.
   </para>
   
  </REFSECT2>
 </refsect1>

 <REFSECT1 ID="R1-SQL-CREATEAGGREGATE-2">
  <TITLE>
   Usage
  </TITLE>
  <PARA>
   Refer to the chapter on aggregate functions
   in the <citetitle>PostgreSQL Programmer's Guide</citetitle>
   on aggregate functions for
   complete examples of usage.
  </para>   
 </REFSECT1>
 
 <REFSECT1 ID="R1-SQL-CREATEAGGREGATE-3">
  <TITLE>
   Compatibility
  </TITLE>
  
  <REFSECT2 ID="R2-SQL-CREATEAGGREGATE-4">
   <REFSECT2INFO>
    <DATE>1998-09-09</DATE>
   </REFSECT2INFO>
   <TITLE>
    SQL92
   </TITLE>
   <PARA>
    <command>CREATE AGGREGATE</command> 
    is a <productname>Postgres</productname> language extension.
    There is no <command>CREATE AGGREGATE</command> in SQL92.
   </PARA>
  </refsect2>
 </refsect1>
</REFENTRY>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
-->
