Postgres C API

时间:2017-02-28 12:55:21

标签: sql c postgresql postgresql-9.6

我访问复合值数组,如下所示:

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数组。 通常你可以通过访问函数属性来获得HeapTupleHeaderPG_GETARG_HEAPTUPLEHEADER(0)但这不适用于数组(或者我错了?)。

是否有一些函数/ makro从Datum获取复合类型的列或将复合类型Datum转换为HeapTuple?我已经和heap_getattr()一样深,但是找不到任何有用的东西。无法记住是否已经存在某种以类似方式访问复合数组的函数,并会告诉我如何操作它。

对于上下文: 我有2个复合类型的数组,我想编写C函数来快速连接它们。然而,我不能简单地在左边添加正确的参数,因为他们可以分享" key"列,在这种情况下,我希望结果只有右侧的值。

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

1 个答案:

答案 0 :(得分:1)

我猜你需要的只是DatumGetHeapTupleHeader中定义的fmgr.h宏。