gpt4 book ai didi

c - 使用 hstore 在 C 中使用 PostgreSQL UDF

转载 作者:行者123 更新时间:2023-12-04 08:55:12 24 4
gpt4 key购买 nike

我正在用 C 编写 PostgreSQL 的扩展,我需要使用 hstore在我的 UDF 中。我可以毫无错误地构建(使用 pgxc),但不能在 SQL 查询中使用任何函数。

我试过 PG_LIBS=hstore 但在加载库时出现 undefined reference 错误。

接下来的尝试是 SHLIB_LINK=-L/usr/lib/postgresql/9.1/lib -lhstore(系统中不存在 libhstore.so,只有 hstore.so,所以我试过了带有 sym 和硬链接(hard link))并得到了

psql:libname.sql:69: ERROR:  could not load library
"/usr/lib/postgresql/9.1/lib/libname.so": libhstore.so: cannot open shared
object file: No such file or directory

最佳答案

根据内存,hstore 没有暴露太多 C API。您必须通过 server programming interface (SPI) 使用它,通过您的 C 扩展使用其 SQL 级接口(interface)。 更新:或者,as Tom Lane points out on the mailing list ,使用 fmgr 调用它公开的 SQL 函数,而不是使用 SPI 运行完整的 SQL 语句。 UPDATE2:另一种选择是直接load_external_function("extension", "symbol") C 函数;参见 fmgr.h

您尝试在 hstore 中使用的大多数函数将被声明为 static(因此它们在 hstore 模块中是本地的)这可能就是您的原因重新获得 undefined reference 。您只能将 hstore.h 中声明的内容用作宏或 extern 函数。您不能通过直接 C 链接调用在(例如)hstore_io.c 中找到的任何函数。

PG_LIBS 允许您指定要链接到的共享库,但 hstore.so 不是典型的共享库,它旨在在编译期间链接到。它是一个 PostgreSQL 扩展模块,旨在由服务器 dlopen() 编辑。我不认为真正支持一个扩展模块链接到另一个。这意味着如果不进行大量修改,您甚至可能无法使用 extern 函数。

使用 SPI、fmgrload_external_function

如果使用load_external_function,您可能需要管理内存上下文和其他调用上下文。尝试查找其使用示例。

参见:

关于c - 使用 hstore 在 C 中使用 PostgreSQL UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13302682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com