[pgsql-jp: 41240] ユーザー定義関数の作り方

山田 明 lennygcc @ infoseek.jp
2012年 10月 10日 (水) 18:59:12 JST


はじめまして、山田と申します。

下記のように、anyarray多様型の3個の実数を引数として、実数の和を戻り値とするC言語によるユーザ定義関数を作りたいと思います。

postgres=# SELECT add_array(ARRAY[0.1,0.1,0.1]);
 add_array
--------------
         0.3
(1 row)

しかしながら、本格的なプログラミングの知識が足りず、マニュアルの「引数と戻り値の多様性」の章からだけでは、使い方を理解に至れません。個々の配列を取りだす方法を教えていただけないでしょうか?

#include "postgres.h"
#include "array.h"
#include "fmgr.h"

#define  INT8OID   20
#define  INT2OID   21
#define  INT4OID   23
#define  FLOAT4OID   700
#define  FLOAT8OID   701

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(add_array);
Datum
make_array_2(PG_FUNCTION_ARGS)
{
    ArrayType  *input;
    Oid         element_type = get_fn_expr_argtype(fcinfo->flinfo, 0);
    Datum       element;
    int16       typlen;
    bool        typbyval;
    char        typalign;

    if (!OidIsValid(element_type))
        elog(ERROR, "could not determine data type of input");

    /* get input args */
    input = PG_GETARG_ARRAYTYPE_P(0);

    /* get input array element type */
    element_type = ARR_ELEMTYPE(input);
    get_typlenbyvalalign(element_type, &typlen, &typbyval, &typalign);






    PG_RETURN_FLOAT8(a+b+c);
}

postgres=# CREATE FUNCTION add_array(anyelement) RETURNS FLOAT8
    AS '/home/add_array.so', 'add_array'
    LANGUAGE C STRICT; 		 	   		  


pgsql-jp メーリングリストの案内