@@ -122,6 +122,24 @@ SELECT * FROM gtest1 ORDER BY a;
122122 4 | 8
123123(4 rows)
124124
125+ SELECT gtest1 FROM gtest1 ORDER BY a; -- whole-row reference
126+ gtest1
127+ --------
128+ (1,2)
129+ (2,4)
130+ (3,6)
131+ (4,8)
132+ (4 rows)
133+
134+ SELECT a, (SELECT gtest1.b) FROM gtest1 ORDER BY a; -- sublink
135+ a | b
136+ ---+---
137+ 1 | 2
138+ 2 | 4
139+ 3 | 6
140+ 4 | 8
141+ (4 rows)
142+
125143DELETE FROM gtest1 WHERE a >= 3;
126144UPDATE gtest1 SET b = DEFAULT WHERE a = 1;
127145UPDATE gtest1 SET b = 11 WHERE a = 1; -- error
@@ -177,7 +195,12 @@ SELECT * FROM gtest1 ORDER BY a;
177195 2 | 4
178196(2 rows)
179197
180- UPDATE gtest1 SET a = 3 WHERE b = 4;
198+ UPDATE gtest1 SET a = 3 WHERE b = 4 RETURNING old.*, new.*;
199+ a | b | a | b
200+ ---+---+---+---
201+ 2 | 4 | 3 | 6
202+ (1 row)
203+
181204SELECT * FROM gtest1 ORDER BY a;
182205 a | b
183206---+---
@@ -203,14 +226,42 @@ CREATE TABLE gtestm (
203226INSERT INTO gtestm VALUES (1, 5, 100);
204227MERGE INTO gtestm t USING (VALUES (1, 10), (2, 20)) v(id, f1) ON t.id = v.id
205228 WHEN MATCHED THEN UPDATE SET f1 = v.f1
206- WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200);
229+ WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200)
230+ RETURNING merge_action(), old.*, new.*;
231+ merge_action | id | f1 | f2 | f3 | f4 | id | f1 | f2 | f3 | f4
232+ --------------+----+----+-----+----+-----+----+----+-----+----+-----
233+ UPDATE | 1 | 5 | 100 | 10 | 200 | 1 | 10 | 100 | 20 | 200
234+ INSERT | | | | | | 2 | 20 | 200 | 40 | 400
235+ (2 rows)
236+
207237SELECT * FROM gtestm ORDER BY id;
208238 id | f1 | f2 | f3 | f4
209239----+----+-----+----+-----
210240 1 | 10 | 100 | 20 | 200
211241 2 | 20 | 200 | 40 | 400
212242(2 rows)
213243
244+ DROP TABLE gtestm;
245+ CREATE TABLE gtestm (
246+ a int PRIMARY KEY,
247+ b int GENERATED ALWAYS AS (a * 2) STORED
248+ );
249+ INSERT INTO gtestm (a) SELECT g FROM generate_series(1, 10) g;
250+ MERGE INTO gtestm t USING gtestm AS s ON 2 * t.a = s.b WHEN MATCHED THEN DELETE RETURNING *;
251+ a | b | a | b
252+ ----+----+----+----
253+ 1 | 2 | 1 | 2
254+ 2 | 4 | 2 | 4
255+ 3 | 6 | 3 | 6
256+ 4 | 8 | 4 | 8
257+ 5 | 10 | 5 | 10
258+ 6 | 12 | 6 | 12
259+ 7 | 14 | 7 | 14
260+ 8 | 16 | 8 | 16
261+ 9 | 18 | 9 | 18
262+ 10 | 20 | 10 | 20
263+ (10 rows)
264+
214265DROP TABLE gtestm;
215266-- views
216267CREATE VIEW gtest1v AS SELECT * FROM gtest1;
@@ -319,6 +370,21 @@ Not-null constraints:
319370 "gtest1_a_not_null" NOT NULL "a" (inherited)
320371Inherits: gtest1
321372
373+ INSERT INTO gtestx (a, x) VALUES (11, 22);
374+ SELECT * FROM gtest1;
375+ a | b
376+ ----+-----
377+ 3 | 6
378+ 4 | 8
379+ 11 | 242
380+ (3 rows)
381+
382+ SELECT * FROM gtestx;
383+ a | b | x
384+ ----+-----+----
385+ 11 | 242 | 22
386+ (1 row)
387+
322388CREATE TABLE gtestxx_1 (a int NOT NULL, b int);
323389ALTER TABLE gtestxx_1 INHERIT gtest1; -- error
324390ERROR: column "b" in child table must be a generated column
@@ -541,7 +607,7 @@ CREATE FUNCTION gf1(a int) RETURNS int AS $$ SELECT a * 3 $$ IMMUTABLE LANGUAGE
541607REVOKE ALL ON FUNCTION gf1(int) FROM PUBLIC;
542608CREATE TABLE gtest12 (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (gf1(b)) STORED);
543609INSERT INTO gtest12 VALUES (1, 10), (2, 20);
544- GRANT SELECT (a, c) ON gtest12 TO regress_user11;
610+ GRANT SELECT (a, c), INSERT ON gtest12 TO regress_user11;
545611SET ROLE regress_user11;
546612SELECT a, b FROM gtest11; -- not allowed
547613ERROR: permission denied for table gtest11
@@ -554,7 +620,9 @@ SELECT a, c FROM gtest11; -- allowed
554620
555621SELECT gf1(10); -- not allowed
556622ERROR: permission denied for function gf1
557- SELECT a, c FROM gtest12; -- allowed
623+ INSERT INTO gtest12 VALUES (3, 30), (4, 40); -- currently not allowed because of function permissions, should arguably be allowed
624+ ERROR: permission denied for function gf1
625+ SELECT a, c FROM gtest12; -- allowed (does not actually invoke the function)
558626 a | c
559627---+----
560628 1 | 30
@@ -589,6 +657,13 @@ INSERT INTO gtest20b (a) VALUES (30);
589657ALTER TABLE gtest20b ADD CONSTRAINT chk CHECK (b < 50) NOT VALID;
590658ALTER TABLE gtest20b VALIDATE CONSTRAINT chk; -- fails on existing row
591659ERROR: check constraint "chk" of relation "gtest20b" is violated by some row
660+ -- check with whole-row reference
661+ CREATE TABLE gtest20c (a int, b int GENERATED ALWAYS AS (a * 2) STORED);
662+ ALTER TABLE gtest20c ADD CONSTRAINT whole_row_check CHECK (gtest20c IS NOT NULL);
663+ INSERT INTO gtest20c VALUES (1); -- ok
664+ INSERT INTO gtest20c VALUES (NULL); -- fails
665+ ERROR: new row for relation "gtest20c" violates check constraint "whole_row_check"
666+ DETAIL: Failing row contains (null, null).
592667-- not-null constraints
593668CREATE TABLE gtest21a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (nullif(a, 0)) STORED NOT NULL);
594669INSERT INTO gtest21a (a) VALUES (1); -- ok
@@ -758,6 +833,11 @@ CREATE TABLE gtest24 (a int PRIMARY KEY, b gtestdomain1 GENERATED ALWAYS AS (a *
758833INSERT INTO gtest24 (a) VALUES (4); -- ok
759834INSERT INTO gtest24 (a) VALUES (6); -- error
760835ERROR: value for domain gtestdomain1 violates check constraint "gtestdomain1_check"
836+ CREATE TYPE gtestdomain1range AS range (subtype = gtestdomain1);
837+ CREATE TABLE gtest24r (a int PRIMARY KEY, b gtestdomain1range GENERATED ALWAYS AS (gtestdomain1range(a, a + 5)) STORED);
838+ INSERT INTO gtest24r (a) VALUES (4); -- ok
839+ INSERT INTO gtest24r (a) VALUES (6); -- error
840+ ERROR: value for domain gtestdomain1 violates check constraint "gtestdomain1_check"
761841-- typed tables (currently not supported)
762842CREATE TYPE gtest_type AS (f1 integer, f2 text, f3 bigint);
763843CREATE TABLE gtest28 OF gtest_type (f1 WITH OPTIONS GENERATED ALWAYS AS (f2 *2) STORED);
@@ -841,6 +921,24 @@ SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3;
841921 gtest_child2 | 08-15-2016 | 3 | 66
842922(3 rows)
843923
924+ SELECT tableoid::regclass, * FROM gtest_child ORDER BY 1, 2, 3;
925+ tableoid | f1 | f2 | f3
926+ -------------+------------+----+----
927+ gtest_child | 07-15-2016 | 1 | 2
928+ gtest_child | 07-15-2016 | 2 | 4
929+ (2 rows)
930+
931+ SELECT tableoid::regclass, * FROM gtest_child2 ORDER BY 1, 2, 3;
932+ tableoid | f1 | f2 | f3
933+ --------------+------------+----+----
934+ gtest_child2 | 08-15-2016 | 3 | 66
935+ (1 row)
936+
937+ SELECT tableoid::regclass, * FROM gtest_child3 ORDER BY 1, 2, 3;
938+ tableoid | f1 | f2 | f3
939+ ----------+----+----+----
940+ (0 rows)
941+
844942UPDATE gtest_parent SET f1 = f1 + 60 WHERE f2 = 1;
845943SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3;
846944 tableoid | f1 | f2 | f3
@@ -1184,6 +1282,18 @@ Inherits: gtest30
11841282
11851283ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error
11861284ERROR: cannot drop generation expression from inherited column
1285+ -- composite type dependencies
1286+ CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text);
1287+ CREATE TABLE gtest31_2 (x int, y gtest31_1);
1288+ ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails
1289+ ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type
1290+ DROP TABLE gtest31_1, gtest31_2;
1291+ -- Check it for a partitioned table, too
1292+ CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text) PARTITION BY LIST (a);
1293+ CREATE TABLE gtest31_2 (x int, y gtest31_1);
1294+ ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails
1295+ ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type
1296+ DROP TABLE gtest31_1, gtest31_2;
11871297-- triggers
11881298CREATE TABLE gtest26 (
11891299 a int PRIMARY KEY,
@@ -1294,7 +1404,7 @@ UPDATE gtest26 SET a = 1 WHERE a = 0;
12941404NOTICE: OK
12951405DROP TRIGGER gtest11 ON gtest26;
12961406TRUNCATE gtest26;
1297- -- check that modifications of stored generated columns in triggers do
1407+ -- check that modifications of generated columns in triggers do
12981408-- not get propagated
12991409CREATE FUNCTION gtest_trigger_func4() RETURNS trigger
13001410 LANGUAGE plpgsql
@@ -1305,20 +1415,28 @@ BEGIN
13051415 RETURN NEW;
13061416END;
13071417$$;
1308- CREATE TRIGGER gtest12_01 BEFORE UPDATE ON gtest26
1418+ CREATE TRIGGER gtest12_01 BEFORE INSERT OR UPDATE ON gtest26
13091419 FOR EACH ROW
13101420 EXECUTE PROCEDURE gtest_trigger_func();
1311- CREATE TRIGGER gtest12_02 BEFORE UPDATE ON gtest26
1421+ CREATE TRIGGER gtest12_02 BEFORE INSERT OR UPDATE ON gtest26
13121422 FOR EACH ROW
13131423 EXECUTE PROCEDURE gtest_trigger_func4();
1314- CREATE TRIGGER gtest12_03 BEFORE UPDATE ON gtest26
1424+ CREATE TRIGGER gtest12_03 BEFORE INSERT OR UPDATE ON gtest26
13151425 FOR EACH ROW
13161426 EXECUTE PROCEDURE gtest_trigger_func();
13171427INSERT INTO gtest26 (a) VALUES (1);
1318- UPDATE gtest26 SET a = 11 WHERE a = 1;
1319- INFO: gtest12_01: BEFORE: old = (1,2)
1428+ INFO: gtest12_01: BEFORE: new = (1,)
1429+ INFO: gtest12_03: BEFORE: new = (10,300)
1430+ SELECT * FROM gtest26 ORDER BY a;
1431+ a | b
1432+ ----+----
1433+ 10 | 20
1434+ (1 row)
1435+
1436+ UPDATE gtest26 SET a = 11 WHERE a = 10;
1437+ INFO: gtest12_01: BEFORE: old = (10,20)
13201438INFO: gtest12_01: BEFORE: new = (11,)
1321- INFO: gtest12_03: BEFORE: old = (1,2 )
1439+ INFO: gtest12_03: BEFORE: old = (10,20 )
13221440INFO: gtest12_03: BEFORE: new = (10,)
13231441SELECT * FROM gtest26 ORDER BY a;
13241442 a | b
0 commit comments