问题标签 [mysql-udf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
231 浏览

c++ - 返回 STRING 的 MySQL UDF 与数据重叠

因为这是我第一次编写 UDF,所以我尝试编写简单的 UDF 来返回传递给 UDF 的相同参数。

代码如下:

我的表有数据;

SELECT c_name FROM tbl;

这将返回数据为:

如果我使用 UDF 执行查询:

SELECT get_arg(c_name) FROM tbl;

这将返回:

看起来当第二行前 5 个字符被实际行数据替换时,字符串的其他部分是来自第一行的垃圾。

为什么会发生这种情况?我应该改变什么功能以避免字符串重叠?

0 投票
1 回答
64 浏览

mysql - 在大型更新时从 mysql 触发器向 gearman 发送作业

我正在使用 gearman 的 udf 从更新后触发器向 gearman 发送后台作业。

该文档说明了以下内容:

gman_do* 函数采用可选的第三个参数,即唯一的作业 ID。这允许您在同一个唯一 ID 下提交多个作业,它们将在队列中“合并”以仅运行一次。请注意,gearmand 只会合并队列中或正在运行的作业,它不会在作业完成后跟踪唯一 ID。例如,以下内容确保您只为每个主机运行一次作业:

SELECT gman_do_background("reverse", Host, Host) AS test FROM mysql.user;

这使它看起来已经准备好处理大量的行更新,而不会淹没我的齿轮工的队列。

但是当我一次更新 30k 行时,我的 gearman 守护程序会暂时无法访问,并且“netstat”在 4730 端口上显示 ~30k 连接,我想这可以解释原因。

知道如何在不减慢更新速度的情况下防止冻结发生吗?我只需要在整个更新查询后触发一次 gearman 作业,但据我所知,mysql/mariadb 不处理语句后触发器。

0 投票
1 回答
372 浏览

python - 使用 MySQL UDF 执行命令 - sys_exec 不起作用

我正在尝试从 MariaDB 服务器运行 python 脚本。我为此安装了 mysqludf 库。我正在尝试使用 sys_exec 函数运行脚本,但没有结果。我创建了一个测试文件,它只是一个带有“DONE”信息的 .txt 文件。

我以 root 用户身份执行命令,因此我拥有所有权限。运行命令:

SELECT sys_exec('python3 /home/Documents/test.py')

不执行任何操作并返回错误代码 512。运行命令:

SELECT sys_exec('sudo python3 /home/Documents/test.py')

返回错误代码 256。

我已经检查了 apparmor 状态,似乎没有什么问题:

我还仔细检查了 root 是否具有 sudo 权限,如果确实如此。

什么可能导致问题?有什么方法可以从 MariaDB 服务器运行 python 脚本吗?

0 投票
1 回答
725 浏览

mysql - MySQL UDF 返回“错误代码:1127。在库中找不到符号 'xx'”

我有一个用 Go 编写的 MySQL UDF,以前可以正常工作,但是如果我现在编译它不再起作用,并显示错误消息

错误代码:1127。在库中找不到符号“get_url_param”

UDF 在 GitHub 上:https ://github.com/StirlingMarketingGroup/mysql-get-url-param

如果我像这样检查旧编译文件的导出

这个文件在运行时工作得很好

但是当我用相同的命令编译相同的代码时

然后以同样的方式检查出口

一切看起来都不错。而且我可以告诉我我正在检查正确的文件,因为所有地址都不同(另外还有一个新行main.get_url_param.stkobj)。但是这次尝试添加它给了我关于 MySQL 如何在库中找不到符号的错误。

我非常确定编译命令保持不变,并且我认为它与 Go 版本没有任何关系,因为我测试回 Go 1.9 并且它做同样的事情,但仍然无法正常工作。

我已经上传了二进制文件和版本,旧版本可以运行新版本不可用。两个 .so 文件都以相同的方式复制到我的插件目录,所以我认为这与权限无关。此外,Go func 名称为小写肯定与此无关,因为即使我将函数重命名为 ,行为也是完全相同的GetURLParam,并且我可以看到导出为nm.

我确定我错过了一些东西,可能是编译命令,或者可能是一些 cgo 标志,但我不知道那会是什么。

0 投票
0 回答
34 浏览

c - 为什么 mkdir() 在 Ubuntu 中运行的 MySQL UDF 上没有执行?

我计划为我的 UDF 创建一个日志文件,该文件将位于/var/log目录中。所以我调用mkdire("/var/log/my_func",...)了 C 代码,但是在从 Mysql 和ls调用函数之后,没有创建目录。

我的主要目的是记录 UDF 错误,我也很感激有关如何将 UDF 错误记录到文件的任何提示。

这是代码示例:

我的函数返回一个整数,所以当我评论mkdir并返回一个随机 int 时,返回值显示在 MySQL

提前谢谢。

0 投票
1 回答
75 浏览

c++ - 删除 initid->ptr、MySQL 聚合函数 (UDF) 时失去与 MySQL 服务器的连接

我在 C++ 中创建了一个 MySQL 聚合 UDF。我char*从 MySQL 聚合 UDF 的最终函数返回。在void xxx_deinit(UDF_INIT initid)我正在释放我的函数使用的任何内存。我通过删除init->ptr.

我的 deinit 函数:

在 init 函数中,我初始化ptr如下:

我能够创建 UDF 并将其安装在 MySQL 服务器中。安装后,当我尝试调用该函数时,会弹出一条错误消息,如下所示:

delete initid->ptr;但是当我从函数中删除 line:时xxx_deinit(UDF_INIT * initid),我得到了所需的输出。但我猜这是错误的方法,因为它会导致内存泄漏。此外,相同的语句:delete initid->ptr;在返回类型的简单 UDF 的情况下不会产生错误char*。谁能告诉我我在这里做错了什么?任何形式的帮助或建议都会有很大帮助。提前致谢。

谁能帮我解决这个问题。