PostgreSQL:当用C创建变量大小的类型时,错误是关于;“压缩数据已损坏”;
我正在尝试使用C语言在PostgreSQL 10.4中创建一个数据类型 我在C中定义了一个集合类型,其结构如下。数据属性是一个大小可变的数组PostgreSQL:当用C创建变量大小的类型时,错误是关于;“压缩数据已损坏”;,c,postgresql,psql,postgresql-10,C,Postgresql,Psql,Postgresql 10,我正在尝试使用C语言在PostgreSQL 10.4中创建一个数据类型 我在C中定义了一个集合类型,其结构如下。数据属性是一个大小可变的数组 typedef struct intSet { int32 length; int32 data[FLEXIBLE_ARRAY_MEMBER]; } intSet; 当我将.source文件中的internallength设置为变量时,如下所示: CREATE TYPE intSet ( internallength = V
typedef struct intSet
{
int32 length;
int32 data[FLEXIBLE_ARRAY_MEMBER];
} intSet;
当我将.source文件中的internallength设置为变量时,如下所示:
CREATE TYPE intSet (
internallength = VARIABLE,
input = intset_in,
output = intset_out
我得到了这样的错误消息,当我在实际值中设置internallength
时,一切似乎都正常
psql: intset.sql:89: ERROR: compressed data is corrupted
LINE 3: ('MongoDB','{2,4}'),
有什么建议吗?我可能会提出两点: 1,要将“internallength”设置为“VARIABLE”,您需要按照中的说明设置“storage”选项 2、您是否以正确的方式定义了输入和输出函数?这包括:
- 以“PGDLLEXPORT数据XXXX(PG_函数_参数)”的格式声明函数李>
- 以“基准XXXX(PG_函数参数)”格式创建函数
- 对于输入函数,您需要返回指向结构的指针,还需要从malloc或堆栈分配内存
- 对于输出函数,需要以文本格式返回,建议使用psprintf
希望它有帮助……我可以问一下declare函数和create函数的区别吗?我确实在c语言的.c文件中使用了Datum XXXX(PG_FUNCTION_ARGS)格式,在.source文件中使用了CREATE FUNCTION input(cstring)格式。我发现在Windows中使用了PGDLLEXPORT,对吗?当我使用Linux操作系统时。是的,我使用的是windows,不确定Linux,但也需要以类似的方式。由于在实际值中设置internallength可以解决此问题。我认为首先您需要尝试设置适当的存储选项值,然后由于应用了toast函数,您必须在每次检索和写入数据时处理数据的长度。。。。。。我记不清了,但是toast数据在输入时必须设置数据长度,在检索时,数据长度也可以通过VARSIZE_ANY()函数实现。。。。