Thread: c-function returning multiple rows
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
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