[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 メーリングリストの案内