1、 函数参数形式
1
主函数返回类型和参数的不同取决于CREATE FUNCTION语句中声明SQL函数func()返回类型
对SQL中返回STRING的函数,形式如下:
char *func(UDF_INIT *initid, UDF_ARGS *args,
char
*result, unsigned long *length,
char *is_null,
char *error);
对SQL中返回INTEGER函数,形式如下:
long long func(UDF_INIT *initid, UDF_ARGS
*args,
char *is_null, char *error);
对SQL中返回REAL函数,形式如下:
double func(UDF_INIT *initid, UDF_ARGS
*args,
char *is_null,
char *error);
2
初始化函数和结束函数的声明形式如下:
my_bool func_init(UDF_INIT *initid, UDF_ARGS
*args, char *message);
void func_deinit(UDF_INIT *initid);
2、参数结构
1.2.1 initid参数这个参数被传给所有3个函数,它指向一个UDF_INIT结构,被用来在函数之间传递信息。UDF_INIT结构成员列在下面。初始化函数应该初始化它想要改变的任何成员。(对一个成员使用缺省值,不改变它。)
1
my_bool maybe_null
如果func()能返回NULL,func_init()应该设置maybe_null为1。如果任何一个参数被声明为maybe_null,缺省值是1。
2
unsigned int decimals
小数位数目。缺省值是在被传给主函数的参数中小数位的最大数目。(例如,如果函数传递1.11、1.111和1.1,缺省值将是3,因为1.111有3个小数位。
3
unsigned int max_length
返回结果的最大长度。缺省值不同,取决于函数的结果类型。对字符串函数,缺省是最长的参数的长度。对整数函数,缺省是21位。对实数函数,缺省是13加上由initid->decimals指出的小数位数。(对数字函数,长度包括任何符号位或小数点字符。)
4
char *ptr
函数可以自己使用的一个指针。例如,函数能使用initid->ptr在函数之间传递分配的内存。在func_init()中,分配内存并将它赋给这个指针:
initid->ptr = allocated_memory;
在func()和func_deinit()中,使用initid->ptr并释放内存。
这个参数指向一个UDF_ARGS成员,其结构如下:
1
unsigned int arg_count
参数个数。如果函数有固定数量的参数,在初始化函数中检查这个值。例如:
if (args->arg_count != 1)
{
strcpy(message," func()
requires one arguments");
return 1;
}
2
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," func() requires a
string and an integer");
return 1;
}
另外也可以使用初始化函数把arg_type成员设置成所需类型。这样GBase为每个func()调用强制将参数转换成所需类型。例如,为了指定前两个参数是字符串和整数,可以在func_init()中这样做:
args->arg_type[0] = STRING_RESULT;
args->arg_type[1] = INT_RESULT;
3
char **args
args将函数的参数传递给初始化函数和主函数。函数引用第i个参数的方式如下:
一个STRING_RESULT类型的参数由一个字符串指针加一个长度给出,允许处理任意的长度的数据。字符串内容可由args->args[i]得到并且字符串长度是args->lengths[i]。不用考虑字符串是否以空(null)结束
对于一个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]);
对一个DECIMAL_RESULT类型的参数,处理方式同STRING_RESULT一样。
4
unsigned long *lengths
在初始化函数中,lengths数组指出每个参数的最大字符串长度。对于主函数调用,lengths为当前正在处理的行的任何字符串参数的实际长度。对INT_RESULT或REAL_RESULT类型的参数,lengths仍然包含参数的最大长度。
5
char *maybe_null
在初始化函数中,maybe_null指出每个参数是否允许为空(NULL)(1表示允许,0表示不允许);
6
char **attributes
每个参数的别名,如果不存在别名,就是参数实际名称,如:
select 1 from t1 group by udf_func(1+2);则args->attributes[0]为”1+
7
unsigned long
*attribute_lengths
每个attributes的长度




