mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-13 18:07:05 +08:00
Fix ALTER TABLE / INHERIT with generated columns
When running ALTER TABLE t2 INHERIT t1, we must check that columns in t2 that correspond to a generated column in t1 are also generated and have the same generation expression. Otherwise, this would allow creating setups that a normal CREATE TABLE sequence would not allow. Discussion: https://www.postgresql.org/message-id/22de27f6-7096-8d96-4619-7b882932ca25@2ndquadrant.com
This commit is contained in:
@ -96,11 +96,25 @@ INSERT INTO gtest_normal (a) VALUES (1);
|
||||
INSERT INTO gtest_normal_child (a) VALUES (2);
|
||||
SELECT * FROM gtest_normal;
|
||||
|
||||
CREATE TABLE gtest_normal_child2 (a int, b int GENERATED ALWAYS AS (a * 3) STORED);
|
||||
ALTER TABLE gtest_normal_child2 INHERIT gtest_normal;
|
||||
INSERT INTO gtest_normal_child2 (a) VALUES (3);
|
||||
SELECT * FROM gtest_normal;
|
||||
|
||||
-- test inheritance mismatches between parent and child
|
||||
CREATE TABLE gtestx (x int, b int GENERATED ALWAYS AS (a * 22) STORED) INHERITS (gtest1); -- error
|
||||
CREATE TABLE gtestx (x int, b int DEFAULT 10) INHERITS (gtest1); -- error
|
||||
CREATE TABLE gtestx (x int, b int GENERATED ALWAYS AS IDENTITY) INHERITS (gtest1); -- error
|
||||
|
||||
CREATE TABLE gtestxx_1 (a int NOT NULL, b int);
|
||||
ALTER TABLE gtestxx_1 INHERIT gtest1; -- error
|
||||
CREATE TABLE gtestxx_2 (a int NOT NULL, b int GENERATED ALWAYS AS (a * 22) STORED);
|
||||
ALTER TABLE gtestxx_2 INHERIT gtest1; -- error
|
||||
CREATE TABLE gtestxx_3 (a int NOT NULL, b int GENERATED ALWAYS AS (a * 2) STORED);
|
||||
ALTER TABLE gtestxx_3 INHERIT gtest1; -- ok
|
||||
CREATE TABLE gtestxx_4 (b int GENERATED ALWAYS AS (a * 2) STORED, a int NOT NULL);
|
||||
ALTER TABLE gtestxx_4 INHERIT gtest1; -- ok
|
||||
|
||||
-- test multiple inheritance mismatches
|
||||
CREATE TABLE gtesty (x int, b int);
|
||||
CREATE TABLE gtest1_2 () INHERITS (gtest1, gtesty); -- error
|
||||
|
||||
Reference in New Issue
Block a user