我访问复合值数组,如下所示:
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函数来快速连接它们。然而,我不能简单地在左边添加正确的参数,因为他们可以分享" key"列,在这种情况下,我希望结果只有右侧的值。
这是plpgSQL中的简单任务(unfst,full join,array_agg),但速度很慢。我已经在hstore和json中测试了相同的任务,并且两者都比不使用+ array_agg快得多,但是如果没有大量的数据库结构更改,我就无法使用这些数据类型,所以我一直在寻找不同的解决方案。
答案 0 :(得分:1)
我猜你需要的只是DatumGetHeapTupleHeader
中定义的fmgr.h
宏。