pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
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



view thread (2+ messages)  latest in thread

Message-ID: <01042420581800.12729@workshop.price.ru>
Permalink:  ../01042420581800.12729@workshop.price.ru/
Also on:    postgresql.org/message-id/01042420581800.12729@workshop.price.ru

 · 

reply

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