From 944e72ad211a9ac694e7fdeb9361f9fe3e2a01d4 Mon Sep 17 00:00:00 2001 From: "Chao Li (Evan)" Date: Tue, 9 Jun 2026 09:58:44 +0800 Subject: [PATCH v1] Add regression test for virtual generated column deformation Add coverage for a virtual generated NOT NULL column followed by a physically stored NOT NULL column. This exercises the tuple deformation case fixed by 89eafad297a, where TupleDescFinalize() could incorrectly treat a virtual generated column as part of the guaranteed physical column prefix and compute cached offsets past it. Without that fix, deforming the following column could read from the wrong tuple offset. Suggested-by: Andres Freund Author: Chao Li Discussion: https://postgr.es/m/A4BC563C-0CA3-4EF3-952A-EA41F9E5BF1E%40gmail.com --- src/test/regress/expected/generated_virtual.out | 9 +++++++++ src/test/regress/sql/generated_virtual.sql | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/test/regress/expected/generated_virtual.out b/src/test/regress/expected/generated_virtual.out index 24d5dbf46ca..7a5788146f5 100644 --- a/src/test/regress/expected/generated_virtual.out +++ b/src/test/regress/expected/generated_virtual.out @@ -727,6 +727,15 @@ ERROR: null value in column "b" of relation "gtest21b" violates not-null constr DETAIL: Failing row contains (null, virtual). ALTER TABLE gtest21b ALTER COLUMN b DROP NOT NULL; INSERT INTO gtest21b (a) VALUES (0); -- ok now +-- virtual generated columns are not physically stored, even when not null +CREATE TABLE gtest21c (a int NOT NULL, b int GENERATED ALWAYS AS (a * 2) VIRTUAL NOT NULL, c int NOT NULL); +INSERT INTO gtest21c (a, c) VALUES (10, 42); +SELECT a, b, c FROM gtest21c; + a | b | c +----+----+---- + 10 | 20 | 42 +(1 row) + -- not-null constraint with partitioned table CREATE TABLE gtestnn_parent ( f1 int, diff --git a/src/test/regress/sql/generated_virtual.sql b/src/test/regress/sql/generated_virtual.sql index 9c2bb6590b3..126ae3ecda9 100644 --- a/src/test/regress/sql/generated_virtual.sql +++ b/src/test/regress/sql/generated_virtual.sql @@ -374,6 +374,11 @@ INSERT INTO gtest21b (a) VALUES (NULL); -- error ALTER TABLE gtest21b ALTER COLUMN b DROP NOT NULL; INSERT INTO gtest21b (a) VALUES (0); -- ok now +-- virtual generated columns are not physically stored, even when not null +CREATE TABLE gtest21c (a int NOT NULL, b int GENERATED ALWAYS AS (a * 2) VIRTUAL NOT NULL, c int NOT NULL); +INSERT INTO gtest21c (a, c) VALUES (10, 42); +SELECT a, b, c FROM gtest21c; + -- not-null constraint with partitioned table CREATE TABLE gtestnn_parent ( f1 int, -- 2.50.1 (Apple Git-155)