我正在使用Visual Studio 2015构建postgres函数,当我尝试使用我的函数时收到此消息:
服务器意外关闭了连接 这可能意味着服务器异常终止 处理请求之前或处理时。
这是我的代码:
C:
.c文件:
#include<iostream>
#include<math.h>
extern "C" {
#include "postgres.h"
#include "fmgr.h"
#include "sysmoroundtoabnt.h"
#include "utils/builtins.h"
#include "catalog/pg_type.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
}
PG_FUNCTION_INFO_V1(sysmoroundtoabnt);
Datum
sysmoroundtoabnt(PG_FUNCTION_ARGS)
{
PG_RETURN_INT32(10);
//PG_RETURN_FLOAT8(10);
//...
}
.h文件
#ifndef SYSMOROUNDTOABNT_H
#define SYSMOROUNDTOABNT_H
#include "fmgr.h"
extern "C" __declspec(dllimport) Datum sysmoroundtoabnt(PG_FUNCTION_ARGS);
#endif
PostgreSQL的:
create or replace function teste_victor( double precision, integer )
returns double precision
as '$libdir/sysmoroundtoabnt', 'sysmoroundtoabnt' language C;
SQL命令
select teste_victor(0.015, -2)
PS。:如果我更改C代码以返回PG_RETURN_FLOAT8(10),我会收到错误:
无效的内存分配请求大小4294967290
我的代码出了什么问题?
答案 0 :(得分:0)
代码
PG_RETURN_INT32(10);
绑定失败,因为声明函数返回double precision
而不是integer
。 C对这种错误是不可原谅的。
我尝试了你的功能(没有__declspec(dllimport)
,因为我在Linux上使用GNU C)使用正确的
PG_RETURN_FLOAT8(10);
它按预期工作。
因此,构建可执行文件似乎一定存在错误。
如果你使用的是C而不是Windows,我建议使用PostgreSQL extension building infrastructure,但这不是C ++或Windows的选项。
问题是您必须使用与PostgreSQL相同的#define
构建函数
查看definition of PG_RETURN_FLOAT8
,我怀疑相关的#define
是USE_FLOAT8_BYVAL
。
您使用的是构建PostgreSQL时使用的include/pg_config.h
吗?
如果您在构建标记中添加/DUSE_FLOAT8_BYVAL
或/UUSE_FLOAT8_BYVAL
,是否有效?
您是否使用了用于构建PostgreSQL的相同Visual Studio版本?
您使用\MD
构建了吗?
答案 1 :(得分:0)
解决问题:
extern "C"
; PGDLLEXPORT Datum sysmoroundtoabnt(PG_FUNCTION_ARGS)
放在.h文件上; Double
更改为Float8
,将Int
更改为Int32
; 我想主要的问题是我如何阐述我的功能。