Sequência de Chamadas UDF para Funções Simples
A função principal deve ser declarada como mostrado aqui. Note que o tipo retornado e os parâmetros diferem, dependendo se você irá declarar a função SQL XXX() para retornar STRING, INTEGER, ou REAL na instrução CREATE FUNCTION:
Para funções STRING:
char *xxx(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error);
Para funções INTEGER:
long long xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
Para funções REAL:
double xxx(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
As funções de inicialização e finalização são declaradas desta forma:
my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void xxx_deinit(UDF_INIT *initid);
O parâmetro initid é passado para todas as três funções. Ela aponta para uma estrutura UDF_INIT que é usada para passar informações entre as funções. Os membros da estrutura UDF_INIT são listados abaixo. A função de inicialização deve estar em todos os menbros que desejam ser alterados. (Para utilizar o padrão para um membro, deixe-o inalterado.):
my_bool maybe_nullxxx_init()deve definirmaybe_nullcom1sexxx()pode retornarNULL. O valor padrão é1se qualquer um dos argumentos são declarados comomaybe_null.unsigned int decimalsNúmero de decimais. O valor padrão é o número máximo de deciamis no argumento passado na função principal. (Por exemplo, se a função é passada function is passed
1.34,1.345e1.3, o padrão seria 3, pois1.345tem 3 decimais.unsigned int max_lengthO tamanho máximo de um resultado string. O valor padrão difere dependendo do tipo de resultado da função. Para funções strings, o padrão é o temanho do maior argumento. Para funções do tipo inteiro, o padrão é 21 digitos. Para funções do tipo real, o padrão é 13 mais o número de decimais indicados por
initid->decimals. (Para funções numéricas, o tamanho inclui qualquer caracter de sinal ou ponto decimal.)Se você quiser retornar um blon, você pode definí-lo com 65K ou 16M; esta memória não é alocada, mas usada para decidir qual tipo de coluna utilizar se houver necessidade dese armazenar dados temporários.
char *ptrUm ponteiro que a função pode usar para o seus propósitos. Por exemplo, funções pode usar
initid->ptrpara comunicar memórias alocadas entre funções. Naxxx_init(), aloca a memória e a atribui a este ponteiro:initid->ptr = allocated_memory;
Em
xxx()exxx_deinit(), se refira ainitid->ptrpara usar ou liberar a memória.