我访问这样的复合值数组:
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 快得多,但是如果没有大量的数据库结构更改,我就无法使用这些数据类型,所以我正在寻找不同的解决方案。