6.3添加本机函数

要添加本机MySQL函数,请使用这里描述的过程,这要求您使用源代码发行版。不能向二进制发行版中添加本机函数,因为需要修改MySQL源代码并从修改后的源代码编译MySQL。如果您迁移到另一个版本的MySQL(例如,当一个新版本发布时),您必须对新版本重复这个过程。

如果将在复制到副本的语句中引用本机函数,则必须确保每个副本也有可用的函数。否则,当副本试图调用该函数时,复制将在副本上失败。

中修改源文件的以下步骤可添加本机函数sql目录:

  1. 中的函数创建一个子类item_create.cc

    • 如果函数接受固定数量的参数,则创建Create_func_arg0Create_func_arg1Create_func_arg2,或Create_func_arg3,这取决于函数是否接受0、1、2或3个参数。有关示例,请参见Create_func_uuidCreate_func_absCreate_func_pow,Create_func_lpad类。

    • 的子类Create_native_func.示例请参见Create_func_concat

  2. 若要提供可以在SQL语句中引用的函数名称,请将该名称注册在item_create.cc通过向这个数组中添加一行:

    静态Native_func_registry func_array []

    您可以为同一个函数注册多个名称。例如,参见“LCASE”而且“低”的别名Create_func_lcase

  3. item_func.h,声明从继承的类Item_num_funcItem_str_func,取决于函数返回的是数字还是字符串。

  4. 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类定义了一个瓦尔()执行的函数atof ()返回的值:: str ()

  5. 如果函数是非确定性的,则在项构造函数中包含以下语句,以指示函数结果不应被缓存:

    current_thd - > lex - > safe_to_cache_query = 0;

    如果给定固定的实参值,函数可以为不同的调用返回不同的结果,则该函数是非确定性的。

  6. 你可能还应该定义以下对象函数:

    空白Item_func_newname: fix_length_and_dec ()

    这个函数至少可以计算max_length根据给定的参数。max_length函数可以返回的最大字符数。这个函数也应该设置maybe_null = 0如果main函数不能返回a价值。函数可以检查函数参数是否可以返回通过检查参数maybe_null变量。看看Item_func_mod: fix_length_and_dec这是一个如何做到这一点的典型例子。

所有函数都必须是线程安全的。换句话说,在没有互斥锁保护的情况下,不要在函数中使用任何全局变量或静态变量。

如果你想回来::瓦尔():: val_int (),或:: str (),你应该设置null_value到1,返回0。

:: str ()对象函数,这些额外的注意事项适用:

  • 字符串* str参数提供一个字符串缓冲区,可用于保存结果。(有关字符串打字,看一下sql_string.h文件。)

  • :: str ()函数应该返回保存结果的字符串,或者(char *) 0如果结果是

  • 当前所有的字符串函数都尽量避免分配任何内存,除非绝对必要!