从 Postgres C 中的复合类型数组访问列 API
Access column from composite type array in Postgres C API
我像这样访问复合值数组:
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)
但这并不意味着数组(或者我错了?)。
那么是否有一些 function/makro 可以从复合类型的 Datum
中获取列或将复合类型 Datum
转换为 HeapTuple
?我已经深入 heap_getattr()
,但找不到任何有用的东西。不记得是否已经有某种函数可以以类似的方式访问复合数组并告诉我如何去做。
对于上下文:
我有 2 个复合类型的数组,我想编写 C 函数来快速连接它们。然而,我不能简单地将右参数添加到左,因为它们可以共享 "key" 列,在这种情况下,我希望结果只有右侧的值。
这是 plpg 中的简单任务SQL(unnest,完全连接,array_agg)但是速度很慢。我在 hstore 和 json 中测试了相同的任务,两者都比 unnest+array_agg 快得多,但如果不对数据库结构进行大量更改,我将无法使用这些数据类型,因此我一直在寻找不同的解决方案。
我想您只需要在 fmgr.h
中定义的 DatumGetHeapTupleHeader
宏即可。
我像这样访问复合值数组:
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)
但这并不意味着数组(或者我错了?)。
那么是否有一些 function/makro 可以从复合类型的 Datum
中获取列或将复合类型 Datum
转换为 HeapTuple
?我已经深入 heap_getattr()
,但找不到任何有用的东西。不记得是否已经有某种函数可以以类似的方式访问复合数组并告诉我如何去做。
对于上下文: 我有 2 个复合类型的数组,我想编写 C 函数来快速连接它们。然而,我不能简单地将右参数添加到左,因为它们可以共享 "key" 列,在这种情况下,我希望结果只有右侧的值。
这是 plpg 中的简单任务SQL(unnest,完全连接,array_agg)但是速度很慢。我在 hstore 和 json 中测试了相同的任务,两者都比 unnest+array_agg 快得多,但如果不对数据库结构进行大量更改,我将无法使用这些数据类型,因此我一直在寻找不同的解决方案。
我想您只需要在 fmgr.h
中定义的 DatumGetHeapTupleHeader
宏即可。