gpt4 book ai didi

使用数组输入和数组输出为 PostgreSQL 创建简单的 C 函数

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:23 32 4
gpt4 key购买 nike

谁能分享一个示例,说明我如何为 PostgreSQL 创建 C 函数,它将两个整数的数组作为输入并返回数组作为输出?

对于简单的整数,我有:

#include "postgres.h"
#include <fmgr.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

int
add_one(int arg) {
arg++;
return arg;
}

在 PostgreSQL 中编译之后:

load '/usr/lib/postgresql/9.1/lib/add_one';

create or replace function add_one(integer)
returns integer as
'/usr/lib/postgresql/9.1/lib/add_one', 'add_one'
language c;

select add_one(1);

我需要这样的东西:

#include "postgres.h"
#include <fmgr.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

int
add_one(int[] arg) {
arg[1]++;
arg[2] = arg[2] + 2
return arg[];
}

在 PostgreSQL 中:

load '/usr/lib/postgresql/9.1/lib/add_one';

create or replace function add_one(integer[])
returns integer[] as
'/usr/lib/postgresql/9.1/lib/add_one', 'add_one'
language c;

select add_one(ARRAY[1::int,1::int]);

I have tried从 numeric.c 修改一些函数,但到目前为止没有任何成功。

最佳答案

您的代码甚至不会像编写的那样远程开始工作。 PostgreSQL 不会将 Pg 级数组作为 int[] 传递,它通过 PG_FUNCTION_ARGS (fcinfo) 中的函数上下文传递它们,并且它们'通过 PG_GETARG_ARRAYTYPE_P 宏访问。

有关基本扩展功能指南,请参阅 the docs on C language functions .

看看src/backend/utils/adt/array_userfuncs.carray_cat的定义,或者中的array_remove >src/backend/utils/adt/arrayfuncs.c。或许多其他选项。

你的骨架看起来像:

PG_FUNCTION_INFO_V1(add_arrays);

Datum
add_arrays(PG_FUNCTION_ARGS)
{
ArrayType *array1, *array2, *resultarray;

array1 = PG_GETARG_ARRAYTYPE_P(0);
array2 = PG_GETARG_ARRAYTYPE_P(1);

/* Loop over the array bodies and do your mapping to generate resultarray here */

PG_RETURN_ARRAYTYPE_P(resultarray);
}

PostgreSQL C 数组 API 很糟糕,所以我没有时间填写函数体。关键是你的函数签名是完全错误的——你完全误解了它是如何工作的,你写的东西甚至不可能被执行。

然后声明为:

create or replace function add_arrays(integer[], integer[])
returns integer[] as
'add_arrays', 'add_arrays'
language c immutable strict;

strict 很重要;我提供的函数框架不检查空输入,所以你需要告诉执行者不要用它们调用它。

如果 src/backend/utils/adt/arrayfuncs.c 中的 array_map 有一个 map2 就好了对两个数组进行锁步迭代的 zip 变体。不幸的是它没有,所以你需要自己迭代它们。

在重新阅读您的问题后,我现在想知道您是不是指 int[] 的单个数组两个元素 并且您想要 整数结果 那是数组的总和。如果是这样,请看一下 intarray 模块是如何工作的;它具有处理简单整数数组的简化函数。

关于使用数组输入和数组输出为 PostgreSQL 创建简单的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20396546/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com