@@ -593,40 +593,95 @@ ERROR: cannot use generated column "b" in column generation expression
593
593
DETAIL: A generated column cannot reference another generated column.
594
594
ALTER TABLE gtest25 ADD COLUMN x int GENERATED ALWAYS AS (z * 4) STORED; -- error
595
595
ERROR: column "z" does not exist
596
+ ALTER TABLE gtest25 ADD COLUMN c int DEFAULT 42,
597
+ ADD COLUMN x int GENERATED ALWAYS AS (c * 4) STORED;
598
+ ALTER TABLE gtest25 ADD COLUMN d int DEFAULT 101;
599
+ ALTER TABLE gtest25 ALTER COLUMN d SET DATA TYPE float8,
600
+ ADD COLUMN y float8 GENERATED ALWAYS AS (d * 4) STORED;
601
+ SELECT * FROM gtest25 ORDER BY a;
602
+ a | b | c | x | d | y
603
+ ---+----+----+-----+-----+-----
604
+ 3 | 9 | 42 | 168 | 101 | 404
605
+ 4 | 12 | 42 | 168 | 101 | 404
606
+ (2 rows)
607
+
608
+ \d gtest25
609
+ Table "public.gtest25"
610
+ Column | Type | Collation | Nullable | Default
611
+ --------+------------------+-----------+----------+------------------------------------------------------
612
+ a | integer | | not null |
613
+ b | integer | | | generated always as (a * 3) stored
614
+ c | integer | | | 42
615
+ x | integer | | | generated always as (c * 4) stored
616
+ d | double precision | | | 101
617
+ y | double precision | | | generated always as (d * 4::double precision) stored
618
+ Indexes:
619
+ "gtest25_pkey" PRIMARY KEY, btree (a)
620
+
596
621
-- ALTER TABLE ... ALTER COLUMN
597
622
CREATE TABLE gtest27 (
598
623
a int,
599
- b int GENERATED ALWAYS AS (a * 2) STORED
624
+ b int,
625
+ x int GENERATED ALWAYS AS ((a + b) * 2) STORED
600
626
);
601
- INSERT INTO gtest27 (a) VALUES (3), (4);
627
+ INSERT INTO gtest27 (a, b ) VALUES (3, 7 ), (4, 11 );
602
628
ALTER TABLE gtest27 ALTER COLUMN a TYPE text; -- error
603
629
ERROR: cannot alter type of a column used by a generated column
604
- DETAIL: Column "a" is used by generated column "b ".
605
- ALTER TABLE gtest27 ALTER COLUMN b TYPE numeric;
630
+ DETAIL: Column "a" is used by generated column "x ".
631
+ ALTER TABLE gtest27 ALTER COLUMN x TYPE numeric;
606
632
\d gtest27
607
- Table "public.gtest27"
608
- Column | Type | Collation | Nullable | Default
609
- --------+---------+-----------+----------+--------------------------------------
633
+ Table "public.gtest27"
634
+ Column | Type | Collation | Nullable | Default
635
+ --------+---------+-----------+----------+--------------------------------------------
610
636
a | integer | | |
611
- b | numeric | | | generated always as ((a * 2)) stored
637
+ b | integer | | |
638
+ x | numeric | | | generated always as (((a + b) * 2)) stored
612
639
613
640
SELECT * FROM gtest27;
614
- a | b
615
- ---+---
616
- 3 | 6
617
- 4 | 8
641
+ a | b | x
642
+ ---+----+----
643
+ 3 | 7 | 20
644
+ 4 | 11 | 30
618
645
(2 rows)
619
646
620
- ALTER TABLE gtest27 ALTER COLUMN b TYPE boolean USING b <> 0; -- error
621
- ERROR: generation expression for column "b" cannot be cast automatically to type boolean
622
- ALTER TABLE gtest27 ALTER COLUMN b DROP DEFAULT; -- error
623
- ERROR: column "b" of relation "gtest27" is a generated column
647
+ ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error
648
+ ERROR: generation expression for column "x" cannot be cast automatically to type boolean
649
+ ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error
650
+ ERROR: column "x" of relation "gtest27" is a generated column
651
+ -- It's possible to alter the column types this way:
652
+ ALTER TABLE gtest27
653
+ DROP COLUMN x,
654
+ ALTER COLUMN a TYPE bigint,
655
+ ALTER COLUMN b TYPE bigint,
656
+ ADD COLUMN x bigint GENERATED ALWAYS AS ((a + b) * 2) STORED;
624
657
\d gtest27
625
- Table "public.gtest27"
626
- Column | Type | Collation | Nullable | Default
627
- --------+---------+-----------+----------+--------------------------------------
628
- a | integer | | |
629
- b | numeric | | | generated always as ((a * 2)) stored
658
+ Table "public.gtest27"
659
+ Column | Type | Collation | Nullable | Default
660
+ --------+--------+-----------+----------+------------------------------------------
661
+ a | bigint | | |
662
+ b | bigint | | |
663
+ x | bigint | | | generated always as ((a + b) * 2) stored
664
+
665
+ -- Ideally you could just do this, but not today (and should x change type?):
666
+ ALTER TABLE gtest27
667
+ ALTER COLUMN a TYPE float8,
668
+ ALTER COLUMN b TYPE float8; -- error
669
+ ERROR: cannot alter type of a column used by a generated column
670
+ DETAIL: Column "a" is used by generated column "x".
671
+ \d gtest27
672
+ Table "public.gtest27"
673
+ Column | Type | Collation | Nullable | Default
674
+ --------+--------+-----------+----------+------------------------------------------
675
+ a | bigint | | |
676
+ b | bigint | | |
677
+ x | bigint | | | generated always as ((a + b) * 2) stored
678
+
679
+ SELECT * FROM gtest27;
680
+ a | b | x
681
+ ---+----+----
682
+ 3 | 7 | 20
683
+ 4 | 11 | 30
684
+ (2 rows)
630
685
631
686
-- triggers
632
687
CREATE TABLE gtest26 (
0 commit comments