我存取陣列:從複合型陣列中的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
,s adly我有一排Datum
。 通常你通過訪問函數屬性得到HeapTupleHeader
,如下所示:PG_GETARG_HEAPTUPLEHEADER(0)
但這並不意味着數組(或者我錯了?)。
那麼,有一些功能/萬客隆從Datum
是複合型或複合型Datum
轉換成HeapTuple
得到列?我已經深入到heap_getattr()
,但無法找到有用的東西。不記得是否已經有某種功能可以類似的方式訪問複合數組,並會告訴我如何去做。
對於上下文: 我有2個陣列複合類型和欲寫爲他們的快速級聯C函數。然而,我不能簡單地向左側添加正確的參數,因爲他們可以共享「關鍵」列,在這種情況下,我希望結果只有右側的值。
這是plpgSQL中的簡單任務(unnest,full join,array_agg),但速度很慢。我已經在hstore和json中測試了相同的任務,兩者都比unnest + array_agg快得多,但是我不能在沒有大量數據庫結構更改的情況下使用這些數據類型,所以我一直在尋找不同的解決方案。
旁註:你也可以試試['語言sql函數](https://www.postgresql.org/docs/current/static/xfunc-sql.html)。它們比'plpgsql'快得多。 – pozs
@pozs是的,我忘了提及 - 我確實嘗試過,並沒有改變 –