gpt4 book ai didi

在 PostgreSQL C 函数中创建 int8[] 数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:44 24 4
gpt4 key购买 nike

我正在尝试感受一下在 C 中为 PG 处理数组。有读取现有数组的示例,但我找不到关于如何创建和设置新数组的示例。

这就是我到目前为止所得到的。我认为我的意图很明确:

PG_FUNCTION_INFO_V1(makearray);

PGMODULEEXPORT Datum makearray(PG_FUNCTION_ARGS)
{
long a = PG_GETARG_INT32(0);
ArrayType* result = new_intArrayType(a);

for (long i = 0; i < a; i++)
{
result[i] = DatumSetInt32(i);
}

PG_RETURN_ARRAYTYPE_P(result);
}

如何为每个元素设置值?另外,我实际上想要一个 int8[] 数组。

注意

我不想传递参数。数组将完全在内部创建。如何在不获取元素的情况下设置元素?我的确切情况是有一个包含值的 C long long 数组,然后将它们复制到 PG 数组。

最佳答案

你应该使用函数 construct_arrayconstruct_md_array

#include "catalog/pg_type.h"

PG_FUNCTION_INFO_V1(array_four);

Datum
array_four(PG_FUNCTION_ARGS)
{
Datum elements[4];
ArrayType *array;

elements[0] = PG_GETARG_DATUM(0);
elements[1] = PG_GETARG_DATUM(1);
elements[2] = PG_GETARG_DATUM(2);
elements[3] = PG_GETARG_DATUM(3);

array = construct_array(elements, 4, INT8OID, 8, true, 'd');

PG_RETURN_POINTER(array);
}

第二种变体:

Datum
array_four(PG_FUNCTION_ARGS)
{
Datum elements[4];
ArrayType *array;
int i;

for (i = 0; i < 4; i++)
elements[i] = Int64GetDatum(i);

array = construct_array(elements, 4, INT8OID, 8, true, 'd');

PG_RETURN_POINTER(array);
}

注册:

CREATE FUNCTION array_four(int, int, int, int)
RETURNS int[]
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;

测试:

postgres=# select array_four(10,20,30,40);
┌───────────────┐
│ array_four │
╞═══════════════╡
│ {10,20,30,40} │
└───────────────┘
(1 row)

关于在 PostgreSQL C 函数中创建 int8[] 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657205/

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