Re: Add PortalDrop in exec_execute_message

Alvaro Herrera <alvherre@alvh.no-ip.org>

From: Alvaro Herrera <alvherre@alvh.no-ip.org>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Yura Sokolov <y.sokolov@postgrespro.ru>, pgsql-hackers@lists.postgresql.org
Date: 2021-06-09T19:34:53Z
Lists: pgsql-hackers
On 2021-Jun-09, Tom Lane wrote:

> I wrote:
> > It turns out that the problem is specific to SELECT FOR UPDATE, and
> > it happens because nodeLockRows is not careful to shut down the
> > EvalPlanQual mechanism it uses before returning NULL at the end of
> > a scan.  If EPQ has been fired, it'll be holding a tuple slot
> > referencing whatever tuple it was last asked about.  The attached
> > trivial patch seems to take care of the issue nicely, while adding
> > little if any overhead.  (A repeat call to EvalPlanQualEnd doesn't
> > do much.)

Thanks for researching that -- good find.

> BTW, to be clear: I think Alvaro's change is also necessary.
> If libpq is going to silently do something different in pipeline
> mode than it does in normal mode, it should strive to minimize
> the semantic difference.  exec_simple_query includes a PortalDrop,
> so we'd best do the same in pipeline mode.  But this LockRows
> misbehavior would be visible in other operating modes anyway.

Agreed.  I'll get it pushed after the patch I'm currently looking at.

-- 
Álvaro Herrera                            39°49'30"S 73°17'W



Commits

  1. Add 'Portal Close' message to pipelined PQsendQuery()

  2. Shut down EvalPlanQual machinery when LockRows node reaches the end.

  3. Update libpq to make new features of FE/BE protocol available to

  4. Extended query protocol: parse, bind, execute, describe FE/BE messages.