Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:当用C创建变量大小的类型时,错误是关于;“压缩数据已损坏”;_C_Postgresql_Psql_Postgresql 10 - Fatal编程技术网

PostgreSQL:当用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

我正在尝试使用C语言在PostgreSQL 10.4中创建一个数据类型

我在C中定义了一个集合类型,其结构如下。数据属性是一个大小可变的数组

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()函数实现。。。。