]> granicus.if.org Git - postgresql/commitdiff
Improve documentation for combine functions.
authorRobert Haas <rhaas@postgresql.org>
Thu, 24 Mar 2016 16:59:18 +0000 (12:59 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 24 Mar 2016 16:59:18 +0000 (12:59 -0400)
David Rowley

doc/src/sgml/catalogs.sgml
doc/src/sgml/ref/create_aggregate.sgml

index 951f59b76c1f196424d437d2f57b8b2a6ecbde2b..4a0ede6a72c515a9bccb78013ac97e69e72d64ef 100644 (file)
       <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
       <entry>Final function (zero if none)</entry>
      </row>
+     <row>
+      <entry><structfield>aggcombinefn</structfield></entry>
+      <entry><type>regproc</type></entry>
+      <entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
+      <entry>Combine function (zero if none)</entry>
+     </row>
      <row>
       <entry><structfield>aggmtransfn</structfield></entry>
       <entry><type>regproc</type></entry>
index 4bda23ada6951ad05b1303cb32cc3f8dba3cb038..837b83c00b82fc055c7e45d45a42bdbba77172f1 100644 (file)
@@ -108,15 +108,12 @@ CREATE AGGREGATE <replaceable class="PARAMETER">name</replaceable> (
    functions:
    a state transition function
    <replaceable class="PARAMETER">sfunc</replaceable>,
-   an optional final calculation function
-   <replaceable class="PARAMETER">ffunc</replaceable>,
-   and an optional combine function
-   <replaceable class="PARAMETER">combinefunc</replaceable>.
+   and an optional final calculation function
+   <replaceable class="PARAMETER">ffunc</replaceable>.
    These are used as follows:
 <programlisting>
 <replaceable class="PARAMETER">sfunc</replaceable>( internal-state, next-data-values ) ---> next-internal-state
 <replaceable class="PARAMETER">ffunc</replaceable>( internal-state ) ---> aggregate-value
-<replaceable class="PARAMETER">combinefunc</replaceable>( internal-state, internal-state ) ---> next-internal-state
 </programlisting>
   </para>
 
@@ -133,12 +130,6 @@ CREATE AGGREGATE <replaceable class="PARAMETER">name</replaceable> (
    is returned as-is.
   </para>
 
-  <para>
-   An aggregate function may also supply a combining function, which allows
-   the aggregation process to be broken down into multiple steps.  This
-   facilitates query optimization techniques such as parallel query.
-  </para>
-
   <para>
    An aggregate function can provide an initial condition,
    that is, an initial value for the internal state value.
@@ -405,6 +396,46 @@ SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;
     </listitem>
    </varlistentry>
 
+   <varlistentry>
+    <term><replaceable class="PARAMETER">combinefunc</replaceable></term>
+    <listitem>
+     <para>
+      The <replaceable class="PARAMETER">combinefunc</replaceable> may
+      optionally be specified in order to allow the aggregate function to
+      support partial aggregation. This is a prerequisite to allow the
+      aggregate to participate in certain optimizations such as parallel
+      aggregation.
+     </para>
+
+     <para>
+      This function can be thought of as an <replaceable class="PARAMETER">
+      sfunc</replaceable>, where instead of acting upon individual input rows
+      and adding these to the aggregate state, it adds other aggregate states
+      to the aggregate state.
+     </para>
+
+     <para>
+      The <replaceable class="PARAMETER">combinefunc</replaceable> must accept
+      two arguments of <replaceable class="PARAMETER">state_data_type
+      </replaceable> and return <replaceable class="PARAMETER">state_data_type
+      </replaceable>. Optionally this function may be <quote>strict</quote>. In
+      this case the function will not be called when either of the input states
+      are null.
+     </para>
+     <para>
+      For aggregate functions with an <literal>INTERNAL</literal>
+      <replaceable class="PARAMETER">state_data_type</replaceable> the
+      <replaceable class="PARAMETER">combinefunc</replaceable> must not be
+      <quote>strict</quote>. In this scenario the
+      <replaceable class="PARAMETER">combinefunc</replaceable> must take charge
+      and ensure that the null states are handled correctly and that the state
+      being returned is a pointer to memory which belongs in the aggregate
+      memory context.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry>
     <term><replaceable class="PARAMETER">initial_condition</replaceable></term>
     <listitem>