From 34df95163f09f9d4a32dc17a244b8b839de4f90f Mon Sep 17 00:00:00 2001
From: Tender Wang <tndrwang@gmail.com>
Date: Fri, 25 Oct 2024 14:40:23 +0800
Subject: [PATCH] Fix memory invalid access due to using wrong conkey.

---
 src/backend/commands/tablecmds.c          |  2 +-
 src/test/regress/expected/foreign_key.out | 14 +++++++++++++-
 src/test/regress/sql/foreign_key.sql      | 13 +++++++++++++
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index e14bc0c054..bf6e8ec59d 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -19543,7 +19543,7 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent,
 				Form_pg_attribute att;
 
 				att = TupleDescAttr(RelationGetDescr(partRel),
-									attmap->attnums[conkey[i] - 1] - 1);
+									attmap->attnums[confkey[i] - 1] - 1);
 				fkconstraint->fk_attrs = lappend(fkconstraint->fk_attrs,
 												 makeString(NameStr(att->attname)));
 			}
diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out
index b73e7dced8..5bc36f7bb4 100644
--- a/src/test/regress/expected/foreign_key.out
+++ b/src/test/regress/expected/foreign_key.out
@@ -2997,7 +2997,7 @@ INSERT INTO fk_r_1 VALUES (2, 1, 2); -- should fail
 ERROR:  insert or update on table "fk_r_1" violates foreign key constraint "fk_r_p_id_p_jd_fkey"
 DETAIL:  Key (p_id, p_jd)=(1, 2) is not present in table "fk_p".
 DELETE FROM fk_p; -- should fail
-ERROR:  update or delete on table "fk_p_1_1" violates foreign key constraint "fk_r_1_p_id_p_jd_fkey1" on table "fk_r_1"
+ERROR:  update or delete on table "fk_p_1_1" violates foreign key constraint "fk_r_1_id_p_id_fkey1" on table "fk_r_1"
 DETAIL:  Key (id, jd)=(1, 1) is still referenced from table "fk_r_1".
 ALTER TABLE fk_r ATTACH PARTITION fk_r_1 FOR VALUES IN (1);
 ALTER TABLE fk_r ATTACH PARTITION fk_r_2 FOR VALUES IN (2);
@@ -3030,3 +3030,15 @@ SET client_min_messages TO warning;
 DROP SCHEMA fkpart12 CASCADE;
 RESET client_min_messages;
 RESET search_path;
+CREATE SCHEMA fkpart13
+  CREATE TABLE fkt (a int, b int, PRIMARY KEY (a, b))
+  CREATE TABLE fkpt (a int, b int, FOREIGN KEY (a, b) REFERENCES fkt(a, b)) PARTITION BY LIST (a)
+  CREATE TABLE fktp1 (x int, a int, b int);
+SET search_path TO fkpart13;
+ALTER TABLE fktp1 DROP COLUMN x;
+ALTER TABLE fkpt ATTACH PARTITION fktp1 FOR VALUES IN (1);
+ALTER TABLE fkpt DETACH PARTITION fktp1;
+SET client_min_messages TO warning;
+DROP SCHEMA fkpart13 CASCADE;
+RESET client_min_messages;
+RESET search_path;
diff --git a/src/test/regress/sql/foreign_key.sql b/src/test/regress/sql/foreign_key.sql
index 9b2a6b6bff..386bf862f1 100644
--- a/src/test/regress/sql/foreign_key.sql
+++ b/src/test/regress/sql/foreign_key.sql
@@ -2143,3 +2143,16 @@ SET client_min_messages TO warning;
 DROP SCHEMA fkpart12 CASCADE;
 RESET client_min_messages;
 RESET search_path;
+
+CREATE SCHEMA fkpart13
+  CREATE TABLE fkt (a int, b int, PRIMARY KEY (a, b))
+  CREATE TABLE fkpt (a int, b int, FOREIGN KEY (a, b) REFERENCES fkt(a, b)) PARTITION BY LIST (a)
+  CREATE TABLE fktp1 (x int, a int, b int);
+SET search_path TO fkpart13;
+ALTER TABLE fktp1 DROP COLUMN x;
+ALTER TABLE fkpt ATTACH PARTITION fktp1 FOR VALUES IN (1);
+ALTER TABLE fkpt DETACH PARTITION fktp1;
+SET client_min_messages TO warning;
+DROP SCHEMA fkpart13 CASCADE;
+RESET client_min_messages;
+RESET search_path;
-- 
2.25.1

