]> granicus.if.org Git - postgresql/commit
Fix plpgsql's handling of "simple" expression evaluation.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 Oct 2010 17:01:07 +0000 (13:01 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 Oct 2010 17:02:53 +0000 (13:02 -0400)
commitf44b6fc9f1334e3f52ed3c5430e008637af59a12
treead1723858fc28643c70607570a1a8a6428b49555
parent61ba6f4bf01305e1acdff79424e6133cf2a0b46c
Fix plpgsql's handling of "simple" expression evaluation.

In general, expression execution state trees aren't re-entrantly usable,
since functions can store private state information in them.
For efficiency reasons, plpgsql tries to cache and reuse state trees for
"simple" expressions.  It can get away with that most of the time, but it
can fail if the state tree is dirty from a previous failed execution (as
in an example from Alvaro) or is being used recursively (as noted by me).

Fix by tracking whether a state tree is in use, and falling back to the
"non-simple" code path if so.  This results in a pretty considerable speed
hit when the non-simple path is taken, but the available alternatives seem
even more unpleasant because they add overhead in the simple path.  Per
idea from Heikki.

Back-patch to all supported branches.
src/pl/plpgsql/src/pl_exec.c
src/pl/plpgsql/src/plpgsql.h
src/test/regress/expected/plpgsql.out
src/test/regress/sql/plpgsql.sql