pgsql: Repair mishandling of cached cast-expression trees in plpgsql.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Repair mishandling of cached cast-expression trees in plpgsql.
Date: 2015-07-17 19:53:21
Message-ID: E1ZGBhB-0005CK-FV@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Repair mishandling of cached cast-expression trees in plpgsql.

In commit 1345cc67bbb014209714af32b5681b1e11eaf964, I introduced caching
of expressions representing type-cast operations into plpgsql. However,
I supposed that I could cache both the expression trees and the evaluation
state trees derived from them for the life of the session. This doesn't
work, because we execute the expressions in plpgsql's simple_eval_estate,
which has an ecxt_per_query_memory that is only transaction-lifespan.
Therefore we can end up putting pointers into the evaluation state tree
that point to transaction-lifespan memory; in particular this happens if
the cast expression calls a SQL-language function, as reported by Geoff
Winkless.

The minimum-risk fix seems to be to treat the state trees the same way
we do for "simple expression" trees in plpgsql, ie create them in the
simple_eval_estate's ecxt_per_query_memory, which means recreating them
once per transaction.

Since I had to introduce bookkeeping overhead for that anyway, I bought
back some of the added cost by sharing the read-only expression trees
across all functions in the session, instead of using a per-function
table as originally. The simple-expression bookkeeping takes care of
the recursive-usage risk that I was concerned about avoiding before.

At some point we should take a harder look at how all this works,
and see if we can't reduce the amount of tree reinitialization needed.
But that won't happen for 9.5.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/0fc94a5bab4d0155db5d15197ed3bd8cb435eb21

Modified Files
--------------
src/pl/plpgsql/src/pl_exec.c | 290 +++++++++++++++++++--------------
src/pl/plpgsql/src/plpgsql.h | 4 -
src/test/regress/expected/plpgsql.out | 62 +++++++
src/test/regress/sql/plpgsql.sql | 30 ++++
4 files changed, 262 insertions(+), 124 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Andrew Dunstan 2015-07-18 01:11:13 pgsql: Release note compatibility item
Previous Message Heikki Linnakangas 2015-07-17 18:40:45 Re: [COMMITTERS] pgsql: Retain comments on indexes and constraints at ALTER TABLE ... TY