mirror of
https://github.com/postgres/postgres.git
synced 2025-06-26 12:21:12 +03:00
Fix virtual generated column type checking for ALTER TABLE
Virtual generated columns have some special checks in CheckAttributeType(), mainly to check that domains are not used. But this check was only applied during CREATE TABLE, not during ALTER TABLE. This fixes that. Reported-by: jian he <jian.universality@gmail.com> Discussion: https://www.postgresql.org/message-id/CACJufxE0KHR__-h=zHXbhSNZXMMs4LYo4-dbj8H3YoStYBok1Q@mail.gmail.com
This commit is contained in:
@ -7374,7 +7374,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
|||||||
/* make sure datatype is legal for a column */
|
/* make sure datatype is legal for a column */
|
||||||
CheckAttributeType(NameStr(attribute->attname), attribute->atttypid, attribute->attcollation,
|
CheckAttributeType(NameStr(attribute->attname), attribute->atttypid, attribute->attcollation,
|
||||||
list_make1_oid(rel->rd_rel->reltype),
|
list_make1_oid(rel->rd_rel->reltype),
|
||||||
0);
|
(attribute->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL ? CHKATYPE_IS_VIRTUAL : 0));
|
||||||
|
|
||||||
InsertPgAttributeTuples(attrdesc, tupdesc, myrelid, NULL, NULL);
|
InsertPgAttributeTuples(attrdesc, tupdesc, myrelid, NULL, NULL);
|
||||||
|
|
||||||
@ -14426,7 +14426,7 @@ ATPrepAlterColumnType(List **wqueue,
|
|||||||
/* make sure datatype is legal for a column */
|
/* make sure datatype is legal for a column */
|
||||||
CheckAttributeType(colName, targettype, targetcollid,
|
CheckAttributeType(colName, targettype, targetcollid,
|
||||||
list_make1_oid(rel->rd_rel->reltype),
|
list_make1_oid(rel->rd_rel->reltype),
|
||||||
0);
|
(attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL ? CHKATYPE_IS_VIRTUAL : 0));
|
||||||
|
|
||||||
if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
|
if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
|
||||||
{
|
{
|
||||||
|
@ -800,6 +800,12 @@ CREATE TABLE gtest24r (a int PRIMARY KEY, b gtestdomain1range GENERATED ALWAYS A
|
|||||||
ERROR: virtual generated column "b" cannot have a domain type
|
ERROR: virtual generated column "b" cannot have a domain type
|
||||||
--INSERT INTO gtest24r (a) VALUES (4); -- ok
|
--INSERT INTO gtest24r (a) VALUES (4); -- ok
|
||||||
--INSERT INTO gtest24r (a) VALUES (6); -- error
|
--INSERT INTO gtest24r (a) VALUES (6); -- error
|
||||||
|
CREATE TABLE gtest24at (a int PRIMARY KEY);
|
||||||
|
ALTER TABLE gtest24at ADD COLUMN b gtestdomain1 GENERATED ALWAYS AS (a * 2) VIRTUAL; -- error
|
||||||
|
ERROR: virtual generated column "b" cannot have a domain type
|
||||||
|
CREATE TABLE gtest24ata (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) VIRTUAL);
|
||||||
|
ALTER TABLE gtest24ata ALTER COLUMN b TYPE gtestdomain1; -- error
|
||||||
|
ERROR: virtual generated column "b" cannot have a domain type
|
||||||
CREATE DOMAIN gtestdomainnn AS int CHECK (VALUE IS NOT NULL);
|
CREATE DOMAIN gtestdomainnn AS int CHECK (VALUE IS NOT NULL);
|
||||||
CREATE TABLE gtest24nn (a int, b gtestdomainnn GENERATED ALWAYS AS (a * 2) VIRTUAL);
|
CREATE TABLE gtest24nn (a int, b gtestdomainnn GENERATED ALWAYS AS (a * 2) VIRTUAL);
|
||||||
ERROR: virtual generated column "b" cannot have a domain type
|
ERROR: virtual generated column "b" cannot have a domain type
|
||||||
|
@ -453,6 +453,11 @@ CREATE TABLE gtest24r (a int PRIMARY KEY, b gtestdomain1range GENERATED ALWAYS A
|
|||||||
--INSERT INTO gtest24r (a) VALUES (4); -- ok
|
--INSERT INTO gtest24r (a) VALUES (4); -- ok
|
||||||
--INSERT INTO gtest24r (a) VALUES (6); -- error
|
--INSERT INTO gtest24r (a) VALUES (6); -- error
|
||||||
|
|
||||||
|
CREATE TABLE gtest24at (a int PRIMARY KEY);
|
||||||
|
ALTER TABLE gtest24at ADD COLUMN b gtestdomain1 GENERATED ALWAYS AS (a * 2) VIRTUAL; -- error
|
||||||
|
CREATE TABLE gtest24ata (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) VIRTUAL);
|
||||||
|
ALTER TABLE gtest24ata ALTER COLUMN b TYPE gtestdomain1; -- error
|
||||||
|
|
||||||
CREATE DOMAIN gtestdomainnn AS int CHECK (VALUE IS NOT NULL);
|
CREATE DOMAIN gtestdomainnn AS int CHECK (VALUE IS NOT NULL);
|
||||||
CREATE TABLE gtest24nn (a int, b gtestdomainnn GENERATED ALWAYS AS (a * 2) VIRTUAL);
|
CREATE TABLE gtest24nn (a int, b gtestdomainnn GENERATED ALWAYS AS (a * 2) VIRTUAL);
|
||||||
--INSERT INTO gtest24nn (a) VALUES (4); -- ok
|
--INSERT INTO gtest24nn (a) VALUES (4); -- ok
|
||||||
|
Reference in New Issue
Block a user