2017-02-28 61 views
2

我存取陣列:從複合型陣列中的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快得多,但是我不能在沒有大量數據庫結構更改的情況下使用這些數據類型,所以我一直在尋找不同的解決方案。

+0

旁註:你也可以試試['語言sql函數](https://www.postgresql.org/docs/current/static/xfunc-sql.html)。它們比'plpgsql'快得多。 – pozs

+0

@pozs是的,我忘了提及 - 我確實嘗試過,並沒有改變 –

回答

1

我想你所需要的是在fmgr.h中定義的DatumGetHeapTupleHeader宏。