Re: can external C-function get multiple rows?

Поиск
Список
Период
Сортировка
От Alexey Nalbat
Тема Re: can external C-function get multiple rows?
Дата
Msg-id 01042718092204.12343@workshop.price.ru
обсуждение исходный текст
Ответ на can external C-function get multiple rows?  (Alexey Nalbat <alexey@price.ru>)
Ответы Re: Re: can external C-function get multiple rows?  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-interfaces
Tom, thank you very much.

I was succeeded in constructing such a test function. And now have another question.
I wrote function myarr(foo) which returns exactly 10 rows of random values in the range [0,foo).

But I also want this function to work correctly, when used in a query with limit clause, like
"select myarr(100) limit 6;". After a bit of experiments I supposed that while executing
this query postgres called myarr() seven times (not six!). And may be at the seven call
fcinfo has some_flag set to "stop_return", after checking which myarr() should do the same
as when returning 11's row with PG_RETURN_NULL and setting "isDone" to "ExprEndResult"
and resetting variables. Is it so? What are some_flag and "stop_return"?

Thanks in advance.

P.S.:

Now myarr() does not reset variables when "interrupted by limit", and because of this returns:

+++
+++

pl=# select myarr(100) limit 6;?column? 
----------      87      42      35      38       4      16
(6 rows)

pl=# select myarr(100) limit 6;?column? 
----------      69       9      40
(3 rows)

+++
+++

Here is myarr() code:

+++
+++

#include <stdlib.h>
#include "postgres.h"
#include "fmgr.h"
#include "nodes/execnodes.h"

#define N 10

int     a_c[N];
int     n_c=0;
int     i_c=0;

PG_FUNCTION_INFO_V1(myarr);

Datum
myarr(PG_FUNCTION_ARGS)
{       int n=PG_GETARG_INT32(0);
       if ( n_c!=n )       {               int j;
               n_c=n;               i_c=0;
               for ( j=0 ; j<N ; j++ )               {                       a_c[j]=n_c*rand()/RAND_MAX;
}      }
 
       if ( i_c<N )       {               i_c++;
               ((ReturnSetInfo*)fcinfo->resultinfo)->isDone=ExprMultipleResult;
PG_RETURN_INT32(a_c[i_c-1]);      }       else       {               n_c=0;               i_c=0;
 
               ((ReturnSetInfo*)fcinfo->resultinfo)->isDone=ExprEndResult;               PG_RETURN_NULL();       }
}

+++
+++

-- 

WBR, Alexey Nalbat


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

Предыдущее
От: "Graham Vickrage"
Дата:
Сообщение: RE: VB and ODBC
Следующее
От: Dave Page
Дата:
Сообщение: RE: VB and ODBC