Re: [rfc,patch] PL/Proxy in core
От | Marko Kreen |
---|---|
Тема | Re: [rfc,patch] PL/Proxy in core |
Дата | |
Msg-id | e51f66da0805151242l3105031bx62b0e49d05063d9@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: [rfc,patch] PL/Proxy in core (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-hackers |
On 5/15/08, Tom Lane <tgl@sss.pgh.pa.us> wrote: > "Marko Kreen" <markokr@gmail.com> writes: > > On 5/15/08, Tom Lane <tgl@sss.pgh.pa.us> wrote: > >> "Marko Kreen" <markokr@gmail.com> 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; #endifplproxy_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
В списке pgsql-hackers по дате отправления: