2017-01-11 6 views
0

私は、ユーザー定義型MYTYPEを持っています。ここで私が書いたものです:アクセスアレイ

#include "postgres.h" 
#include "fmgr.h" 
#include "executor/executor.h" 
#include "datatype/timestamp.h" 


#ifdef PG_MODULE_MAGIC 
PG_MODULE_MAGIC; 
#endif 

PG_FUNCTION_INFO_V1(testfunc); 

Datum 
testfunc(PG_FUNCTION_ARGS) { 
    bool isnull; 
    HeapTupleHeader at = PG_GETARG_HEAPTUPLEHEADER(0); 
    Datum dt = GetAttributeByName(at, "timestamps", &isnull); 

    Timestamp ** tts = (Timestamp **) DatumGetPointer(dt); 

    PG_RETURN_DATUM(**tts); 
} 

SQLリファレンス:

CREATE OR REPLACE FUNCTION testfunc(mytype) RETURNS timestamp AS 'path/to/library.so', 'testfunc' LANGUAGE C STRICT; 

私がテストしようとしているとき、今、私はごみ結果を取得しています:PostgreSQLのソースコードを

postgres=# SELECT testfunc('("{""2017-01-11 00:00:00"", NULL}", 10)'); 
     testfunc   
--------------------------- 
2000-01-01 00:00:00.00001 
(1 row) 

答えて

1

ルック配列の引数を扱う方法を見てください。あなたのコードは多少のようになります

HeapTupleHeader at = PG_GETARG_HEAPTUPLEHEADER(0); 
Datum dt = GetAttributeByName(at, "timestamps", &isnull); 
ArrayType *ts = DatumGetArrayTypeP(dt); 
Timestamp *timestamps = (Timestamp *) ARR_DATA_PTR(ts); 

これは完全ではありません。アレイに予想されるディメンション数などがある場合は、NULLのチェックを追加することをお勧めします。

+0

これはおそらく最初の引数が_timestamp [] _ typeであると予想しているので実際には機能しませんが、実際には複合型の引数_mytype_です。また、[このページ](https://www.postgresql.org/docs/current/static/xfunc-c.html#AEN60514)では、コンポジットタイプのHeapTupleHeaderを使用する必要があります。 – gnuger

+0

ああ、私はそれがユーザ定義のタイプであることを忘れていました。私は答えを修正しました。 –

+0

それは魅力的に働いた。 – gnuger