添加本机函数
要添加本机MySQL函数,请使用此处描述的过程,该过程要求您使用源代码分发。您不能将本机函数添加到二进制分发中,因为必须修改MySQL源代码并从修改后的源编译MySQL。如果要迁移到其他版本的MySQL(例如,发布新版本时),则必须使用新版本重复该过程。
如果将在复制到从属服务器的语句中引用本机功能,则必须确保每个从属服务器也具有可用功能。否则,当从站尝试调用该函数时,复制将失败。
要添加本机功能,请按照以下步骤修改目录中的源文件sql
:
在中为函数创建一个子类
item_create.cc
:- 如果函数采用的参数固定数量,创建的一个子类
Create_func_arg0
,Create_func_arg1
,Create_func_arg2
,或Create_func_arg3
,分别取决于功能是否需要零个,一个,两个或三个参数。举例来说,看到的Create_func_uuid
,Create_func_abs
,Create_func_pow
,和Create_func_lpad
类。 - 如果函数采用可变数量的参数,则创建的子类
Create_native_func
。有关示例,请参见Create_func_concat
。
- 如果函数采用的参数固定数量,创建的一个子类
要提供可以在SQL语句中引用该函数的名称,请在
item_create.cc
此数组中添加一行来注册该名称:static Native_func_registry func_array[]您可以为同一功能注册多个名称。例如,请参阅线
"LCASE"
和"LOWER"
,这是别名Create_func_lcase
。- 在中
item_func.h
,声明一个继承自Item_num_func
或的类Item_str_func
,具体取决于您的函数返回数字还是字符串。 在中
item_func.cc
,根据要定义数字函数还是字符串函数,添加以下声明之一:double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)如果您从任何标准项(如
Item_num_func
)继承对象,则可能只需定义这些函数之一,并让父对象处理其他函数。例如,Item_str_func
该类定义了一个val()
函数,该函数将根据atof()
返回的值执行::str()
。如果函数不确定,则在项目构造函数中包含以下语句,以指示不应缓存函数结果:
current_thd->lex->safe_to_cache_query=0;
如果给定参数固定值的函数可以为不同的调用返回不同的结果,则它是不确定的。
您可能还应该定义以下对象函数:
void Item_func_newname::fix_length_and_dec()此函数至少应
max_length
基于给定的参数进行计算。max_length
是函数可以返回的最大字符数。maybe_null = 0
如果主函数无法返回NULL
值,则还应该设置该函数。该函数可以NULL
通过检查参数的maybe_null
变量来检查是否可以返回任何函数参数。参见Item_func_mod::fix_length_and_dec
有关如何执行此操作的典型示例。
所有功能必须是线程安全的。换句话说,在不使用互斥锁保护函数的情况下,请勿在函数中使用任何全局变量或静态变量。
如果NULL
要从::val()
,::val_int()
或返回,::str()
则应设置null_value
为1并返回0。
对于::str()
对象函数,这些其他注意事项适用:
- 该
String *str
参数提供一个字符串缓冲区,可用于保存结果。(有关String
类型的更多信息,请参见sql_string.h
文件。) - 该
::str()
函数应返回保存结果的字符串,或者(char*)0
结果为NULL
。 - 除非绝对必要,否则所有当前的字符串函数都将尝试避免分配任何内存!