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