Re: Fix RETURNING side effects for FOR PORTION OF leftover rows - Mailing list pgsql-hackers

From Dean Rasheed
Subject Re: Fix RETURNING side effects for FOR PORTION OF leftover rows
Date
Msg-id CAEZATCXPv0hQiOj6xr+OocVb9EK2VAmAfei0+_xoXW1jCNNXFA@mail.gmail.com
Whole thread
Responses Re: Fix RETURNING side effects for FOR PORTION OF leftover rows
List pgsql-hackers
On Thu, 16 Jul 2026 at 07:20, Chao Li <li.evan.chao@gmail.com> wrote:
>
> Dean raised a comment on my patch [1] about RETURNING processing for UPDATE ... FOR PORTION OF. While addressing that
comment,I found a new problem: UPDATE/DELETE ... FOR PORTION OF currently processes RETURNING for leftover rows as
well,which seems wrong because it can cause unexpected side effects. 
>
> Here is a simple repro using a sequence:
>
> The UPDATE FOR PORTION OF command generates two leftover rows, and both cause RETURNING to be processed. As a result,
thesequence is advanced three times, which seems unexpected from the user's perspective. 

Yes, I wondered whether that could happen. We should definitely fix
this. Apart from anything else, it's not good that it can execute
user-defined functions on the leftover rows, which haven't been
checked against RLS SELECT policies.

> To fix the problem, since leftover rows are inserted by calling ExecInsert(), and ExecInsert() is a local static
function,I think a simple and safe solution is to add a new parameter to ExecInsert() to indicate whether to process
RETURNINGfor this insert. Then UPDATE/DELETE FOR PORTION OF can bypass RETURNING processing for leftover rows. 

I don't particularly like adding another argument to ExecInsert(). I
think it can work out from its existing arguments whether it's part of
a FOR PORTION OF query (by looking at mtstate).

Regards,
Dean



pgsql-hackers by date:

Previous
From: Nisha Moond
Date:
Subject: Re: Support EXCEPT for TABLES IN SCHEMA publications
Next
From: Rafia Sabih
Date:
Subject: Re: postgres_fdw: Emit message when batch_size is reduced