>>>>> "Tom" == Tom Lane <tgl@sss.pgh.pa.us> writes:
 Tom> I would bet money that that "_SPI_current->internal_xact" thing is
 Tom> wrong/inadequate.
In particular this looks wrong to me: after doing:
do $$
  begin
    execute 'declare foo cursor with hold for select 1/x as a from (values (1),(0)) v(x)';
    commit;  -- errors within the commit
  end;
$$;
ERROR:  division by zero
CONTEXT:  PL/pgSQL function inline_code_block line 1 at COMMIT
the SPI stack is not cleaned up at all, and _SPI_connected is >= 0 even
when back at the main backend command loop.
-- 
Andrew (irc:RhodiumToad)