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


Reply via email to