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

Masaaki Yonebayashi yone @ abby.co.jp
2012年 10月 10日 (水) 19:12:10 JST


米林です。

かなり昔にやったものですが

http://d.hatena.ne.jp/yone098/20080729/1217300716

ブログのように、まずは固定値を返すユーザ定義関数を作って動作させ
そのあとに、ブログにある引き数を取得をデバッグしながら試してみて下さい。
固定値を返す関数が作成出来て
引き数を取得する関数が作成出来れば
ゴールは近いはずです。


2012年10月10日 18:59 山田 明 <lennygcc @ infoseek.jp>:
>
> はじめまして、山田と申します。
>
> 下記のように、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;



-- 
米 林   正 明
http://abby.co.jp


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