2

我访问这样的复合值数组:

PG_GETARG_ARRAYTYPE_P(0)
/* Then I deconstruct it into C array */
deconstruct_array()
/* Later I iterate thru values and attempt to access columns of my composite type */
GetAttributeByName(input_data1[i], "keyColumnName", &isnull[0])

这是它在 SQL 中的样子:

SELECT * FROM my_c_function(array[(44, 1)::comp_type, (43, 0)::comp_type], array[(42, 1)::comp_type, (43, 1)::comp_type]);

预期结果:

array[(44, 1)::comp_type, (42, 1)::comp_type, (43, 1)::comp_type] /*order doesn't matter*/

但这不起作用,因为GetAttributeByName()仅适用于HeapTupleHeader,遗憾的是我有Datum. 通常你可以HeapTupleHeader通过访问这样的函数属性来获得:PG_GETARG_HEAPTUPLEHEADER(0)但这并不意味着数组(或者我错了?)。

那么是否有一些函数/ makro 可以从复合类型中获取列Datum或将复合类型Datum转换为HeapTuple?我已经深入到heap_getattr(),但找不到任何有用的东西。不记得是否已经有某种函数可以以类似的方式访问复合数组,并会告诉我如何去做。

对于上下文:我有 2 个复合类型的数组,我想编写 C 函数来快速连接它们。但是,我不能简单地向左添加右参数,因为它们可以共享“键”列,在这种情况下,我希望结果只有右侧的值。

这是 plpgSQL 中的简单任务(unnest、full join、array_agg),但速度很慢。我在 hstore 和 json 中测试了相同的任务,两者都比 unnest+array_agg 快得多,但是如果没有大量的数据库结构更改,我就无法使用这些数据类型,所以我正在寻找不同的解决方案。

4

1 回答 1

1

我想你所需要的只是DatumGetHeapTupleHeader定义在fmgr.h.

于 2017-02-28T14:48:42.327 回答