[pgsql-jp: 41253] Re: ユーザー定義関数の作り方
Tomoaki Sato
sato @ sraoss.co.jp
2012年 10月 17日 (水) 21:40:48 JST
佐藤です。
From: 山田 明 <lennygcc @ infoseek.jp>
Date: Wed, 17 Oct 2012 15:07:42 +0900
> いただいたソースコードをGCC 4.3.2でコンパイルし、下記のように関数登
> 録したところ、実数配列について、引数にエラーを生じました。
>
> このエラーとは関係ないと思いますが、CRETAE FUNCTIONの際に、戻り値を
> REALとしたいと考えています。
戻り値のデータ型は anyelement 型を想定していました。
CREATE OR REPLACE FUNCTION sum_array(anyarray) RETURNS anyelement
AS '$libdir/test', 'sum_array'
LANGUAGE C STRICT;
> 他にも、この2,3日中に、当方の動作状況をUPしてゆく予定です。
>
> よろしく、お願いいたします。
>
> Welcome to psql 8.3.17, the PostgreSQL interactive terminal.
>
> Type: \copyright for distribution terms
> \h for help with SQL commands
> \? for help with psql commands
> \g or terminate with semicolon to execute query
> \q to quit
>
> postgres=# CREATE FUNCTION sum_array(anyarray)
> RETURNS REAL
> AS '/tmp/sum_array.so', 'sum_array'
> LANGUAGE 'c'
> ;
> CREATE FUNCTION
> postgres=# SELECT * FROM SUM_ARRAY(ARRAY[0.1,0.2,0.3]);
> ERROR: could not determine data type of input
引数が numeric[] 型として認識されるためです。
=# SELECT pg_typeof(ARRAY[0.1,0.2,0.3]);
pg_typeof
-----------
numeric[]
(1 row)
引数を real[] 型にキャストすれば正しい結果が返ってきます。あるいは、
numeric[] 型の引数も処理できるように作り込む必要があります。
=# SELECT sum_array(ARRAY[0.1,0.2,0.3]::real[]);
sum_array
-----------
0.6
(1 row)
> postgres=# SELECT * FROM SUM_ARRAY(ARRAY[1,2,3]);
> The connection to the server was lost. Attempting reset: Failed.
> !> \q
戻り値のデータ型が real 型であるにも係わらず、integer 型を返しているの
でクラッシュしています。戻り値を float4 型に変換して PG_RETURN_FLOAT4
マクロで返す必要があります。
----
Tomoaki Sato <sato @ sraoss.co.jp>
SRA OSS, Inc. Japan
pgsql-jp メーリングリストの案内