c-function returning multiple rows

Поиск
Список
Период
Сортировка
От Alexey Nalbat
Тема c-function returning multiple rows
Дата
Msg-id 01042420581800.12729@workshop.price.ru
обсуждение исходный текст
Ответы Re: c-function returning multiple rows  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-bugs
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

В списке pgsql-bugs по дате отправления:

Предыдущее
От: "Saul Hernández"
Дата:
Сообщение: Startup Problems on Win2K
Следующее
От: Thomas Lockhart
Дата:
Сообщение: Re: Cannot Create plpqsql function!