可以将Postgres SQL函数转换应用于数组类型吗?

时间:2019-04-19 17:22:20

标签: arrays postgresql numpy plpgsql

我正在尝试对Postgres中的数组类型进行一些数值处理。我发现我可以在Postgres PL / Python中使用Numpy库,但是出于我的目的,该操作运行太慢,并且比直接在Python中或使用C扩展的运行速度慢得多。

我的怀疑是Postgres数组类型-> Python列表-> 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 :(得分:0)

事实证明这是不可能的。

lsyscache.cget_transform_oid)中,它将转换的类型转换为基本类型,从而去除了“数组”,因此该函数始终应用于基础类型。

要查看我是否可以拼凑一个补丁来允许这种行为,但是目前(postgres <= 11.0)您不能为数组对象创建自定义转换。