我正在尝试使用此C++14 and postgres博客中的代码来测试Writing PostgreSQL Functions in C++众所周知的问题的可行性(使用PostgreSQL 10.1,Ubuntu 16.04)。
代码(extension.cpp
)看起来很简单:
extern "C" {
#include <postgres.h> //all C headers and macros go inside extern "C"
#include <utils/rel.h>
PG_MODULE_MAGIC;
}
#include<vector> //C++ headers go outside
extern "C" {
int sumofall(){ //wrap the C++ function inside the extern "C" block
auto sum_of_all = 0;
std::vector<int> arr {1,2,3,4,5,6,7};
for (auto& i : arr )
sum_of_all += i;
return sum_of_all;
}
}
代码编译,但问题是无法使用以下命令从PostgreSQL中找到或调用C ++函数:
g++ -c -fPIC -Wall -Werror -g3 -O0 -I$(pg_config --includedir-server) extension.cpp
g++ -shared -o my-extension.so extension.o
sudo cp my-extension.so $(pg_config --pkglibdir)
psql -U postgres -h localhost $(whoami) -c "
CREATE OR REPLACE FUNCTION
sumofall() RETURNS integer AS 'my-extension'
LANGUAGE C STRICT;"
Postgres返回错误:
错误:无法找到功能的功能信息&#34; sumofall&#34; 提示:SQL可调用函数需要附带 PG_FUNCTION_INFO_V1(funcname的)。
如何解决问题?
答案 0 :(得分:2)
版本1调用约定依赖于宏来抑制传递参数和结果的大部分复杂性。版本1函数的C声明始终为:
Datum funcname(PG_FUNCTION_ARGS)
另外,宏调用:
PG_FUNCTION_INFO_V1(funcname);
必须出现在同一个源文件中。 (传统上,它是在函数本身之前编写的。)
答案 1 :(得分:1)
除了对@Laurenz的基本了解之外,您还应该提供一个.control文件来安装扩展名,并通知postgresql如何使用它。 在这里,我可以显示我现在手头的.control文件。
# file: tm_ext.control :
comment = 'Comments....'
default_version = '0.0.1'
directory = 'extension' # /usr/share/postgresql/{pg_ver}/extension/
module_pathname = '$libdir/tm_ext'
relocatable = false
schema = tm_ext
然后,您必须声明指向共享库的函数,例如:
CREATE FUNCTION tm_ext.doit([args..]) RETURNS integer
AS '$libdir/tm_ext', 'doit'
LANGUAGE C STRICT;