Параметр args указывает на структуру UDF_ARGS, содержащую перечисленные ниже поля:
-
unsigned int arg_count
Количество аргументов. Это значение следует проверять в функции инициализации, если необходимо, чтобы функция вызывалась с определенным количеством аргументов. Например:
if (args->arg_count != 2) { strcpy(message,"XXX() requires two arguments"); return 1; }
-
enum Item_result *arg_type
Тип для каждого аргумента. Возможные значения типа:
STRING_RESULT
,INT_RESULT
иREAL_RESULT
. Чтобы контролировать принадлежность аргументов к нужному типу и возвращать ошибку, если это не так, следует проверить массивarg_type
в функции инициализации. Например:if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT) { strcpy(message,"XXX() requires a string and an integer"); return 1; }
В качестве альтернативы требованию, чтобы аргументы были определенного типа, можно использовать функцию инициализации для назначения элементам
arg_type
выбранных типов. В этом случае MySQL будет приводить аргументы к этим типам для каждого вызоваxxx()
. Например, чтобы указать на приведение первых двух аргументов к строковому и целочисленному типам, выполните вxxx_init()
:args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT;
-
char **args
args->args
передает в функцию инициализации информацию общего характера об аргументах, с которыми была вызвана функция. Для константного аргументаi
args->args[i]
указывает на значение аргумента (ниже приведены инструкции о том, как правильно получать доступ к значениям). Для неконстантого аргументаargs->args[i]
есть0
. Константный аргумент - это выражение, в котором используются только константы, вроде3
или4*7-2
илиSIN(3.14)
. Неконстантный аргумент - это выражение, ссылающееся на значения, которые могут изменяться от строки к строке, такие как имена столбцов или обращения к функциям с неконстантными аргументами.Для каждого вызова главной функции
args->args
содержит фактические аргументы, переданные для обрабатываемой в данный момент строки.Функции могут ссылаться на аргумент
i
следующим образом:Аргумент типа
STRING_RESULT
передается в виде указателя на строку плюс длина, чтобы обеспечить обработку двоичных данных или данных произвольной длины. Содержимое строки доступно посредствомargs->args[i]
, а длина строки представляет собойargs->lengths[i]
. Не следует исходить из предположения, что символ\0
отмечает конец строки.-
Для аргумента типа
INT_RESULT
необходимо привестиargs->args[i]
к значению типаlong long
:long long int_val; int_val = *((long long*) args->args[i]);
-
Для аргумента типа
REAL_RESULT
необходимо привестиargs->args[i]
к значению типаdouble
:double real_val; real_val = *((double*) args->args[i]);
-
unsigned long *lengths
Для функции инициализации массив
lengths
указывает максимальную длину строки для каждого аргумента. Изменять этот массив нельзя. При каждом вызове главной функцииlengths
содержит фактические длины всех строковых аргументов, переданных для обрабатываемой в текущий момент строки. Для типов аргументовINT_RESULT
илиREAL_RESULT
lengths
также содержит максимальную длину аргумента (как для функции инициализации).