Re: [BUG] Fix DETACH with FK pointing to a partitioned table fails - Mailing list pgsql-hackers

From Tender Wang
Subject Re: [BUG] Fix DETACH with FK pointing to a partitioned table fails
Date
Msg-id CAHewXN=OPgvuvQn=3DzN=YWLi_Q_VikS1QuqxHu-fJRSBtj2ug@mail.gmail.com
Whole thread Raw
In response to Re: [BUG] Fix DETACH with FK pointing to a partitioned table fails  (Alvaro Herrera <alvherre@alvh.no-ip.org>)
List pgsql-hackers


Alvaro Herrera <alvherre@alvh.no-ip.org> 于2024年10月25日周五 23:14写道:
On 2024-Oct-25, Alexander Lakhin wrote:

> I've also discovered another anomaly with a similar setup, but it's not
> related to 53af9491a.

Hmm, it may well be a preexisting problem, but I do think it involves
the same code.  As far as I can tell, the value "2" here

> This script ends up with:
> ERROR:  invalid attribute number 2
> ERROR:  cache lookup failed for attribute 2 of relation 16398

is coming from riinfo->confdelsetcols which was set up by
DetachPartitionFinalize during the last DETACH operation.

Hmm, actually, the confdelsetcols before detach and after detach is always {2}, as below:

postgres=# select oid, conname, conrelid,conparentid,confdelsetcols from pg_constraint where conrelid = 16397;
  oid  |  conname  | conrelid | conparentid | confdelsetcols
-------+-----------+----------+-------------+----------------
 16400 | pt_a_fkey |    16397 |       16392 | {2}
(1 row)

postgres=# ALTER TABLE pt DETACH PARTITION tp1;
ALTER TABLE
postgres=# select oid, conname, conrelid,conparentid,confdelsetcols from pg_constraint where conrelid = 16397;
  oid  |  conname  | conrelid | conparentid | confdelsetcols
-------+-----------+----------+-------------+----------------
 16400 | pt_a_fkey |    16397 |           0 | {2}
(1 row) 

Even though no detach, the confdelsetcols is {2} . But no error report. Because the rel->rd_att->natts of pt is 2.
It will not go into tp1 because tp1 is a partition of pt. But after detach,  the rel->rd_att->natts of tp1 is 1, 
so "ERROR:  invalid attribute number 2" will report.

CREATE TABLE tp1...  will ignore the dropped column of parent, so the natts of tp1 is 1, but its parent is 2.

--
Thanks,
Tender Wang

pgsql-hackers by date:

Previous
From: Jingtang Zhang
Date:
Subject: Re: Introduce new multi insert Table AM and improve performance of various SQL commands with it for Heap AM
Next
From: Amit Kapila
Date:
Subject: Re: Pgoutput not capturing the generated columns