From: Alexey Nalbat <alexey@price.ru>
To: pgsql-bugs@postgresql.org
Subject: c-function returning multiple rows
Date: Tue, 24 Apr 2001 19:55:32 +0400
Message-ID: <01042420581800.12729@workshop.price.ru> (raw)
Hello, I encountered the following problem ( at PostgreSQL 7.1 on Solaris i386 )
with compiling c-function returning multiple rows. Here is a transcript.
+++
+++
postgres@beta:~$ cd lib/
postgres@beta:~/lib$ cat <<! >myrand.c
> #include <stdlib.h>
> #include "postgres.h"
> #include "fmgr.h"
> #include "nodes/execnodes.h"
>
> PG_FUNCTION_INFO_V1(myrand);
>
> Datum
> myrand(PG_FUNCTION_ARGS)
> {
> if ( 100*rand() > RAND_MAX )
> {
> fcinfo->resultinfo->isDone = ExprMultipleResult;
> PG_RETURN_INT32( PG_GETARG_INT32(0)*rand()/RAND_MAX );
> }
> else
> {
> fcinfo->resultinfo->isDone = ExprEndResult;
> PG_RETURN_NULL();
> }
> }
> !
postgres@beta:~/lib$ gcc -I /usr/local/include/pgsql -fpic -c myrand.c
myrand.c: In function `triple':
myrand.c:13: structure has no member named `isDone'
myrand.c:18: structure has no member named `isDone'
+++
+++
I digged into sources and supposed that line 61 in fmgr.h might be 'struct ReturnSetInfo *resultinfo;'
instead of 'struct Node *resultinfo;'. But I'm not sure if it is correct.
After changing this line in file fmgr.h it became working. Here is a transcript.
+++
+++
postgres@beta:~/lib$ gcc -I /usr/local/include/pgsql -fpic -c myrand.c
postgres@beta:~/lib$ gcc -G -o myrand.so myrand.o
postgres@beta:~/lib$ psql
Welcome to psql, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# CREATE FUNCTION myrand(int4) RETURNS SETOF int4 AS '/var/local/lib/pgsql/lib/myrand.so' LANGUAGE 'C';
CREATE
postgres=# SELECT myrand(50);
?column?
----------
26
46
30
29
40
8
22
38
23
18
2
43
24
44
22
46
48
15
(18 rows)
+++
+++
--
WBR, Alexey Nalbat
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-interfaces@postgresql.org
Cc: alexey@price.ru, pgsql-bugs@postgresql.org
Subject: Re: c-function returning multiple rows
In-Reply-To: <01042420581800.12729@workshop.price.ru>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox