Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
CREATE AGGREGATE(7)	  PostgreSQL 18.6 Documentation      CREATE AGGREGATE(7)

NAME
     CREATE_AGGREGATE - define a new aggregate function

SYNOPSIS
     CREATE [ OR REPLACE ] AGGREGATE name ( [ argmode ] [ argname ] arg_data_type [ , ... ] ) (
	 SFUNC = sfunc,
	 STYPE = state_data_type
	 [ , SSPACE = state_data_size ]
	 [ , FINALFUNC = ffunc ]
	 [ , FINALFUNC_EXTRA ]
	 [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
	 [ , COMBINEFUNC = combinefunc ]
	 [ , SERIALFUNC = serialfunc ]
	 [ , DESERIALFUNC = deserialfunc ]
	 [ , INITCOND = initial_condition ]
	 [ , MSFUNC = msfunc ]
	 [ , MINVFUNC = minvfunc ]
	 [ , MSTYPE = mstate_data_type ]
	 [ , MSSPACE = mstate_data_size ]
	 [ , MFINALFUNC = mffunc ]
	 [ , MFINALFUNC_EXTRA ]
	 [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
	 [ , MINITCOND = minitial_condition ]
	 [ , SORTOP = sort_operator ]
	 [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]
     )

     CREATE [ OR REPLACE ] AGGREGATE name ( [ [ argmode ] [ argname ] arg_data_type [ , ... ] ]
			     ORDER BY [ argmode ] [ argname ] arg_data_type [ , ... ] ) (
	 SFUNC = sfunc,
	 STYPE = state_data_type
	 [ , SSPACE = state_data_size ]
	 [ , FINALFUNC = ffunc ]
	 [ , FINALFUNC_EXTRA ]
	 [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
	 [ , INITCOND = initial_condition ]
	 [ , PARALLEL = { SAFE | RESTRICTED | UNSAFE } ]
	 [ , HYPOTHETICAL ]
     )

     or the old syntax

     CREATE [ OR REPLACE ] AGGREGATE name (
	 BASETYPE = base_type,
	 SFUNC = sfunc,
	 STYPE = state_data_type
	 [ , SSPACE = state_data_size ]
	 [ , FINALFUNC = ffunc ]
	 [ , FINALFUNC_EXTRA ]
	 [ , FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
	 [ , COMBINEFUNC = combinefunc ]
	 [ , SERIALFUNC = serialfunc ]
	 [ , DESERIALFUNC = deserialfunc ]
	 [ , INITCOND = initial_condition ]
	 [ , MSFUNC = msfunc ]
	 [ , MINVFUNC = minvfunc ]
	 [ , MSTYPE = mstate_data_type ]
	 [ , MSSPACE = mstate_data_size ]
	 [ , MFINALFUNC = mffunc ]
	 [ , MFINALFUNC_EXTRA ]
	 [ , MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE } ]
	 [ , MINITCOND = minitial_condition ]
	 [ , SORTOP = sort_operator ]
     )

DESCRIPTION
     CREATE  AGGREGATE	defines a new aggregate function.  CREATE OR REPLACE AG-
     GREGATE will either define a new aggregate function or replace an	existing
     definition.  Some	basic and commonly-used aggregate functions are included
     with the distribution; they are documented in Section 9.21. If one  defines
     new  types or needs an aggregate function not already provided, then CREATE
     AGGREGATE can be used to provide the desired features.

     When replacing an existing definition, the argument types, result type, and
     number of direct arguments may not be changed.  Also,  the  new  definition
     must be of the same kind (ordinary aggregate, ordered-set aggregate, or hy-
     pothetical-set aggregate) as the old one.

     If  a  schema  name  is given (for example, CREATE AGGREGATE myschema.myagg
     ...) then the aggregate function is created in the specified schema. Other-
     wise it is created in the current schema.

     An aggregate function is identified by its name and input data type(s). Two
     aggregates in the same schema can have the same name  if  they  operate  on
     different input types. The name and input data type(s) of an aggregate must
     also  be  distinct  from  the name and input data type(s) of every ordinary
     function in the same schema. This behavior is identical to  overloading  of
     ordinary function names (see CREATE FUNCTION (CREATE_FUNCTION(7))).

     A	simple	aggregate function is made from one or two ordinary functions: a
     state transition function sfunc, and an optional final calculation function
     ffunc. These are used as follows:

	 sfunc( internal-state, next-data-values ) ---> next-internal-state
	 ffunc( internal-state ) ---> aggregate-value

     PostgreSQL creates a temporary variable of data type stype to hold the cur-
     rent internal state of the aggregate. At each input row, the aggregate  ar-
     gument value(s) are calculated and the state transition function is invoked
     with  the	current state value and the new argument value(s) to calculate a
     new internal state value. After all the rows have been processed, the final
     function is invoked once to calculate  the  aggregate's  return  value.  If
     there is no final function then the ending state value is returned as-is.

     An aggregate function can provide an initial condition, that is, an initial
     value  for  the  internal	state value. This is specified and stored in the
     database as a value of type text, but it must be a valid external represen-
     tation of a constant of the state value data type. If it  is  not	supplied
     then the state value starts out null.

     If  the  state  transition function is declared "strict", then it cannot be
     called with null inputs. With such a transition function, aggregate  execu-
     tion  behaves  as follows. Rows with any null input values are ignored (the
     function is not called and the previous state value is  retained).  If  the
     initial  state  value is null, then at the first row with all-nonnull input
     values, the first argument value replaces the state value, and the  transi-
     tion function is invoked at each subsequent row with all-nonnull input val-
     ues. This is handy for implementing aggregates like max. Note that this be-
     havior  is  only  available  when	state_data_type is the same as the first
     arg_data_type. When these types are different, you must  supply  a  nonnull
     initial condition or use a nonstrict transition function.

     If  the state transition function is not strict, then it will be called un-
     conditionally at each input row, and must deal with null  inputs  and  null
     state values for itself. This allows the aggregate author to have full con-
     trol over the aggregate's handling of null values.

     If the final function is declared "strict", then it will not be called when
     the  ending state value is null; instead a null result will be returned au-
     tomatically. (Of course this is just the normal behavior  of  strict  func-
     tions.)  In  any case the final function has the option of returning a null
     value. For example, the final function for avg returns null  when	it  sees
     there were zero input rows.

     Sometimes it is useful to declare the final function as taking not just the
     state  value,  but  extra parameters corresponding to the aggregate's input
     values. The main reason for doing this is if the final function is polymor-
     phic and the state value's data type would be inadequate to  pin  down  the
     result  type.  These extra parameters are always passed as NULL (and so the
     final function must not be strict when the FINALFUNC_EXTRA option is used),
     but nonetheless they are valid parameters. The final function could for ex-
     ample make use of get_fn_expr_argtype to identify the actual argument  type
     in the current call.

     An  aggregate can optionally support moving-aggregate mode, as described in
     Section 36.12.1. This requires specifying the MSFUNC, MINVFUNC, and  MSTYPE
     parameters,  and optionally the MSSPACE, MFINALFUNC, MFINALFUNC_EXTRA, MFI-
     NALFUNC_MODIFY, and MINITCOND parameters. Except for MINVFUNC, these  para-
     meters  work  like the corresponding simple-aggregate parameters without M;
     they define a separate implementation of the aggregate that includes an in-
     verse transition function.

     The syntax with ORDER BY in the parameter list creates a  special	type  of
     aggregate called an ordered-set aggregate; or if HYPOTHETICAL is specified,
     then a hypothetical-set aggregate is created. These aggregates operate over
     groups  of  sorted values in order-dependent ways, so that specification of
     an input sort order is an essential part of a call. Also, they can have di-
     rect arguments, which are arguments that are evaluated only once per aggre-
     gation rather than once per input row. Hypothetical-set  aggregates  are  a
     subclass  of  ordered-set	aggregates in which some of the direct arguments
     are required to match, in number and data types,  the  aggregated	argument
     columns.  This  allows  the values of those direct arguments to be added to
     the collection of aggregate-input rows as an additional "hypothetical" row.

     An aggregate can optionally support partial aggregation,  as  described  in
     Section 36.12.4. This requires specifying the COMBINEFUNC parameter. If the
     state_data_type  is  internal, it's usually also appropriate to provide the
     SERIALFUNC and DESERIALFUNC parameters so that parallel aggregation is pos-
     sible. Note that the aggregate must also be marked PARALLEL SAFE to  enable
     parallel aggregation.

     Aggregates  that behave like MIN or MAX can sometimes be optimized by look-
     ing into an index instead of scanning every input row.  If  this  aggregate
     can  be  so optimized, indicate it by specifying a sort operator. The basic
     requirement is that the aggregate must yield the first element in the  sort
     ordering induced by the operator; in other words:

	 SELECT agg(col) FROM tab;

     must be equivalent to:

	 SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;

     Further assumptions are that the aggregate ignores null inputs, and that it
     delivers  a null result if and only if there were no non-null inputs. Ordi-
     narily, a data type's < operator is the proper sort operator for MIN, and >
     is the proper sort operator for MAX. Note that the optimization will  never
     actually  take  effect  unless the specified operator is the "less than" or
     "greater than" strategy member of a B-tree index operator class.

     To be able to create an aggregate function, you must have	USAGE  privilege
     on  the  argument types, the state type(s), and the return type, as well as
     EXECUTE privilege on the supporting functions.

PARAMETERS
     name
	 The name (optionally schema-qualified) of  the  aggregate  function  to
	 create.

     argmode
	 The  mode  of	an argument: IN or VARIADIC. (Aggregate functions do not
	 support OUT arguments.) If omitted, the default is IN.  Only  the  last
	 argument can be marked VARIADIC.

     argname
	 The  name  of an argument. This is currently only useful for documenta-
	 tion purposes. If omitted, the argument has no name.

     arg_data_type
	 An input data type on which this aggregate function operates. To create
	 a zero-argument aggregate function, write * in place of the list of ar-
	 gument specifications. (An example of such an aggregate is count(*).)

     base_type
	 In the old syntax for CREATE AGGREGATE, the input data type  is  speci-
	 fied  by a basetype parameter rather than being written next to the ag-
	 gregate name. Note that this syntax allows only one input parameter. To
	 define a zero-argument aggregate function with this syntax, specify the
	 basetype as "ANY" (not *). Ordered-set  aggregates  cannot  be  defined
	 with the old syntax.

     sfunc
	 The  name  of the state transition function to be called for each input
	 row. For a normal N-argument aggregate function, the  sfunc  must  take
	 N+1  arguments,  the  first  being of type state_data_type and the rest
	 matching the declared input data type(s) of the aggregate. The function
	 must return a value of type state_data_type. This  function  takes  the
	 current  state  value	and the current input data value(s), and returns
	 the next state value.

	 For ordered-set  (including  hypothetical-set)  aggregates,  the  state
	 transition  function  receives only the current state value and the ag-
	 gregated arguments, not the direct arguments. Otherwise it is the same.

     state_data_type
	 The data type for the aggregate's state value.

     state_data_size
	 The approximate average size (in bytes) of the aggregate's state value.
	 If this parameter is omitted or is zero, a  default  estimate	is  used
	 based	on  the state_data_type. The planner uses this value to estimate
	 the memory required for a grouped aggregate query.

     ffunc
	 The name of the final function called to compute the aggregate's result
	 after all input rows have been traversed. For a normal aggregate,  this
	 function  must  take a single argument of type state_data_type. The re-
	 turn data type of the aggregate is defined as the return type	of  this
	 function.  If	ffunc  is  not specified, then the ending state value is
	 used as the aggregate's result, and the return type is state_data_type.

	 For ordered-set  (including  hypothetical-set)  aggregates,  the  final
	 function  receives  not only the final state value, but also the values
	 of all the direct arguments.

	 If FINALFUNC_EXTRA is specified, then in addition to  the  final  state
	 value	and any direct arguments, the final function receives extra NULL
	 values corresponding to the aggregate's regular (aggregated) arguments.
	 This is mainly useful to allow correct resolution of the aggregate  re-
	 sult type when a polymorphic aggregate is being defined.

     FINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE }
	 This  option  specifies  whether  the final function is a pure function
	 that does not modify its arguments.  READ_ONLY indicates it  does  not;
	 the  other  two values indicate that it may change the transition state
	 value. See Notes below for more detail. The default is  READ_ONLY,  ex-
	 cept for ordered-set aggregates, for which the default is READ_WRITE.

     combinefunc
	 The  combinefunc  function may optionally be specified to allow the ag-
	 gregate function to support partial aggregation. If provided, the  com-
	 binefunc  must  combine two state_data_type values, each containing the
	 result of aggregation over some subset of the input values, to  produce
	 a  new  state_data_type  that represents the result of aggregating over
	 both sets of inputs. This function can be thought of as an sfunc, where
	 instead of acting upon an individual input row and  adding  it  to  the
	 running aggregate state, it adds another aggregate state to the running
	 state.

	 The  combinefunc  must  be  declared  as  taking  two	arguments of the
	 state_data_type and returning a value of the  state_data_type.  Option-
	 ally  this function may be "strict". In this case the function will not
	 be called when either of the input states are	null;  the  other  state
	 will be taken as the correct result.

	 For aggregate functions whose state_data_type is internal, the combine-
	 func  must not be strict. In this case the combinefunc must ensure that
	 null states are handled correctly and that the state being returned  is
	 properly stored in the aggregate memory context.

     serialfunc
	 An aggregate function whose state_data_type is internal can participate
	 in  parallel  aggregation  only  if it has a serialfunc function, which
	 must serialize the aggregate state into a bytea value for  transmission
	 to  another  process. This function must take a single argument of type
	 internal and return type bytea. A corresponding  deserialfunc	is  also
	 required.

     deserialfunc
	 Deserialize   a   previously	serialized  aggregate  state  back  into
	 state_data_type. This function must take two arguments of  types  bytea
	 and internal, and produce a result of type internal. (Note: the second,
	 internal argument is unused, but is required for type safety reasons.)

     initial_condition
	 The initial setting for the state value. This must be a string constant
	 in  the  form accepted for the data type state_data_type. If not speci-
	 fied, the state value starts out null.

     msfunc
	 The name of the forward state transition function to be called for each
	 input row in moving-aggregate mode. This is exactly  like  the  regular
	 transition  function,	except that its first argument and result are of
	 type mstate_data_type, which might be different from state_data_type.

     minvfunc
	 The name of the inverse state transition function to be  used	in  mov-
	 ing-aggregate	mode.  This  function  has  the same argument and result
	 types as msfunc, but it is used to remove a value from the current  ag-
	 gregate  state,  rather  than add a value to it. The inverse transition
	 function must have the same strictness attribute as the  forward  state
	 transition function.

     mstate_data_type
	 The data type for the aggregate's state value, when using moving-aggre-
	 gate mode.

     mstate_data_size
	 The approximate average size (in bytes) of the aggregate's state value,
	 when	using	moving-aggregate   mode.   This   works   the	same  as
	 state_data_size.

     mffunc
	 The name of the final function called to compute the aggregate's result
	 after all input rows have been traversed, when  using	moving-aggregate
	 mode.	This  works  the same as ffunc, except that its first argument's
	 type is mstate_data_type and extra dummy  arguments  are  specified  by
	 writing  MFINALFUNC_EXTRA.  The aggregate result type determined by mf-
	 func or mstate_data_type must match that determined by the  aggregate's
	 regular implementation.

     MFINALFUNC_MODIFY = { READ_ONLY | SHAREABLE | READ_WRITE }
	 This  option is like FINALFUNC_MODIFY, but it describes the behavior of
	 the moving-aggregate final function.

     minitial_condition
	 The initial setting for the state value,  when  using	moving-aggregate
	 mode. This works the same as initial_condition.

     sort_operator
	 The  associated sort operator for a MIN- or MAX-like aggregate. This is
	 just an operator name (possibly schema-qualified). The operator is  as-
	 sumed to have the same input data types as the aggregate (which must be
	 a single-argument normal aggregate).

     PARALLEL = { SAFE | RESTRICTED | UNSAFE }
	 The meanings of PARALLEL SAFE, PARALLEL RESTRICTED, and PARALLEL UNSAFE
	 are the same as in CREATE FUNCTION. An aggregate will not be considered
	 for  parallelization  if it is marked PARALLEL UNSAFE (which is the de-
	 fault!) or PARALLEL RESTRICTED. Note that the parallel-safety	markings
	 of  the aggregate's support functions are not consulted by the planner,
	 only the marking of the aggregate itself.

     HYPOTHETICAL
	 For ordered-set aggregates only, this flag specifies that the aggregate
	 arguments are to be processed according to the requirements  for  hypo-
	 thetical-set  aggregates:  that  is, the last few direct arguments must
	 match the data types of the aggregated (WITHIN  GROUP)  arguments.  The
	 HYPOTHETICAL	flag  has  no  effect  on  run-time  behavior,	only  on
	 parse-time resolution of the data types and collations  of  the  aggre-
	 gate's arguments.

     The  parameters  of  CREATE AGGREGATE can be written in any order, not just
     the order illustrated above.

NOTES
     In parameters that specify support function names, you can write  a  schema
     name if needed, for example SFUNC = public.sum. Do not write argument types
     there,  however  --  the argument types of the support functions are deter-
     mined from other parameters.

     Ordinarily, PostgreSQL functions are expected to be true functions that  do
     not  modify  their input values. However, an aggregate transition function,
     when used in the context of an aggregate, is allowed to  cheat  and  modify
     its  transition-state  argument in place. This can provide substantial per-
     formance benefits compared to making a fresh copy of the  transition  state
     each time.

     Likewise,	while  an  aggregate  final function is normally expected not to
     modify its input values, sometimes it is impractical to avoid modifying the
     transition-state argument. Such behavior must be declared using the  FINAL-
     FUNC_MODIFY  parameter. The READ_WRITE value indicates that the final func-
     tion modifies the transition state in unspecified ways. This value prevents
     use of the aggregate as a window function, and it also prevents merging  of
     transition  states for aggregate calls that share the same input values and
     transition functions. The SHAREABLE value	indicates  that  the  transition
     function  cannot  be  applied  after  the	final function, but multiple fi-
     nal-function calls can be performed on the ending transition  state  value.
     This  value  prevents use of the aggregate as a window function, but it al-
     lows merging of transition states. (That is, the optimization  of	interest
     here  is not applying the same final function repeatedly, but applying dif-
     ferent final functions to the same ending transition state value.	This  is
     allowed as long as none of the final functions are marked READ_WRITE.)

     If an aggregate supports moving-aggregate mode, it will improve calculation
     efficiency  when  the  aggregate  is used as a window function for a window
     with moving frame start (that is, a frame start mode other  than  UNBOUNDED
     PRECEDING). Conceptually, the forward transition function adds input values
     to  the aggregate's state when they enter the window frame from the bottom,
     and the inverse transition function removes them again when they leave  the
     frame  at	the top. So, when values are removed, they are always removed in
     the same order they were added. Whenever the inverse transition function is
     invoked, it will thus receive the earliest added but not yet removed  argu-
     ment value(s). The inverse transition function can assume that at least one
     row will remain in the current state after it removes the oldest row. (When
     this  would  not be the case, the window function mechanism simply starts a
     fresh aggregation, rather than using the inverse transition function.)

     The forward transition function for moving-aggregate mode is not allowed to
     return NULL as the new state value. If the inverse transition function  re-
     turns NULL, this is taken as an indication that the inverse function cannot
     reverse  the state calculation for this particular input, and so the aggre-
     gate calculation will be redone from scratch for the current frame starting
     position. This convention allows moving-aggregate mode to be used in situa-
     tions where there are some infrequent cases that are impractical to reverse
     out of the running state value.

     If no moving-aggregate implementation is supplied, the aggregate can  still
     be  used with moving frames, but PostgreSQL will recompute the whole aggre-
     gation whenever the start of the frame moves. Note that whether or not  the
     aggregate	supports  moving-aggregate  mode, PostgreSQL can handle a moving
     frame end without recalculation; this is done by continuing to add new val-
     ues to the aggregate's state. This is why use of an aggregate as  a  window
     function  requires that the final function be read-only: it must not damage
     the aggregate's state value, so that the aggregation can be continued  even
     after  an	aggregate  result  value  has been obtained for one set of frame
     boundaries.

     The syntax for ordered-set aggregates allows VARIADIC to be  specified  for
     both the last direct parameter and the last aggregated (WITHIN GROUP) para-
     meter. However, the current implementation restricts use of VARIADIC in two
     ways.  First, ordered-set aggregates can only use VARIADIC "any", not other
     variadic array types. Second, if the  last  direct  parameter  is	VARIADIC
     "any",  then there can be only one aggregated parameter and it must also be
     VARIADIC "any". (In the representation used in the system	catalogs,  these
     two  parameters are merged into a single VARIADIC "any" item, since pg_proc
     cannot represent functions with more than one VARIADIC parameter.)  If  the
     aggregate	is a hypothetical-set aggregate, the direct arguments that match
     the VARIADIC "any" parameter are the hypothetical ones; any preceding para-
     meters represent additional direct arguments that are  not  constrained  to
     match the aggregated arguments.

     Currently,  ordered-set  aggregates do not need to support moving-aggregate
     mode, since they cannot be used as window functions.

     Partial (including parallel) aggregation is currently not supported for or-
     dered-set aggregates. Also, it will never be used for aggregate calls  that
     include  DISTINCT or ORDER BY clauses, since those semantics cannot be sup-
     ported during partial aggregation.

EXAMPLES
     See Section 36.12.

COMPATIBILITY
     CREATE AGGREGATE is a PostgreSQL language extension. The SQL standard  does
     not provide for user-defined aggregate functions.

SEE ALSO
     ALTER AGGREGATE (ALTER_AGGREGATE(7)), DROP AGGREGATE (DROP_AGGREGATE(7))

PostgreSQL 18.6 		      2026		     CREATE AGGREGATE(7)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=CREATE_AGGREGATE&sektion=7&manpath=FreeBSD+Ports+15.1.quarterly>

home | help