Commit 
16828d5c0 incorrectly set an invalid pointer for t_self for heap
tuples. This patch correctly copies it from the source tuple, and
includes a regression test that relies on it being set correctly.
Backpatch to release 11.
Fixes bug #15448 reported by Tillmann Schulz
Diagnosis and test case by Amit Langote
 
                        = (HeapTupleHeader) ((char *) *targetHeapTuple + HEAPTUPLESIZE);
                (*targetHeapTuple)->t_len = len;
                (*targetHeapTuple)->t_tableOid = sourceTuple->t_tableOid;
-               ItemPointerSetInvalid(&((*targetHeapTuple)->t_self));
+               (*targetHeapTuple)->t_self = sourceTuple->t_self;
 
                targetTHeader->t_infomask = sourceTHeader->t_infomask;
                targetTHeader->t_hoff = hoff;
 
 (1 row)
 
 DROP TABLE t;
+-- make sure expanded tuple has correct self pointer
+-- it will be required by the RI tigger doing the cascading delete
+CREATE TABLE leader (a int PRIMARY KEY, b int);
+CREATE TABLE follower (a int REFERENCES leader ON DELETE CASCADE, b int);
+INSERT INTO leader VALUES (1, 1), (2, 2);
+ALTER TABLE leader ADD c int;
+ALTER TABLE leader DROP c;
+DELETE FROM leader;
 -- cleanup
+DROP TABLE follower;
+DROP TABLE leader;
 DROP FUNCTION test_trigger();
 DROP TABLE t1;
 DROP FUNCTION set(name);
 
 SELECT * FROM t;
 DROP TABLE t;
 
+-- make sure expanded tuple has correct self pointer
+-- it will be required by the RI tigger doing the cascading delete
+
+CREATE TABLE leader (a int PRIMARY KEY, b int);
+CREATE TABLE follower (a int REFERENCES leader ON DELETE CASCADE, b int);
+INSERT INTO leader VALUES (1, 1), (2, 2);
+ALTER TABLE leader ADD c int;
+ALTER TABLE leader DROP c;
+DELETE FROM leader;
+
 -- cleanup
+DROP TABLE follower;
+DROP TABLE leader;
 DROP FUNCTION test_trigger();
 DROP TABLE t1;
 DROP FUNCTION set(name);