Параметр 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 **argsargs->argsпередает в функцию инициализации информацию общего характера об аргументах, с которыми была вызвана функция. Для константного аргументаiargs->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_RESULTlengthsтакже содержит максимальную длину аргумента (как для функции инициализации).