Re: bug when apply fast default mechanism for adding new column over domain with default value
Tender Wang <tndrwang@gmail.com>
From: Tender Wang <tndrwang@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Alexander Lakhin <exclusion@gmail.com>,
jian he <jian.universality@gmail.com>, PostgreSQL-development <pgsql-hackers@postgresql.org>
Date: 2025-04-02T02:01:31Z
Lists: pgsql-hackers
Attachments
- 0001-Fix-tuple-already-updated-by-self-issue.patch (text/plain) patch 0001
Tom Lane <tgl@sss.pgh.pa.us> 于2025年4月2日周三 09:05写道: > Alexander Lakhin <exclusion@gmail.com> writes: > > I've discovered that 95f650674 introduced a defect similar to bug #18297, > > but this time with DEFAULT. Namely, the following script: > > CREATE TABLE a (aa text); > > CREATE TABLE c (cc text) INHERITS (a); > > CREATE TABLE d (dd text) INHERITS (c, a); > > ALTER TABLE a ADD COLUMN i int DEFAULT 1; > > > fails with: > > ERROR: XX000: tuple already updated by self > > LOCATION: simple_heap_update, heapam.c:4421 > > Hmm, yeah. The failing call is here: > > /* Bump the existing child att's inhcount */ > ... > CatalogTupleUpdate(attrdesc, &tuple->t_self, tuple); > > so I think you're right that that code path is now short a > CommandCounterIncrement() somewhere. I'll look tomorrow if > nobody beats me to it. > Yes, when table a process its children, which are table c and table d. Table c is first to be done. At the same time, table d is also child of table c, so after updating own pg_attribute tuple, table c will process its child table d. And table d update its pg_attribute catalog tuple. After finishing table c, the logic returning to continue to process table a's children, which this time is table d. Between table d pg_attribute tuple updated as child of table c and updating table d pg_attribute tuple again as child of table a, there is no call CommandCounterIncrement(). So let's add CommandCounterIncrement() after calling StoreAttrMissingVal(). -- Thanks, Tender Wang
Commits
-
Need to do CommandCounterIncrement after StoreAttrMissingVal.
- dd34cbfce296 13.21 landed
- d31d39cfe4f5 14.18 landed
- bd178960c69b 18.0 landed
- 2d6cfb0cddd3 15.13 landed
- 0941aadcd55b 17.5 landed
- 053222a97b13 16.9 landed
-
Simplify some logic around setting pg_attribute.atthasdef.
- 35c8dd9e1176 18.0 landed
-
Remove now-dead code in StoreAttrDefault().
- 4528768d98f8 18.0 landed
-
Fix broken handling of domains in atthasmissing logic.
- 95f650674d2c 18.0 landed
- edc3bccd0dc7 16.9 landed
- d6dd2a02bae0 17.5 landed
- c75c830e2392 14.18 landed
- aac07b56256e 13.21 landed
- 1d180931cc3b 15.13 landed