aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2018-10-24 10:45:34 -0400
committerAndrew Dunstan <andrew@dunslane.net>2018-10-24 10:56:27 -0400
commit040a1df6149f852c3b8de96d9d13258af8a39e23 (patch)
tree864706cd0ce76295b6ee8549906cd78da8967ff5 /src
parent5ef037cf0b9e130120c5a788f1f1048f6242b076 (diff)
downloadpostgresql-040a1df6149f852c3b8de96d9d13258af8a39e23.tar.gz
postgresql-040a1df6149f852c3b8de96d9d13258af8a39e23.zip
Correctly set t_self for heap tuples in expand_tuple
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/common/heaptuple.c2
-rw-r--r--src/test/regress/expected/fast_default.out10
-rw-r--r--src/test/regress/sql/fast_default.sql12
3 files changed, 23 insertions, 1 deletions
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 15444cf5824..28127b311f5 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -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;
diff --git a/src/test/regress/expected/fast_default.out b/src/test/regress/expected/fast_default.out
index 48bd360a799..0797e111285 100644
--- a/src/test/regress/expected/fast_default.out
+++ b/src/test/regress/expected/fast_default.out
@@ -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);
diff --git a/src/test/regress/sql/fast_default.sql b/src/test/regress/sql/fast_default.sql
index 06205cb39f0..eefcd497e51 100644
--- a/src/test/regress/sql/fast_default.sql
+++ b/src/test/regress/sql/fast_default.sql
@@ -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);