暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

GBase 8a 函数参数形式及结构

生命之源 2022-02-23
848

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并释放内存。

1.2.2  args参数

这个参数指向一个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+2,select 1+2 as plus from t1 group by udf_func(plus);则args->attributes[0]为“plus”。

7         unsigned long *attribute_lengths

每个attributes的长度

 


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论