mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-13 18:07:05 +08:00
Fix usage of "tableoid" in GENERATED expressions.
We consider this supported (though I've got my doubts that it's a good idea, because tableoid is not immutable). However, several code paths failed to fill the field in soon enough, causing such a GENERATED expression to see zero or the wrong value. This occurred when ALTER TABLE adds a new GENERATED column to a table with existing rows, and during regular INSERT or UPDATE on a foreign table with GENERATED columns. Noted during investigation of a report from Vitaly Ustinov. Back-patch to v12 where GENERATED came in. Discussion: https://postgr.es/m/CAM_DEiWR2DPT6U4xb-Ehigozzd3n3G37ZB1+867zbsEVtYoJww@mail.gmail.com
This commit is contained in:
@ -29,6 +29,7 @@ CREATE TABLE gtest_err_5a (a int PRIMARY KEY, b int DEFAULT 5 GENERATED ALWAYS A
|
||||
CREATE TABLE gtest_err_5b (a int PRIMARY KEY, b int GENERATED ALWAYS AS identity GENERATED ALWAYS AS (a * 2) STORED);
|
||||
|
||||
-- reference to system column not allowed in generated column
|
||||
-- (except tableoid, which we test below)
|
||||
CREATE TABLE gtest_err_6a (a int PRIMARY KEY, b bool GENERATED ALWAYS AS (xmin <> 37) STORED);
|
||||
|
||||
-- various prohibited constructs
|
||||
@ -201,9 +202,11 @@ DROP TYPE double_int;
|
||||
-- using tableoid is allowed
|
||||
CREATE TABLE gtest_tableoid (
|
||||
a int PRIMARY KEY,
|
||||
b bool GENERATED ALWAYS AS (tableoid <> 0) STORED
|
||||
b bool GENERATED ALWAYS AS (tableoid = 'gtest_tableoid'::regclass) STORED
|
||||
);
|
||||
INSERT INTO gtest_tableoid VALUES (1), (2);
|
||||
ALTER TABLE gtest_tableoid ADD COLUMN
|
||||
c regclass GENERATED ALWAYS AS (tableoid) STORED;
|
||||
SELECT * FROM gtest_tableoid;
|
||||
|
||||
-- drop column behavior
|
||||
|
||||
Reference in New Issue
Block a user