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