On 5/15/08, Tom Lane <[EMAIL PROTECTED]> wrote:
> "Marko Kreen" <[EMAIL PROTECTED]> writes:
>  > On 5/15/08, Tom Lane <[EMAIL PROTECTED]> wrote:
>  >> "Marko Kreen" <[EMAIL PROTECTED]> writes:
>  >>> Eg. how does src/backend/parser/gram.c not leak memory on syntax error?
>  >>
>  >> It's not a leak because the memory can be re-used during the next
>  >> command.
>
>  > I may be blind, but I don't see any static variables there.
>
> Sorry, I was confusing bison with flex --- there are static variables
>  pointing at buffers within a flex scanner.
>
>  For bison it looks like defining YYSTACK_ALLOC/YYSTACK_FREE as
>  palloc/pfree might be a sane thing to do, but I haven't tested it.

Ok, so parser.y is now fine.

Now I must admit I do the same hack in scanner.l, but because it keeps
static references, there is always call to plproxy_yylex_destroy() in
places that throw exceptions (all of flex/bison/plproxy exceptions
go through single function).

Reason for that is again the fact that I could not wrap my brain around
flex memory handling.  And the hacks in src/backend/parser/scan.l are also
somethat mystery to me.  When using palloc() I can be sure of the flow,
and if something goes wrong it crashes instead leaking, so it can
be fixed immidately.

But now that I think about it, the scheme fails if palloc() itself
throws exception.  It can be fixed by calling following function
on parser entry:

void plproxy_yylex_startup(void)
{
#if FLXVER < 2005031
        (YY_CURRENT_BUFFER) = NULL;
#else
        (yy_buffer_stack) = NULL;
#endif
        plproxy_yylex_destroy();
}

This is pretty hairy, but anything near flex is hairy.  Such function
also would drop the requirement that plproxy_yylex_destroy() must always
be called.  Then we could keep current simple always-from-scratch allocation
pattern but more robust.


Or we could go back to default malloc usage.  I somewhat doubt it will
be much cleaner, it needs lot more faith in sanity of flex which I dont
have.
OTOH, considering that now here the possibility of others reviewing the
result is lot higher than before it can be attempted.

-- 
marko

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to