'ERROR: attempted to update invisible tuple' from 'ALTER INDEX ... ATTACH PARTITION' on parent index
Shruthi Gowda <gowdashru@gmail.com>
From: Shruthi Gowda <gowdashru@gmail.com>
To: PostgreSQL Development <pgsql-hackers@postgresql.org>
Date: 2023-07-11T17:22:16Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Add indisreplident to fields refreshed by RelationReloadIndexInfo()
- db9813819fe8 11.21 landed
- 7d27493b74c5 12.16 landed
- bdaaf1bf1d90 13.12 landed
- 7af65523ab8b 14.9 landed
- eb3abec4b67d 15.4 landed
- 27da47122075 16.0 landed
- a5ea825f958c 17.0 landed
-
Fix updates of indisvalid for partitioned indexes
- ed2b58c153bc 11.21 landed
- f1d6bcdd8fb5 12.16 landed
- c89d74c18b50 13.12 landed
- 954cc2139c03 14.9 landed
- c0dc97c7bfd1 15.4 landed
- 31f9d41d625d 16.0 landed
- 38ea6aa90e61 17.0 landed
Hi,
While testing some use cases, I encountered 'ERROR: attempted to update
invisible tuple' when a partitioned index is attached to a parent index
which is also a replica identity index.
Below is the reproducible test case. The issue is seen only when the
commands are executed inside a transaction.
BEGIN;
CREATE TABLE foo (
id INT NOT NULL,
ts TIMESTAMP WITH TIME ZONE NOT NULL
) PARTITION BY RANGE (ts);
CREATE TABLE foo_2023 (
id INT NOT NULL,
ts TIMESTAMP WITH TIME ZONE NOT NULL
);
ALTER TABLE ONLY foo
ATTACH PARTITION foo_2023
FOR VALUES FROM ('2023-01-01 00:00:00+09') TO ('2024-01-01 00:00:00+09');
CREATE UNIQUE INDEX pk_foo
ON ONLY foo USING btree (id, ts);
ALTER TABLE ONLY foo REPLICA IDENTITY USING INDEX pk_foo;
CREATE UNIQUE INDEX foo_2023_id_ts_ix ON foo_2023 USING btree (id, ts);
ALTER INDEX pk_foo ATTACH PARTITION foo_2023_id_ts_ix;
The 'ALTER INDEX pk_foo ATTACH PARTITION foo_2023_id_ts_ix' returns
"*ERROR: attempted to update invisible tuple"*
Below are few observations from debugging:
[image: image.png]
[image: image.png]
The error is seen in validatePartitionedIndex() while validating the partition.
This function marks the parent index as VALID if it found as many
inherited indexes as the partitioned table has partitions.
The pg_index tuple is fetched from partedIdx->rd_indextuple.Iit looks
like the index tuple is not refreshed.
The 'indisreplident' is false, the ctid field value is old and it does
not reflect the ctid changes made by 'ALTER TABLE ONLY foo REPLICA
IDENTITY USING INDEX pk_foo'.
Any suggestions ?
Regards,
Shruthi KC
EnterpriseDB: http://www.enterprisedb.com