@@ -122,6 +122,24 @@ SELECT * FROM gtest1 ORDER BY a;
122
122
4 | 8
123
123
(4 rows)
124
124
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
+
125
143
DELETE FROM gtest1 WHERE a >= 3;
126
144
UPDATE gtest1 SET b = DEFAULT WHERE a = 1;
127
145
UPDATE gtest1 SET b = 11 WHERE a = 1; -- error
@@ -177,7 +195,12 @@ SELECT * FROM gtest1 ORDER BY a;
177
195
2 | 4
178
196
(2 rows)
179
197
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
+
181
204
SELECT * FROM gtest1 ORDER BY a;
182
205
a | b
183
206
---+---
@@ -203,14 +226,42 @@ CREATE TABLE gtestm (
203
226
INSERT INTO gtestm VALUES (1, 5, 100);
204
227
MERGE INTO gtestm t USING (VALUES (1, 10), (2, 20)) v(id, f1) ON t.id = v.id
205
228
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
+
207
237
SELECT * FROM gtestm ORDER BY id;
208
238
id | f1 | f2 | f3 | f4
209
239
----+----+-----+----+-----
210
240
1 | 10 | 100 | 20 | 200
211
241
2 | 20 | 200 | 40 | 400
212
242
(2 rows)
213
243
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
+
214
265
DROP TABLE gtestm;
215
266
-- views
216
267
CREATE VIEW gtest1v AS SELECT * FROM gtest1;
@@ -319,6 +370,21 @@ Not-null constraints:
319
370
"gtest1_a_not_null" NOT NULL "a" (inherited)
320
371
Inherits: gtest1
321
372
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
+
322
388
CREATE TABLE gtestxx_1 (a int NOT NULL, b int);
323
389
ALTER TABLE gtestxx_1 INHERIT gtest1; -- error
324
390
ERROR: 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
541
607
REVOKE ALL ON FUNCTION gf1(int) FROM PUBLIC;
542
608
CREATE TABLE gtest12 (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (gf1(b)) STORED);
543
609
INSERT 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;
545
611
SET ROLE regress_user11;
546
612
SELECT a, b FROM gtest11; -- not allowed
547
613
ERROR: permission denied for table gtest11
@@ -554,7 +620,9 @@ SELECT a, c FROM gtest11; -- allowed
554
620
555
621
SELECT gf1(10); -- not allowed
556
622
ERROR: 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)
558
626
a | c
559
627
---+----
560
628
1 | 30
@@ -589,6 +657,13 @@ INSERT INTO gtest20b (a) VALUES (30);
589
657
ALTER TABLE gtest20b ADD CONSTRAINT chk CHECK (b < 50) NOT VALID;
590
658
ALTER TABLE gtest20b VALIDATE CONSTRAINT chk; -- fails on existing row
591
659
ERROR: 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).
592
667
-- not-null constraints
593
668
CREATE TABLE gtest21a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (nullif(a, 0)) STORED NOT NULL);
594
669
INSERT INTO gtest21a (a) VALUES (1); -- ok
@@ -758,6 +833,11 @@ CREATE TABLE gtest24 (a int PRIMARY KEY, b gtestdomain1 GENERATED ALWAYS AS (a *
758
833
INSERT INTO gtest24 (a) VALUES (4); -- ok
759
834
INSERT INTO gtest24 (a) VALUES (6); -- error
760
835
ERROR: 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"
761
841
-- typed tables (currently not supported)
762
842
CREATE TYPE gtest_type AS (f1 integer, f2 text, f3 bigint);
763
843
CREATE 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;
841
921
gtest_child2 | 08-15-2016 | 3 | 66
842
922
(3 rows)
843
923
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
+
844
942
UPDATE gtest_parent SET f1 = f1 + 60 WHERE f2 = 1;
845
943
SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3;
846
944
tableoid | f1 | f2 | f3
@@ -1184,6 +1282,18 @@ Inherits: gtest30
1184
1282
1185
1283
ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error
1186
1284
ERROR: 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;
1187
1297
-- triggers
1188
1298
CREATE TABLE gtest26 (
1189
1299
a int PRIMARY KEY,
@@ -1294,7 +1404,7 @@ UPDATE gtest26 SET a = 1 WHERE a = 0;
1294
1404
NOTICE: OK
1295
1405
DROP TRIGGER gtest11 ON gtest26;
1296
1406
TRUNCATE gtest26;
1297
- -- check that modifications of stored generated columns in triggers do
1407
+ -- check that modifications of generated columns in triggers do
1298
1408
-- not get propagated
1299
1409
CREATE FUNCTION gtest_trigger_func4() RETURNS trigger
1300
1410
LANGUAGE plpgsql
@@ -1305,20 +1415,28 @@ BEGIN
1305
1415
RETURN NEW;
1306
1416
END;
1307
1417
$$;
1308
- CREATE TRIGGER gtest12_01 BEFORE UPDATE ON gtest26
1418
+ CREATE TRIGGER gtest12_01 BEFORE INSERT OR UPDATE ON gtest26
1309
1419
FOR EACH ROW
1310
1420
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
1312
1422
FOR EACH ROW
1313
1423
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
1315
1425
FOR EACH ROW
1316
1426
EXECUTE PROCEDURE gtest_trigger_func();
1317
1427
INSERT 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)
1320
1438
INFO: gtest12_01: BEFORE: new = (11,)
1321
- INFO: gtest12_03: BEFORE: old = (1,2 )
1439
+ INFO: gtest12_03: BEFORE: old = (10,20 )
1322
1440
INFO: gtest12_03: BEFORE: new = (10,)
1323
1441
SELECT * FROM gtest26 ORDER BY a;
1324
1442
a | b
0 commit comments