Hi Zsolt,

Thanks for testing! I've identified the root causes and am working on
v2 with the fixes. Will share soon.

-- Mohamed Ali

On Sat, May 16, 2026 at 4:15 AM Zsolt Parragi <[email protected]> wrote:
>
> Hello!
>
> With some initial testing I was able to find 2 server crashes with the patch.
>
> 1: error during explain
>
> CREATE OR REPLACE FUNCTION divz_plpgsql(x int) RETURNS int LANGUAGE
> plpgsql AS $$
> DECLARE r int;
> BEGIN
>   SELECT 1/x INTO r;
>   RETURN r;
> END;
> $$;
> -- error during explain
> EXPLAIN (ANALYZE, NESTED_STATEMENTS) SELECT divz_plpgsql(0);
> -- run another explain
> EXPLAIN (ANALYZE, NESTED_STATEMENTS) SELECT 1;
> -- any next query crashes the server
> SELECT 1;
>
> 2: any nested explain
>
> CREATE FUNCTION f() RETURNS void LANGUAGE plpgsql AS $$
> DECLARE r record;
> BEGIN
>   FOR r IN EXECUTE 'EXPLAIN (ANALYZE, NESTED_STATEMENTS) SELECT 1'
>   LOOP NULL; END LOOP;
> END;
> $$;
>
> EXPLAIN (ANALYZE, NESTED_STATEMENTS) SELECT f();
>
>
> +               /*
> +                * Switch to TopMemoryContext so the captured plan text 
> survives
> +                * until we print it.
> +                */
> +               oldcxt = MemoryContextSwitchTo(TopMemoryContext);
> ...
> +               ExplainBeginOutput(nes);
> +               ExplainPrintPlan(nes, queryDesc);
> +               ExplainEndOutput(nes);
> ...
> +               plan_info->query_text = queryDesc->sourceText ?
> +                       pstrdup(queryDesc->sourceText) : pstrdup("<unknown>");
>
> When is queryDesc freed? This seems like a memory leak.
>
>


Reply via email to