[pgsql-jp: 27335] Re: Cのfunction について

Satoshi Nagayasu snaga @ snaga.org
2002年 9月 5日 (木) 19:33:06 JST


永安です。

関数をCで書く場合、単に共有ライブラリにすればいいというものではありません。
version()関数の場合、以下のようになっています。

src/backend/utils/adt/version.c
----------------------------------------
#include "postgres.h"
#include "utils/builtins.h"

Datum
pgsql_version(PG_FUNCTION_ARGS)
{
	int			n = strlen(PG_VERSION_STR);
	text	   *ret = (text *) palloc(n + VARHDRSZ);

	VARATT_SIZEP(ret) = n + VARHDRSZ;
	memcpy(VARDATA(ret), PG_VERSION_STR, n);

	PG_RETURN_TEXT_P(ret);
}
---------------------------------------

contrib/ の中にも多くの関数がありますので、
それらも参考にしてみてください。

あと、「エラーになります」ではなくエラーの内容を書きましょう。
でないと、推測にもとづく不確実な返答しかできなくなります。


"Shigeru Matsumoto" <matsu @ awh.co.jp> wrote:
> This is a multi-part message in MIME format.
> 
> ------=_NextPart_000_0011_01C2550C.B7132950
> Content-Type: text/plain;
> 	charset="iso-2022-jp"
> Content-Transfer-Encoding: 7bit
> 
> こんばんわ、matsuと申します。
> 
> redhat7.2
> postgresql-7.2.1
> 
> 以下のようなC関数を作成し、test.soを作成しました。
> 
> -------- test.c ----------
> #include <stdio.h>
> #include <string.h>
> 
> #include "postgres.h"
> 
> char* test(int2 i) {
>    char* h = "----";
>    static char s[40];
> 
>    sprintf(s, "%d", i);
>    strcat(s, h);
> 
>    return(s);
> }
> windowsのC++環境では、test(2)の結果が「2----」となりました。
> 
> $ cc -fpic -c -I /usr/local/src/postgresql-7.2.1/src/inclide -I /usr/include
> test.c
> $ cc -shared -o test.so test.o
> 
> hoge=# create function test(int2) return char as'/xxxx/test.so' language
> 'c';
> hoge=# select test(t.field1) from t where t.id = 100;
> 
> だと、エラーになります。
> 解決策を教えて頂けないでしょうか。
> 
> よろしくお願いします。
> 
> 
> 

-- 
NAGAYASU Satoshi <snaga @ snaga.org>




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