PostgreSQL: при создании типа переменной размера C ошибка об «сжатых данных повреждена» - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь создать тип данных в PostgreSQL 10.4 с использованием языка C.

Я определил тип SET в C, структура которого выглядит следующим образом. Атрибут данных представляет собой массив переменного размера.

typedef struct intSet
{
    int32   length;
    int32   data[FLEXIBLE_ARRAY_MEMBER];
} intSet;

когда для внутренней длины в файле .source установлено значение VARIABLE, как указано ниже:

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 Ответ

0 голосов
/ 31 августа 2018

Я могу придумать два возможных пункта:

1, чтобы установить для «внутренней длины» значение «ПЕРЕМЕННАЯ», вам необходимо установить опцию «хранения», как указано в https://www.postgresql.org/docs/10/static/storage-toast.html

2, Вы правильно определили свою функцию ввода и вывода? Это включает в себя:

  • Объявление функции в формате «PGDLLEXPORT Datum XXXX (PG_FUNCTION_ARGS)»;
  • Создать функцию в формате «Datum XXXX (PG_FUNCTION_ARGS)»
  • Для функции ввода вам необходимо вернуть указатель на структуру, а также вам нужно выделить память либо из malloc, либо по стеку.
  • Для функции вывода ее необходимо вернуть в текстовом формате, предлагается psprintf.

Надеюсь, это поможет ...

...