Re: plpgsql plan changes causing failure after repeated invocation

From: Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>
To: "Merlin Moncure *EXTERN*" <mmoncure(at)gmail(dot)com>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: plpgsql plan changes causing failure after repeated invocation
Date: 2014-11-11 14:28:08
Message-ID: A737B7A37273E048B164557ADEF4A58B17D93252@ntex2010i.host.magwien.gv.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Merlin Moncure wrote:
> I chased down a problem today where users were reporting sporadic
> failures in the application. Turns out, the function would work
> exactly 5 times and then fail; this is on 9.2. I think I understand
> why this is happening and I'm skeptical it's a bug in postgres, but I
> thought I'd socialize it.
>
> What's happening here is a query structured like this, somewhat deep
> into a pl/pgsql function:

[...]
> (_plpgsql_var = 'yyy' and q.data::int = foo.foo_id)
[...]

> What is happening, along with some triggers I don't completely
> understand (this problem started hitting when I made an unrelated
> change in the function) is that the cast (q.data::int) started to
> fail. In cases where _plpgsql_var is not 'yyy', the cast was getting
> applied where previously it did not.
>
> The workaround was simple, insert a case statement so that q.data::int
> becomes CASE WHEN _plpgsql_var = 'yyy' THEN q.data::int ELSE NULL END.
> That being said, it does bring up some interesting points.
>
> *) relying on A being checked first in 'A OR B' is obviously not
> trustworthy, and it shouldn't be. Generally I assume the planner will
> do the cheaper of the two first (along with some extra encouragement
> to put it on the left side), but this can't be relied upon.
>
> *) It's possible to write queries so that they will fail depending on
> plan choice. This is not good, and should be avoided when possible
> (the query isn't great I'll admit), but the interaction with execution
> count is a little unpleasant.

This must be the "custom plan" feature added in 9.2 switching over to
a generic plan after 5 executions.

But you are right, it is not nice.

Yours,
Laurenz Albe

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Fujii Masao 2014-11-11 14:32:53 Re: PENDING_LIST_CLEANUP_SIZE - maximum size of GIN pending list Re: HEAD seems to generate larger WAL regarding GIN index
Previous Message Merlin Moncure 2014-11-11 14:15:59 plpgsql plan changes causing failure after repeated invocation