Thread: c-function returning multiple rows

c-function returning multiple rows

From
Alexey Nalbat
Date:
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

Re: c-function returning multiple rows

From
Tom Lane
Date:
Alexey Nalbat <alexey@price.ru> writes:
> 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.

No, it isn't.  fmgr.h is correct as given, because the resultinfo
field might point at various different kinds of Nodes.  You need to
do an IsA test and then a cast, instead.  See the code in
src/backend/executor/functions.c for an example.

            regards, tom lane