Можно ли применять преобразования функций Postgres SQL к типам массивов? - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь выполнить некоторую числовую обработку типов массивов в Postgres. Я обнаружил, что могу использовать библиотеку Numpy в Postgres PL / Python, но операция выполняется слишком медленно для моих целей и намного медленнее, чем в Python напрямую или с использованием расширения C.

Я подозреваю, что могут возникнуть издержки при переходе из Postgres Array Type -> Python List -> Numpy Arrray и затем в обратном порядке.

Для тестирования (и, возможно, исправления) я пытаюсь создать расширение C, которое пропустило бы прохождение по списку Python и конвертировало бы непосредственно из Postgres Array в Numpy Array и наоборот.

Я создал расширение C, которое определяет следующее:

CREATE FUNCTION arr_to_np(val internal) RETURNS internal LANGUAGE C AS 'MODULE_PATHNAME', 'arr_to_np';

CREATE FUNCTION np_to_arr(val internal) RETURNS real[] LANGUAGE C 
AS 'MODULE_PATHNAME', 'np_to_arr';

CREATE TRANSFORM FOR real[] LANGUAGE plpythonu (
    FROM SQL WITH FUNCTION arr_to_np(internal),
    TO SQL WITH FUNCTION np_to_arr(internal)
);

Модуль загружается без проблем, но когда я пытаюсь использовать его в функции

CREATE FUNCTION fn (a integer[])
  RETURNS integer
  TRANSFORM FOR TYPE real[] 
  AS $$  return a $$ LANGUAGE plpythonu;

Я получаю: ОШИБКА: преобразование для реального типа языка "plpythonu" не существует

Я предполагаю, что преобразование пытается быть применено к базовому «реальному» типу, а не к массиву. Есть ли способ указать преобразования специально для массивов?

1 Ответ

0 голосов
/ 03 мая 2019

Оказывается, это невозможно.

В lsyscache.c (get_transform_oid) он преобразует тип преобразования в его базовый тип, который удаляет массив, и поэтому функция всегда применяется к базовому типу.

Посмотрим, смогу ли я собрать патч для разрешения этого поведения, но в настоящее время (postgres <= 11.0) вы не можете создавать собственные преобразования для объектов массива. </p>

...