Correctly set t_self for heap tuples in expand_tuple
authorAndrew Dunstan <andrew@dunslane.net>
Wed, 24 Oct 2018 14:45:34 +0000 (10:45 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Wed, 24 Oct 2018 14:56:27 +0000 (10:56 -0400)
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

src/backend/access/common/heaptuple.c
src/test/regress/expected/fast_default.out
src/test/regress/sql/fast_default.sql

index 15444cf582446b2bb7e8f842941a75ef880a6ad5..28127b311f5479dcbb18a99aa603c51bc8f37a7f 100644 (file)
@@ -856,7 +856,7 @@ expand_tuple(HeapTuple *targetHeapTuple,
            = (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;
index 48bd360a799bc2ba1ecba8675e587629d7cfb4c5..0797e111285f8d896ebedba7c9144e3f6dca6b9f 100644 (file)
@@ -727,7 +727,17 @@ SELECT * FROM t;
 (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);
index 06205cb39f0ca6238779e180bc3166e93a38118f..eefcd497e5107b0f00172dcddccd033d735801ab 100644 (file)
@@ -471,7 +471,19 @@ UPDATE t SET y = 2;
 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);