• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 添加本机函数

    要添加本机MySQL函数,请使用此处描述的过程,该过程要求您使用源代码分发。您不能将本机函数添加到二进制分发中,因为必须修改MySQL源代码并从修改后的源编译MySQL。如果要迁移到其他版本的MySQL(例如,发布新版本时),则必须使用新版本重复该过程。

    如果将在复制到从属服务器的语句中引用本机功能,则必须确保每个从属服务器也具有可用功能。否则,当从站尝试调用该函数时,复制将失败。

    要添加本机功能,请按照以下步骤修改目录中的源文件sql

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

      • 如果函数采用的参数固定数量,创建的一个子类Create_func_arg0Create_func_arg1Create_func_arg2,或Create_func_arg3,分别取决于功能是否需要零个,一个,两个或三个参数。举例来说,看到的Create_func_uuidCreate_func_absCreate_func_pow,和Create_func_lpad类。
      • 如果函数采用可变数量的参数,则创建的子类Create_native_func。有关示例,请参见Create_func_concat
    2. 要提供可以在SQL语句中引用该函数的名称,请在item_create.cc此数组中添加一行来注册该名称:

      static Native_func_registry func_array[]
      

      您可以为同一功能注册多个名称。例如,请参阅线"LCASE""LOWER",这是别名Create_func_lcase

    3. 在中item_func.h,声明一个继承自Item_num_func或的类Item_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该类定义了一个val()函数,该函数将根据atof()返回的值执行::str()

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

      current_thd->lex->safe_to_cache_query=0;
      

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

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

      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
    • 除非绝对必要,否则所有当前的字符串函数都将尝试避免分配任何内存!