Re: ERROR: tuple to be updated was already modified by an operation triggered by the current command
Noah Misch <noah@leadboat.com>
From: Noah Misch <noah@leadboat.com>
To: Robins Tharakan <tharakan@gmail.com>
Cc: Richard Guo <guofenglinux@gmail.com>, PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2025-04-11T14:41:33Z
Lists: pgsql-bugs
On Fri, Apr 11, 2025 at 10:18:04PM +0930, Robins Tharakan wrote:
> On Thu, 23 Jan 2025 at 19:42, Richard Guo <guofenglinux@gmail.com> wrote:
> Repro SQL
> =========
> CREATE TEMPORARY TABLE a(b boolean , UNIQUE(b)) ON COMMIT DELETE ROWS ;
> CREATE TEMP TABLE d() INHERITS(a) ON COMMIT DROP ;
> ANALYSE;
Confirmed. Thanks for the report. This is a variant of the bug that commit
7102070 fixed. Key events:
- The second CREATE sets relhassubclass=t on "a".
- ANALYZE does heap_update() to set relhassubclass=f, since ON COMMIT DROP
removed the child.
- ON COMMIT DELETE ROWS does an empty index build at end-of-xact, which does
an inplace update on the pg_class row of "a". There was no
CommandCounterIncrement() since the heap_update(), hence this error.
Changing to "ANALYSE a" makes the error go away, because
standard_ProcessUtility() does a CCI (added for bug #15631). So I'm inclined
to fix that by putting the CCI here for plain "ANALYSE":
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -657,6 +657,8 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy,
if (use_own_xacts)
{
PopActiveSnapshot();
+ /* standard_ProcessUtility() does CCI if !use_own_xacts */
+ CommandCounterIncrement();
CommitTransactionCommand();
}
else
> > This error happens in heap_inplace_lock(), and git-bisect says the
> > first bad commit is:
> >
> > a07e03fd8fa7daf4d1356f7cb501ffe784ea6257 is the first bad commit
That commit made it an error to inplace-update an invisible tuple; before
that, we silently lost the inplace update.
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Avoid ERROR at ON COMMIT DELETE ROWS after relhassubclass=f.
- d34b671a63e6 13.21 landed
- a61b67cd06c2 14.18 landed
- e0f53e669969 15.13 landed
- d0a049987e5a 17.5 landed
- 5905e9935999 16.9 landed
- 2d5350cfbdc6 18.0 landed
-
Fix data loss at inplace update after heap_update().
- a07e03fd8fa7 18.0 cited
-
Don't lose partitioned table reltuples=0 after relhassubclass=f.
- 7102070329d8 18.0 cited