The functions described in Creating User-defined Functions are expanded on
this page. They are declared as follows:

Simple Functions
----------------

x()
---

If x() returns an integer, it is declared as follows:

long long x(UDF_INIT *initid, UDF_ARGS *args,
       char *is_null, char *error);

If x() returns a string (DECIMAL functions also return string values), it is
declared as follows:

char *x(UDF_INIT *initid, UDF_ARGS *args,
     char *result, unsigned long *length,
     char *is_null, char *error);

If x() returns a real, it is declared as follows:

double x(UDF_INIT *initid, UDF_ARGS *args,
       char *is_null, char *error);

x_init()
--------

my_bool x_init(UDF_INIT *initid, UDF_ARGS *args, char *message);

x_deinit()
----------

void x_deinit(UDF_INIT *initid);

Description
-----------

initid is a parameter passed to all three functions that points to a UDF_INIT
structure, used for communicating information between the functions. Its
structure members are:

* my_bool maybe_null
maybe_null should be set to 1 if x_init can return a NULL value, Defaults to 1
if any arguments are declared maybe_null.

* unsigned int decimals
Number of decimals after the decimal point. The default, if an explicit number
of decimals is passed in the arguments to the main function, is the maximum
number of decimals, so if 9.5, 9.55 and 9.555 are passed to the function, the
default would be three (based on 9.555, the maximum).  If there are no
explicit number of decimals, the default is set to 31, or one more than the
maximum for the DOUBLE, FLOAT and DECIMAL types. This default can be changed
in the function to suit the actual calculation.

* unsigned int max_length
Maximum length of the result. For integers, the default is 21. For strings,
the length of the longest argument. For reals, the default is 13 plus the
number of decimals indicated by initid->decimals. The length includes any
signs or decimal points. Can also be set to 65KB or 16MB in order to return a
BLOB. The memory remains unallocated, but this is used to decide on the data
type to use if the data needs to be temporarily stored.

* char *ptr
A pointer for use as required by the function. Commonly, initid->ptr is used
to communicate allocated memory, with x_init() allocating the memory and
assigning it to this pointer, x() using it, and x_deinit() de-allocating it.

* my_bool const_item
Should be set to 1 in x_init() if x() always returns the same value, otherwise
0.

Aggregate Functions
-------------------

x_clear()
---------

x_clear() is a required function for aggregate functions, and is declared as
follows:

void x_clear(UDF_INIT *initid, char *is_null, char *error);

It is called when the summary results need to be reset, that is at the
beginning of each new group. but also to reset the values when there were no
matching rows.

is_null is set to point to CHAR(0) before calling x_clear().

In the case of an error, you can store the value to which the error argument
points (a single-byte variable, not a string string buffer) in the variable.

x_reset()
---------

x_reset() is declared as follows:

void x_reset(UDF_INIT *initid, UDF_ARGS *args,
       char *is_null, char *error);

It is called on finding the first row in a new group. Should reset the summary
variables, and then use UDF_ARGS as the first value in the group's internal
summary value. The function is not required if the UDF interface uses
x_clear().

x_add()
-------

x_add() is declared as follows:

void x_add(UDF_INIT *initid, UDF_ARGS *args,
      char *is_null, char *error);

It is called for all rows belonging to the same group, and should be used to
add the value in UDF_ARGS to the internal summary variable.

x_remove()
----------

x_remove() was added in MariaDB 10.4 and is declared as follows (same as
x_add()):

void x_remove(UDF_INIT* initid, UDF_ARGS* args,
       char* is_null, char *error );

It adds more efficient support of aggregate UDFs as window functions.
x_remove() should "subtract" the row (reverse x_add()). In MariaDB 10.4
aggregate UDFs will work as WINDOW functions without x_remove() but it will
not be so efficient.

If x_remove() supported (defined) detected automatically.

URL: https://mariadb.com/kb/en/user-defined-functions-calling-sequences/