在PostreSQL中使用C ++函数

时间:2018-02-20 18:37:27

标签: c++ postgresql c++17

我正在尝试使用此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的)。

如何解决问题?

2 个答案:

答案 0 :(得分:2)

阅读the documentation

  

版本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;

阅读文档extend-extensions