9.2.2.2 Последовательность вызова UDF для агрегатных функций | Оглавление | 9.2.2.4 Возвращаемые значения и обработка ошибок |
Параметр 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
также содержит
максимальную длину аргумента (как для функции инициализации).
9.2.2.2 Последовательность вызова UDF для агрегатных функций | Оглавление | 9.2.2.4 Возвращаемые значения и обработка ошибок |