Обсуждение: c-function returning multiple rows

Поиск
Список
Период
Сортировка

c-function returning multiple rows

От
Alexey Nalbat
Дата:
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

От
Tom Lane
Дата:
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