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

时间:2016-06-06 12:15:30

标签: c arrays postgresql

我正试图在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数组中。

1 个答案:

答案 0 :(得分:2)

您应该使用功能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)