MySQL 可加载函数接口提供以下功能和特性
函数可以返回字符串、整数或实数,并可以接受相同类型的参数。
您可以定义一次操作单行数据的简单函数,或操作一组行的聚合函数。
函数可以获取信息以帮助它们检查传递给它们的参数的数量、类型和名称。
您可以告诉 MySQL 在将参数传递给函数之前将它们强制转换为给定的类型。
您可以指示函数返回
NULL
或发生错误。
为了使可加载函数机制正常工作,函数必须用 C++ 编写,并且您的操作系统必须支持动态加载。MySQL 源代码发行版包含一个文件 sql/udf_example.cc
,它定义了五个可加载函数接口函数。请参考此文件以了解可加载函数调用约定是如何工作的。 include/mysql_com.h
头文件定义了可加载函数相关的符号和数据结构,尽管您不需要直接包含此头文件;它由 mysql.h
包含。
可加载函数包含成为运行服务器一部分的代码,因此当您编写可加载函数时,您受限于适用于编写服务器代码的所有约束。例如,如果您尝试使用来自 libstdc++
库的函数,则可能会遇到问题。这些约束可能会在服务器的未来版本中发生变化,因此服务器升级可能会要求对最初为旧服务器编写的可加载函数进行修改。有关这些约束的信息,请参见 MySQL 源代码配置选项 和 处理编译 MySQL 时的错误。
要能够使用可加载函数,您必须动态链接 mysqld。如果您想使用需要访问来自 mysqld 的符号的可加载函数(例如,sql/udf_example.cc
中的 metaphone
函数使用 default_charset_info
),您必须使用 -rdynamic
链接程序(请参见 man dlopen
)。
对于您要在 SQL 语句中使用的每个函数,您都应该定义相应的 C++ 函数。在下面的讨论中,名称 “xxx” 用于作为示例函数名。为了区分 SQL 和 C++ 的用法,XXX()
(大写)表示 SQL 函数调用,xxx()
(小写)表示 C++ 函数调用。
使用 C++ 时,将您的 C 函数封装在这个结构中
extern "C" { ... }
这确保了您的 C++ 函数名称在完成的函数中保持可读。
以下列表描述了您编写的用于实现名为 XXX()
的函数的接口的 C++ 函数。主函数 xxx()
是必需的。此外,可加载函数至少需要以下列出的其他函数之一,原因在 可加载函数安全预防措施 中讨论。
-
xxx()
主函数。这是计算函数结果的地方。SQL 函数数据类型与您的 C++ 函数的返回类型之间的对应关系如下所示。
也可以声明
DECIMAL
函数,但其值以字符串形式返回,因此您应该像编写STRING
函数一样编写该函数。ROW
函数未实现。 -
xxx_init()
xxx()
的初始化函数。如果存在,它可以用于以下目的检查传递给
XXX()
的参数数量。验证参数是否为所需的类型,或者在调用主函数时告诉 MySQL 将参数强制转换为所需的类型。
为主函数分配任何所需的内存。
指定结果的最大长度。
指定(对于
REAL
函数)结果中最多的小数位数。指定结果是否可以为
NULL
。
-
xxx_deinit()
xxx()
的去初始化函数。如果存在,它应该释放初始化函数分配的任何内存。
当 SQL 语句调用 XXX()
时,MySQL 会调用初始化函数 xxx_init()
,让它执行任何必要的设置,例如参数检查或内存分配。如果 xxx_init()
返回错误,MySQL 会使用错误消息中止 SQL 语句,并且不会调用主函数或去初始化函数。否则,MySQL 会为每一行调用一次主函数 xxx()
。在处理完所有行之后,MySQL 会调用去初始化函数 xxx_deinit()
,以便它可以执行任何必要的清理工作。
对于类似于 SUM()
的聚合函数,您还必须提供以下函数
-
xxx_clear()
重置当前的聚合值,但不将参数插入为新组的初始聚合值。
-
xxx_add()
将参数添加到当前的聚合值。
MySQL 处理聚合可加载函数的方式如下
调用
xxx_init()
,让聚合函数分配存储结果所需的任何内存。根据
GROUP BY
表达式对表进行排序。对每个新组中的第一行调用
xxx_clear()
。对属于同一组的每一行调用
xxx_add()
。当组发生变化或处理完最后一行后,调用
xxx()
以获取聚合的结果。重复步骤 3 到 5,直到处理完所有行
调用
xxx_deinit()
,让函数释放它分配的任何内存。
所有函数必须是线程安全的。这不仅包括主函数,还包括初始化和去初始化函数,以及聚合函数所需的额外函数。此要求的一个结果是,您不允许分配任何会改变的全局或静态变量!如果您需要内存,您必须在 xxx_init()
中分配它并在 xxx_deinit()
中释放它。
本节描述了创建简单可加载函数时必须定义的不同接口函数。有关 MySQL 调用这些函数的顺序信息,请参见 可加载函数接口函数。
主 xxx()
函数应按本节所示声明。请注意,返回值和参数根据您在 CREATE FUNCTION
语句中声明 SQL 函数 XXX()
返回 STRING
、INTEGER
还是 REAL
而有所不同
对于 STRING
函数
char *xxx(UDF_INIT *initid, UDF_ARGS *args,
char *result, unsigned long *length,
char *is_null, char *error);
对于 INTEGER
函数
long long xxx(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error);
对于 REAL
函数
double xxx(UDF_INIT *initid, UDF_ARGS *args,
char *is_null, char *error);
DECIMAL
函数返回字符串值,其声明方式与 STRING
函数相同。 ROW
函数未实现。
像这样声明初始化和去初始化函数
bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
void xxx_deinit(UDF_INIT *initid);
initid
参数传递给所有三个函数。它指向一个 UDF_INIT
结构,用于在函数之间传递信息。 UDF_INIT
结构成员如下。初始化函数应该填写它希望更改的任何成员。(要使用成员的默认值,请将其保持不变。)
-
bool maybe_null
如果
xxx()
可以返回NULL
,则xxx_init()
应该将maybe_null
设置为1
。如果任何参数声明为maybe_null
,则默认值为1
。 -
unsigned int decimals
小数点右侧的小数位数。默认值为传递给主函数的参数中最大的小数位数。例如,如果函数传递了
1.34
、1.345
和1.3
,则默认值为 3,因为1.345
有 3 位小数。对于没有固定小数位数的参数,
decimals
值被设置为 31,比DECIMAL
、FLOAT
和DOUBLE
数据类型允许的最大小数位数多 1。此值在mysql_com.h
头文件中作为常量NOT_FIXED_DEC
可用。在以下情况下,参数使用 31 的
decimals
值:例如,没有显式声明小数位数的FLOAT
或DOUBLE
列(例如,FLOAT
而不是FLOAT(10,3)
),以及浮点常量,例如1345E-3
。它还用于字符串和其他可能在函数中转换为数字形式的非数字参数。decimals
成员初始化的值只是一个默认值。它可以在函数内部更改,以反映实际执行的计算。默认值由参数中最大小数位数确定。如果即使只有一个参数的小数位数为NOT_FIXED_DEC
,则该值将用于decimals
。 -
无符号整数 max_length
结果的最大长度。默认的
max_length
值取决于函数的结果类型。对于字符串函数,默认值为最长参数的长度。对于整数函数,默认值为 21 位。对于实数函数,默认值为 13 加上由initid->decimals
指示的小数位数。(对于数字函数,长度包括任何符号或小数点字符。)如果要返回 blob 值,可以将
max_length
设置为 65KB 或 16MB。不会分配此内存,但该值用于确定在需要临时存储数据时使用哪种数据类型。 -
字符 *ptr
函数可以将其用于自身目的的指针。例如,函数可以使用
initid->ptr
在彼此之间传递分配的内存。xxx_init()
应该分配内存并将它分配给此指针initid->ptr = allocated_memory;
在
xxx()
和xxx_deinit()
中,引用initid->ptr
来使用或释放内存。 -
布尔 const_item
xxx_init()
应该将const_item
设置为1
(如果xxx()
始终返回相同的值)或0
(否则)。
本节介绍在创建聚合可加载函数时需要定义的不同接口函数。有关 MySQL 调用这些函数的顺序的信息,请参阅 可加载函数接口函数。
-
xxx_reset()
当 MySQL 找到新组中的第一行时,将调用此函数。它应该重置任何内部摘要变量,然后使用给定的
UDF_ARGS
参数作为组内部摘要值中的第一个值。以下声明xxx_reset()
:void xxx_reset(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
xxx_reset()
在 MySQL 9.0 中不需要或不使用,在 MySQL 9.0 中,可加载函数接口使用xxx_clear()
而不是它。但是,如果要使函数与旧版本的服务器一起使用,则可以同时定义xxx_reset()
和xxx_clear()
。(如果您确实包含这两个函数,则在许多情况下,xxx_reset()
函数可以在内部通过调用xxx_clear()
来重置所有变量,然后调用xxx_add()
来将UDF_ARGS
参数添加为组中的第一个值。) -
xxx_clear()
当 MySQL 需要重置摘要结果时,将调用此函数。它在每个新组的开头被调用,但也可以被调用来重置没有匹配行的查询的值。以下声明
xxx_clear()
:void xxx_clear(UDF_INIT *initid, char *is_null, char *error);
在调用
xxx_clear()
之前,将is_null
设置为指向CHAR(0)
。如果出现错误,可以在
error
参数指向的变量中存储一个值。error
指向单个字节变量,而不是字符串缓冲区。xxx_clear()
是 MySQL 9.0 所必需的。 -
xxx_add()
此函数针对属于同一组的所有行调用。您应该使用它将
UDF_ARGS
参数中的值添加到您的内部摘要变量。void xxx_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
聚合可加载函数的 xxx()
函数的声明方式应与非聚合可加载函数的声明方式相同。请参阅 简单函数的可加载函数调用序列。
对于聚合可加载函数,MySQL 在处理完组中的所有行后调用 xxx()
函数。通常您不应该在这里访问其 UDF_ARGS
参数,而应该根据您的内部摘要变量返回一个值。
xxx()
中的返回值处理应与非聚合可加载函数的处理方式相同。请参阅 可加载函数返回值和错误处理。
xxx_reset()
和 xxx_add()
函数处理其 UDF_ARGS
参数的方式与非聚合 UDF 函数相同。请参阅 可加载函数参数处理。
对 is_null
和 error
的指针参数对所有对 xxx_reset()
、xxx_clear()
、xxx_add()
和 xxx()
的调用都是相同的。您可以使用此功能来记住是否发生了错误,或者 xxx()
函数是否应该返回 NULL
。您不应该将字符串存储到 *error
中! error
指向单个字节变量,而不是字符串缓冲区。
*is_null
针对每个组重置(在调用 xxx_clear()
之前)。 *error
从不重置。
如果在 xxx()
返回时设置了 *is_null
或 *error
,MySQL 会将 NULL
作为组函数的结果返回。
args
参数指向具有此处列出的成员的 UDF_ARGS
结构
-
无符号整数 arg_count
参数的数量。如果需要函数以特定数量的参数调用,则在初始化函数中检查此值。例如
if (args->arg_count != 2) { strcpy(message,"XXX() requires two arguments"); return 1; }
对于其他
UDF_ARGS
成员值(即数组),数组引用以 0 为基准。也就是说,使用从 0 到args->arg_count
− 1 的索引值引用数组成员。 -
枚举 Item_result *arg_type
指向包含每个参数类型的数组的指针。可能的类型值为
STRING_RESULT
、INT_RESULT
、REAL_RESULT
和DECIMAL_RESULT
。要确保参数是给定类型,并在它们不是给定类型时返回错误,请在初始化函数中检查
arg_type
数组。例如if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT) { strcpy(message,"XXX() requires a string and an integer"); return 1; }
类型为
DECIMAL_RESULT
的参数作为字符串传递,因此您以与STRING_RESULT
值相同的方式处理它们。作为要求函数参数为特定类型的替代方法,可以使用初始化函数将
arg_type
元素设置为所需的类型。这会导致 MySQL 在每次调用xxx()
时将参数强制转换为这些类型。例如,要指定前两个参数应分别强制转换为字符串和整数,请在xxx_init()
中执行以下操作args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT;
精确值小数参数(例如
1.3
或DECIMAL
列值)以DECIMAL_RESULT
类型传递。但是,值作为字符串传递。要接收数字,请使用初始化函数指定应将参数强制转换为REAL_RESULT
值args->arg_type[2] = REAL_RESULT;
-
字符 **args
args->args
向初始化函数传递有关传递给函数的参数的总体性质的信息。对于常量参数i
,args->args[i]
指向参数值。(有关如何正确访问值的说明,请参见后面。)对于非常量参数,args->args[i]
为0
。常量参数是仅使用常量的表达式,例如3
或4*7-2
或SIN(3.14)
。非常量参数是指可能在行之间发生变化的值的表达式,例如列名或使用非常量参数调用的函数。对于主函数的每次调用,
args->args
包含当前正在处理的行传递的实际参数。如果参数
i
表示NULL
,则args->args[i]
为空指针 (0)。如果参数不是NULL
,则函数可以按如下方式引用它-
类型为
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
值一样处理。ROW_RESULT
参数未实现。
-
-
无符号长整型 *lengths
对于初始化函数,
lengths
数组指示每个参数的最大字符串长度。您不应该更改这些。对于主函数的每次调用,lengths
包含当前正在处理的行传递的任何字符串参数的实际长度。对于类型为INT_RESULT
或REAL_RESULT
的参数,lengths
仍然包含参数的最大长度(如初始化函数)。 -
字符 *maybe_null
对于初始化函数,
maybe_null
数组指示每个参数的值是否可能为 null(0 表示否,1 表示是)。 -
字符 **attributes
args->attributes
传递有关函数参数名称的信息。对于参数i
,属性名称可作为字符串在args->attributes[i]
中获得,属性长度为args->attribute_lengths[i]
。不要假设字符串以 null 结尾。默认情况下,函数参数的名称是用于指定参数的表达式的文本。对于可加载函数,参数也可以有一个可选的
[AS]
子句,在这种情况下,参数名称为别名
别名
。因此,每个参数的attributes
值取决于是否给出了别名。假设可加载函数
my_udf()
如下调用SELECT my_udf(expr1, expr2 AS alias1, expr3 alias2);
在这种情况下,
attributes
和attribute_lengths
数组将具有以下值args->attributes[0] = "expr1" args->attribute_lengths[0] = 5 args->attributes[1] = "alias1" args->attribute_lengths[1] = 6 args->attributes[2] = "alias2" args->attribute_lengths[2] = 6
-
unsigned long *attribute_lengths
attribute_lengths
数组指示每个参数名称的长度。
如果未发生错误,初始化函数应返回 0
,否则返回 1
。如果发生错误,xxx_init()
应该将一个以 null 结尾的错误消息存储在 message
参数中。该消息将返回给客户端。消息缓冲区是 MYSQL_ERRMSG_SIZE
个字符长。尽量使消息长度小于 80 个字符,以便它适合标准终端屏幕的宽度。
主函数 xxx()
的返回值是函数值,对于 long long
和 double
函数而言。字符串函数应返回指向结果的指针,并将 *length
设置为返回值的长度(以字节为单位)。例如
memcpy(result, "result string", 13);
*length = 13;
MySQL 使用 result
参数将缓冲区传递给 xxx()
函数。该缓冲区足够长,可以容纳 255 个字符,这些字符可以是多字节字符。如果结果适合,xxx()
函数可以将结果存储在该缓冲区中,在这种情况下,返回值应该指向该缓冲区。如果函数将结果存储在不同的缓冲区中,则它应该返回指向该缓冲区的指针。
如果你的字符串函数不使用提供的缓冲区(例如,如果它需要返回一个长度大于 255 个字符的字符串),你必须在 xxx_init()
函数或 xxx()
函数中使用 malloc()
为你自己的缓冲区分配空间,并在你的 xxx_deinit()
函数中释放它。你可以在 UDF_INIT
结构中的 ptr
槽中存储已分配的内存,以便将来 xxx()
调用重用。参见 简单函数的可加载函数调用序列.
有关字符串参数的更多信息,请参阅 可加载函数字符集处理。
要指示主函数中 NULL
的返回值,请将 *is_null
设置为 1
*is_null = 1;
要指示主函数中的错误返回,请将 *error
设置为 1
*error = 1;
如果 xxx()
将 *error
设置为 1
用于任何行,则函数值对于当前行以及由调用 XXX()
的语句处理的任何后续行都是 NULL
。(xxx()
甚至不会被调用以处理后续行。)
默认情况下,可加载函数不考虑字符串参数或返回值的字符集或排序规则。实际上,字符串参数和返回值被视为二进制字符串,这意味着只有包含单字节字符的字符串参数才能可靠地处理。
在 MySQL 9.0 中,用于编写可加载函数的接口使可加载函数能够确定字符串参数的字符集和排序规则,并返回具有特定字符集和排序规则的字符串。这些功能对于可加载函数编写者是可选的,他们可以根据需要利用这些功能。
在与 MySQL 一起发布的可加载函数中,与以下功能和扩展相关的函数利用了这些字符集功能:MySQL Enterprise Audit、MySQL Enterprise Firewall、MySQL Enterprise Data Masking and De-Identification、MySQL Keyring(仅适用于通用密钥环可加载函数,不适用于特定于特定密钥环插件的函数)和 Group Replication。这仅在有意义的情况下适用。例如,返回加密数据的可加载函数 旨在返回二进制字符串,而不是字符字符串。
可加载函数的字符集功能是使用 mysql_udf_metadata
服务器组件服务实现的。有关此服务的更多信息,请参见 MySQL Server Doxygen 文档,可从 https://dev.mysqlserver.cn/doc/index-other.html 获取(搜索 s_mysql_mysql_udf_metadata
和 udf_metadata_imp
)。MySQL Keyring 可加载函数的源代码在社区源代码分发版中可用,可以将其作为第三方可加载函数编写者希望修改其自己的可加载函数以使其能够识别字符集的示例。
如果可加载函数接受字符串参数或返回字符串值,并且已修改为能够识别字符集,则以下兼容性考虑因素适用
对于它们传递给可加载函数的参数,应用程序将继续工作,因为该函数现在能够处理任何字符集中的字符串参数,包括二进制字符串。
如果可加载函数要以与其参数的字符集不同的字符集返回字符串结果,则该函数必须在内部执行字符集转换。例如,如果函数接受
latin1
参数但返回utf8mb4
结果,则情况就是这样。
实现可加载函数的文件必须在服务器运行的主机上编译和安装。以下描述了 MySQL 源代码分发版中包含的可加载函数示例文件 sql/udf_example.cc
的过程。有关可加载函数安装的更多信息,请参见 安装和卸载可加载函数.
如果可加载函数将在将被复制到副本的语句中被引用,则必须确保每个副本也都有该函数可用。否则,当副本尝试调用该函数时,复制将失败。
udf_example.cc
文件包含以下函数
metaphon()
返回字符串参数的元音字符串。这有点像 Soundex 字符串,但它更适合英语。myfunc_double()
返回其参数中字符的 ASCII 值之和,除以其参数的长度之和。myfunc_int()
返回其参数的长度之和。sequence([const int])
返回从给定数字开始的序列,如果没有给出数字,则从 1 开始。lookup()
返回主机名的 IP 地址。reverse_lookup()
返回 IP 地址的主机名。该函数可以调用一次,使用形式为'xxx.xxx.xxx.xxx'
的单个字符串参数,也可以调用四次,使用四个数字。avgcost()
返回平均成本。这是一个聚合函数。
在 Unix 和类 Unix 系统上,使用以下过程编译可加载函数
动态可加载文件应编译为可共享库文件,使用类似于以下的命令
gcc -shared -o udf_example.so udf_example.cc
如果你使用的是带有 CMake 的 gcc(这是 MySQL 本身的配置方式),你应该能够使用更简单的命令创建 udf_example.so
make udf_example
编译包含可加载函数的共享对象后,你必须安装它并告诉 MySQL 有关它。使用 gcc 直接从 udf_example.cc
编译共享对象会生成一个名为 udf_example.so
的文件。将共享对象复制到服务器的插件目录,并将其命名为 udf_example.so
。此目录由 plugin_dir
系统变量的值给出。
在某些系统上,用于配置动态链接器的 ldconfig 程序不会识别共享对象,除非其名称以 lib
开头。在这种情况下,你应该将诸如 udf_example.so
之类的文件重命名为 libudf_example.so
。
在 Windows 上,使用以下过程编译可加载函数
获取 MySQL 源代码分发版。参见 如何获取 MySQL.
如果需要,从 http://www.cmake.org 获取 CMake 构建工具。(需要 2.6 或更高版本)。
在源代码树中,在
sql
目录中查找名为udf_example.def
和udf_example.cc
的文件。将这两个文件从该目录复制到你的工作目录。-
使用以下内容创建 CMake
makefile
(CMakeLists.txt
)PROJECT(udf_example) # Path for MySQL include directory INCLUDE_DIRECTORIES("c:/mysql/include") ADD_DEFINITIONS("-DHAVE_DLOPEN") ADD_LIBRARY(udf_example MODULE udf_example.cc udf_example.def) TARGET_LINK_LIBRARIES(udf_example wsock32)
-
创建 VC 项目和解决方案文件,替换适当的
generator
值cmake -G "generator"
调用 cmake --help 会显示你有效的生成器列表。
-
创建
udf_example.dll
devenv udf_example.sln /build Release
在所有平台上,将共享库文件复制到 plugin_dir
目录后,使用以下语句通知 mysqld 有关新函数的信息。文件名后缀因平台而异(例如,Unix 和类 Unix 系统为 .so
,Windows 为 .dll
),因此根据需要调整你的平台的 .so
后缀。
CREATE FUNCTION metaphon RETURNS STRING
SONAME 'udf_example.so';
CREATE FUNCTION myfunc_double RETURNS REAL
SONAME 'udf_example.so';
CREATE FUNCTION myfunc_int RETURNS INTEGER
SONAME 'udf_example.so';
CREATE FUNCTION sequence RETURNS INTEGER
SONAME 'udf_example.so';
CREATE FUNCTION lookup RETURNS STRING
SONAME 'udf_example.so';
CREATE FUNCTION reverse_lookup RETURNS STRING
SONAME 'udf_example.so';
CREATE AGGREGATE FUNCTION avgcost RETURNS REAL
SONAME 'udf_example.so';
安装后,函数将一直保持安装状态,直到被卸载。
要删除函数,请使用 DROP FUNCTION
DROP FUNCTION metaphon;
DROP FUNCTION myfunc_double;
DROP FUNCTION myfunc_int;
DROP FUNCTION sequence;
DROP FUNCTION lookup;
DROP FUNCTION reverse_lookup;
DROP FUNCTION avgcost;
CREATE FUNCTION
和 DROP FUNCTION
语句更新 mysql.func
系统表,该表充当可加载函数注册表。这些语句分别需要 INSERT
和 DELETE
权限,分别用于 mysql
数据库。
在正常的启动序列期间,服务器加载注册在 mysql.func
表中的函数。如果服务器使用 --skip-grant-tables
选项启动,则表中注册的函数不会加载,并且不可用。
MySQL 采取了一些措施来防止滥用可加载函数。
可加载函数库文件不能放置在任意目录中。它们必须位于服务器的插件目录中。此目录由 plugin_dir
系统变量的值给出。
要使用 CREATE FUNCTION
或 DROP FUNCTION
,你必须分别对 mysql
数据库具有 INSERT
或 DELETE
权限。这是必要的,因为这些语句会向 mysql.func
表添加和删除行。
可加载函数除了对应主函数 xxx()
的 xxx
符号外,还应至少定义一个符号。这些辅助符号对应 xxx_init()
、xxx_deinit()
、xxx_reset()
、xxx_clear()
和 xxx_add()
函数。 mysqld 还支持一个 --allow-suspicious-udfs
选项,用于控制是否可以加载仅包含 xxx
符号的可加载函数。默认情况下,此选项处于禁用状态,以防止尝试从除包含合法可加载函数的共享库文件以外的其他共享库文件加载函数。如果您有仅包含 xxx
符号的旧可加载函数,并且无法重新编译以包含辅助符号,则可能需要指定 --allow-suspicious-udfs
选项。否则,应避免启用它。