Dear all:

I could not find any way to store a value in a C function between calls
inside the same session.

For example, the following function doesn't work as expected:

/********************************/
    #include "postgres.h"
    #include "fmgr.h"

    PG_FUNCTION_INFO_V1(next_value);

    Datum next_value(PG_FUNCTION_ARGS)
    {
    static int n;
    PG_RETURN_INT32(n);
    n++;
    }

/********************************/
    create function next_value()
    returns integer as
    'next.so' language C;

/********************************/
Calling

    select next_value();

will always return 0,
even if I declare 'n' as a global variable outside the C function.


Thanks a lot.

Fabio Furia Silva


Tue, 25 Mar 2003 13:12:00 -0300
"Fabio Furia Silva" <ff-@uol.com.br>
Persistent variables between cross-calls in C functions

On Tue, 25 Mar 2003, Fabio Furia Silva wrote:

> For example, the following function doesn't work as expected:
>
> /********************************/
>     #include "postgres.h"
>     #include "fmgr.h"
>
>     PG_FUNCTION_INFO_V1(next_value);
>
>     Datum next_value(PG_FUNCTION_ARGS)
>     {
>     static int n;
>     PG_RETURN_INT32(n);
>     n++;
>     }
>
> /********************************/
>     create function next_value()
>     returns integer as
>     'next.so' language C;
>
> /********************************/
> Calling
>
>     select next_value();
>
> will always return 0,
> even if I declare 'n' as a global variable outside the C function.

Which seems right since the n++ is never executed (being after the return
statement).  Does it do what you want if you increment first?


Tue, 25 Mar 2003 09:51:54 -0800 (PST)
Stephan Szabo <sszabo@megazone23.bigpanda.com>
Re: Persistent variables between cross-calls in C functions