@ -593,40 +593,95 @@ ERROR: cannot use generated column "b" in column generation expression
DETAIL: A generated column cannot reference another generated column.
ALTER TABLE gtest25 ADD COLUMN x int GENERATED ALWAYS AS (z * 4) STORED; -- error
ERROR: column "z" does not exist
ALTER TABLE gtest25 ADD COLUMN c int DEFAULT 42,
ADD COLUMN x int GENERATED ALWAYS AS (c * 4) STORED;
ALTER TABLE gtest25 ADD COLUMN d int DEFAULT 101;
ALTER TABLE gtest25 ALTER COLUMN d SET DATA TYPE float8,
ADD COLUMN y float8 GENERATED ALWAYS AS (d * 4) STORED;
SELECT * FROM gtest25 ORDER BY a;
a | b | c | x | d | y
---+----+----+-----+-----+-----
3 | 9 | 42 | 168 | 101 | 404
4 | 12 | 42 | 168 | 101 | 404
(2 rows)
\d gtest25
Table "public.gtest25"
Column | Type | Collation | Nullable | Default
--------+------------------+-----------+----------+------------------------------------------------------
a | integer | | not null |
b | integer | | | generated always as (a * 3) stored
c | integer | | | 42
x | integer | | | generated always as (c * 4) stored
d | double precision | | | 101
y | double precision | | | generated always as (d * 4::double precision) stored
Indexes:
"gtest25_pkey" PRIMARY KEY, btree (a)
-- ALTER TABLE ... ALTER COLUMN
CREATE TABLE gtest27 (
a int,
b int GENERATED ALWAYS AS (a * 2) STORED
b int,
x int GENERATED ALWAYS AS ((a + b) * 2) STORED
);
INSERT INTO gtest27 (a) VALUES (3), (4);
INSERT INTO gtest27 (a, b ) VALUES (3, 7 ), (4, 11 );
ALTER TABLE gtest27 ALTER COLUMN a TYPE text; -- error
ERROR: cannot alter type of a column used by a generated column
DETAIL: Column "a" is used by generated column "b".
ALTER TABLE gtest27 ALTER COLUMN b TYPE numeric;
DETAIL: Column "a" is used by generated column "x ".
ALTER TABLE gtest27 ALTER COLUMN x TYPE numeric;
\d gtest27
Table "public.gtest27"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+--------------------------------------
--------+---------+-----------+----------+--------------------------------------------
a | integer | | |
b | numeric | | | generated always as ((a * 2)) stored
b | integer | | |
x | numeric | | | generated always as (((a + b) * 2)) stored
SELECT * FROM gtest27;
a | b
---+---
3 | 6
4 | 8
a | b | x
---+----+----
3 | 7 | 20
4 | 11 | 30
(2 rows)
ALTER TABLE gtest27 ALTER COLUMN b TYPE boolean USING b <> 0; -- error
ERROR: generation expression for column "b" cannot be cast automatically to type boolean
ALTER TABLE gtest27 ALTER COLUMN b DROP DEFAULT; -- error
ERROR: column "b" of relation "gtest27" is a generated column
ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error
ERROR: generation expression for column "x" cannot be cast automatically to type boolean
ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error
ERROR: column "x" of relation "gtest27" is a generated column
-- It's possible to alter the column types this way:
ALTER TABLE gtest27
DROP COLUMN x,
ALTER COLUMN a TYPE bigint,
ALTER COLUMN b TYPE bigint,
ADD COLUMN x bigint GENERATED ALWAYS AS ((a + b) * 2) STORED;
\d gtest27
Table "public.gtest27"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+--------------------------------------
a | integer | | |
b | numeric | | | generated always as ((a * 2)) stored
--------+--------+-----------+----------+------------------------------------------
a | bigint | | |
b | bigint | | |
x | bigint | | | generated always as ((a + b) * 2) stored
-- Ideally you could just do this, but not today (and should x change type?):
ALTER TABLE gtest27
ALTER COLUMN a TYPE float8,
ALTER COLUMN b TYPE float8; -- error
ERROR: cannot alter type of a column used by a generated column
DETAIL: Column "a" is used by generated column "x".
\d gtest27
Table "public.gtest27"
Column | Type | Collation | Nullable | Default
--------+--------+-----------+----------+------------------------------------------
a | bigint | | |
b | bigint | | |
x | bigint | | | generated always as ((a + b) * 2) stored
SELECT * FROM gtest27;
a | b | x
---+----+----
3 | 7 | 20
4 | 11 | 30
(2 rows)
-- triggers
CREATE TABLE gtest26 (