Spec-Zone .ru
спецификации, руководства, описания, API
|
This section describes the different functions that you need to define when you create a simple UDF. Section 23.3.2, "Adding a New User-Defined Function", describes the order in which MySQL calls these functions.
The main xxx()
function should be declared as shown in this section. Note that the
return type and parameters differ, depending on whether you declare the SQL function XXX()
to return STRING
, INTEGER
, or REAL
in the CREATE
FUNCTION
statement:
For STRING
functions:
char *xxx(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error);
For INTEGER
functions:
long long xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
For REAL
functions:
double xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
DECIMAL
functions return string values and should be declared the same way as STRING
functions. ROW
functions are not implemented.
The initialization and deinitialization functions are declared like this:
my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);void xxx_deinit(UDF_INIT *initid);
The initid
parameter is passed to all three functions. It points to a UDF_INIT
structure that is used to communicate information between functions. The
UDF_INIT
structure members follow. The initialization function should fill in any
members that it wishes to change. (To use the default for a member, leave it unchanged.)
my_bool maybe_null
xxx_init()
should set maybe_null
to 1
if xxx()
can return NULL
.
The default value is 1
if any of the arguments are declared maybe_null
.
unsigned int decimals
The number of decimal digits to the right of the decimal point. The default value is the maximum
number of decimal digits in the arguments passed to the main function. For example, if the function
is passed 1.34
, 1.345
, and 1.3
, the default would be 3, because 1.345
has 3 decimal digits.
For arguments that have no fixed number of decimals, the decimals
value
is set to 31, which is 1 more than the maximum number of decimals permitted for the DECIMAL
, FLOAT
, and DOUBLE
data types. In MySQL 5.6, this value is available as the
constant NOT_FIXED_DEC
in the mysql_com.h
header file.
A decimals
value of 31 is used for arguments in cases such as a FLOAT
or DOUBLE
column declared without an explicit number of decimals
(for example, FLOAT
rather than FLOAT(10,3)
) and
for floating-point constants such as 1345E-3
. It is also used for
string and other nonnumber arguments that might be converted within the function to numeric form.
The value to which the decimals
member is initialized is only a
default. It can be changed within the function to reflect the actual calculation performed. The
default is determined such that the largest number of decimals of the arguments is used. If the
number of decimals is NOT_FIXED_DEC
for even one of the arguments, that
is the value used for decimals
.
unsigned int max_length
The maximum length of the result. The default max_length
value differs
depending on the result type of the function. For string functions, the default is the length of the
longest argument. For integer functions, the default is 21 digits. For real functions, the default
is 13 plus the number of decimal digits indicated by initid->decimals
. (For numeric functions, the length includes any
sign or decimal point characters.)
If you want to return a blob value, you can set max_length
to 65KB or
16MB. This memory is not allocated, but the value is used to decide which data type to use if there
is a need to temporarily store the data.
char *ptr
A pointer that the function can use for its own purposes. For example, functions can use initid->ptr
to communicate allocated memory among themselves. xxx_init()
should allocate the memory and assign it to this pointer:
initid->ptr = allocated_memory;
In xxx()
and xxx_deinit()
, refer to initid->ptr
to use or deallocate the memory.
my_bool const_item
xxx_init()
should set const_item
to 1
if xxx()
always returns the same value and
to 0
otherwise.