Fix obsolete comment regarding FSM truncation.
[PostgreSQL.git] / src / test / regress / expected / returning.out
blobb04f6f1a0efe0d00612652f67b718f998becfbc5
1 --
2 -- Test INSERT/UPDATE/DELETE RETURNING
3 --
4 -- Simple cases
5 CREATE TEMP TABLE foo (f1 serial, f2 text, f3 int default 42);
6 NOTICE:  CREATE TABLE will create implicit sequence "foo_f1_seq" for serial column "foo.f1"
7 INSERT INTO foo (f2,f3)
8   VALUES ('test', DEFAULT), ('More', 11), (upper('more'), 7+9)
9   RETURNING *, f1+f3 AS sum;
10  f1 |  f2  | f3 | sum 
11 ----+------+----+-----
12   1 | test | 42 |  43
13   2 | More | 11 |  13
14   3 | MORE | 16 |  19
15 (3 rows)
17 SELECT * FROM foo;
18  f1 |  f2  | f3 
19 ----+------+----
20   1 | test | 42
21   2 | More | 11
22   3 | MORE | 16
23 (3 rows)
25 UPDATE foo SET f2 = lower(f2), f3 = DEFAULT RETURNING foo.*, f1+f3 AS sum13;
26  f1 |  f2  | f3 | sum13 
27 ----+------+----+-------
28   1 | test | 42 |    43
29   2 | more | 42 |    44
30   3 | more | 42 |    45
31 (3 rows)
33 SELECT * FROM foo;
34  f1 |  f2  | f3 
35 ----+------+----
36   1 | test | 42
37   2 | more | 42
38   3 | more | 42
39 (3 rows)
41 DELETE FROM foo WHERE f1 > 2 RETURNING f3, f2, f1, least(f1,f3);
42  f3 |  f2  | f1 | least 
43 ----+------+----+-------
44  42 | more |  3 |     3
45 (1 row)
47 SELECT * FROM foo;
48  f1 |  f2  | f3 
49 ----+------+----
50   1 | test | 42
51   2 | more | 42
52 (2 rows)
54 -- Subplans and initplans in the RETURNING list
55 INSERT INTO foo SELECT f1+10, f2, f3+99 FROM foo
56   RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan,
57     EXISTS(SELECT * FROM int4_tbl) AS initplan;
58  f1 |  f2  | f3  | subplan | initplan 
59 ----+------+-----+---------+----------
60  11 | test | 141 | t       | t
61  12 | more | 141 | f       | t
62 (2 rows)
64 UPDATE foo SET f3 = f3 * 2
65   WHERE f1 > 10
66   RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan,
67     EXISTS(SELECT * FROM int4_tbl) AS initplan;
68  f1 |  f2  | f3  | subplan | initplan 
69 ----+------+-----+---------+----------
70  11 | test | 282 | t       | t
71  12 | more | 282 | f       | t
72 (2 rows)
74 DELETE FROM foo
75   WHERE f1 > 10
76   RETURNING *, f1+112 IN (SELECT q1 FROM int8_tbl) AS subplan,
77     EXISTS(SELECT * FROM int4_tbl) AS initplan;
78  f1 |  f2  | f3  | subplan | initplan 
79 ----+------+-----+---------+----------
80  11 | test | 282 | t       | t
81  12 | more | 282 | f       | t
82 (2 rows)
84 -- Joins
85 UPDATE foo SET f3 = f3*2
86   FROM int4_tbl i
87   WHERE foo.f1 + 123455 = i.f1
88   RETURNING foo.*, i.f1 as "i.f1";
89  f1 |  f2  | f3 |  i.f1  
90 ----+------+----+--------
91   1 | test | 84 | 123456
92 (1 row)
94 SELECT * FROM foo;
95  f1 |  f2  | f3 
96 ----+------+----
97   2 | more | 42
98   1 | test | 84
99 (2 rows)
101 DELETE FROM foo
102   USING int4_tbl i
103   WHERE foo.f1 + 123455 = i.f1
104   RETURNING foo.*, i.f1 as "i.f1";
105  f1 |  f2  | f3 |  i.f1  
106 ----+------+----+--------
107   1 | test | 84 | 123456
108 (1 row)
110 SELECT * FROM foo;
111  f1 |  f2  | f3 
112 ----+------+----
113   2 | more | 42
114 (1 row)
116 -- Check inheritance cases
117 CREATE TEMP TABLE foochild (fc int) INHERITS (foo);
118 INSERT INTO foochild VALUES(123,'child',999,-123);
119 ALTER TABLE foo ADD COLUMN f4 int8 DEFAULT 99;
120 SELECT * FROM foo;
121  f1  |  f2   | f3  | f4 
122 -----+-------+-----+----
123    2 | more  |  42 | 99
124  123 | child | 999 | 99
125 (2 rows)
127 SELECT * FROM foochild;
128  f1  |  f2   | f3  |  fc  | f4 
129 -----+-------+-----+------+----
130  123 | child | 999 | -123 | 99
131 (1 row)
133 UPDATE foo SET f4 = f4 + f3 WHERE f4 = 99 RETURNING *;
134  f1  |  f2   | f3  |  f4  
135 -----+-------+-----+------
136    2 | more  |  42 |  141
137  123 | child | 999 | 1098
138 (2 rows)
140 SELECT * FROM foo;
141  f1  |  f2   | f3  |  f4  
142 -----+-------+-----+------
143    2 | more  |  42 |  141
144  123 | child | 999 | 1098
145 (2 rows)
147 SELECT * FROM foochild;
148  f1  |  f2   | f3  |  fc  |  f4  
149 -----+-------+-----+------+------
150  123 | child | 999 | -123 | 1098
151 (1 row)
153 UPDATE foo SET f3 = f3*2
154   FROM int8_tbl i
155   WHERE foo.f1 = i.q2
156   RETURNING *;
157  f1  |  f2   |  f3  |  f4  |        q1        | q2  
158 -----+-------+------+------+------------------+-----
159  123 | child | 1998 | 1098 | 4567890123456789 | 123
160 (1 row)
162 SELECT * FROM foo;
163  f1  |  f2   |  f3  |  f4  
164 -----+-------+------+------
165    2 | more  |   42 |  141
166  123 | child | 1998 | 1098
167 (2 rows)
169 SELECT * FROM foochild;
170  f1  |  f2   |  f3  |  fc  |  f4  
171 -----+-------+------+------+------
172  123 | child | 1998 | -123 | 1098
173 (1 row)
175 DELETE FROM foo
176   USING int8_tbl i
177   WHERE foo.f1 = i.q2
178   RETURNING *;
179  f1  |  f2   |  f3  |  f4  |        q1        | q2  
180 -----+-------+------+------+------------------+-----
181  123 | child | 1998 | 1098 | 4567890123456789 | 123
182 (1 row)
184 SELECT * FROM foo;
185  f1 |  f2  | f3 | f4  
186 ----+------+----+-----
187   2 | more | 42 | 141
188 (1 row)
190 SELECT * FROM foochild;
191  f1 | f2 | f3 | fc | f4 
192 ----+----+----+----+----
193 (0 rows)
195 DROP TABLE foochild;
196 -- Rules and views
197 CREATE TEMP VIEW voo AS SELECT f1, f2 FROM foo;
198 CREATE RULE voo_i AS ON INSERT TO voo DO INSTEAD
199   INSERT INTO foo VALUES(new.*, 57);
200 INSERT INTO voo VALUES(11,'zit');
201 -- fails:
202 INSERT INTO voo VALUES(12,'zoo') RETURNING *, f1*2;
203 ERROR:  cannot perform INSERT RETURNING on relation "voo"
204 HINT:  You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.
205 -- fails, incompatible list:
206 CREATE OR REPLACE RULE voo_i AS ON INSERT TO voo DO INSTEAD
207   INSERT INTO foo VALUES(new.*, 57) RETURNING *;
208 ERROR:  RETURNING list has too many entries
209 CREATE OR REPLACE RULE voo_i AS ON INSERT TO voo DO INSTEAD
210   INSERT INTO foo VALUES(new.*, 57) RETURNING f1, f2;
211 -- should still work
212 INSERT INTO voo VALUES(13,'zit2');
213 -- works now
214 INSERT INTO voo VALUES(14,'zoo2') RETURNING *;
215  f1 |  f2  
216 ----+------
217  14 | zoo2
218 (1 row)
220 SELECT * FROM foo;
221  f1 |  f2  | f3 | f4  
222 ----+------+----+-----
223   2 | more | 42 | 141
224  11 | zit  | 57 |  99
225  13 | zit2 | 57 |  99
226  14 | zoo2 | 57 |  99
227 (4 rows)
229 SELECT * FROM voo;
230  f1 |  f2  
231 ----+------
232   2 | more
233  11 | zit
234  13 | zit2
235  14 | zoo2
236 (4 rows)
238 CREATE OR REPLACE RULE voo_u AS ON UPDATE TO voo DO INSTEAD
239   UPDATE foo SET f1 = new.f1, f2 = new.f2 WHERE f1 = old.f1
240   RETURNING f1, f2;
241 update voo set f1 = f1 + 1 where f2 = 'zoo2';
242 update voo set f1 = f1 + 1 where f2 = 'zoo2' RETURNING *, f1*2;
243  f1 |  f2  | ?column? 
244 ----+------+----------
245  16 | zoo2 |       32
246 (1 row)
248 SELECT * FROM foo;
249  f1 |  f2  | f3 | f4  
250 ----+------+----+-----
251   2 | more | 42 | 141
252  11 | zit  | 57 |  99
253  13 | zit2 | 57 |  99
254  16 | zoo2 | 57 |  99
255 (4 rows)
257 SELECT * FROM voo;
258  f1 |  f2  
259 ----+------
260   2 | more
261  11 | zit
262  13 | zit2
263  16 | zoo2
264 (4 rows)
266 CREATE OR REPLACE RULE voo_d AS ON DELETE TO voo DO INSTEAD
267   DELETE FROM foo WHERE f1 = old.f1
268   RETURNING f1, f2;
269 DELETE FROM foo WHERE f1 = 13;
270 DELETE FROM foo WHERE f2 = 'zit' RETURNING *;
271  f1 | f2  | f3 | f4 
272 ----+-----+----+----
273  11 | zit | 57 | 99
274 (1 row)
276 SELECT * FROM foo;
277  f1 |  f2  | f3 | f4  
278 ----+------+----+-----
279   2 | more | 42 | 141
280  16 | zoo2 | 57 |  99
281 (2 rows)
283 SELECT * FROM voo;
284  f1 |  f2  
285 ----+------
286   2 | more
287  16 | zoo2
288 (2 rows)
290 -- Try a join case
291 CREATE TEMP TABLE joinme (f2j text, other int);
292 INSERT INTO joinme VALUES('more', 12345);
293 INSERT INTO joinme VALUES('zoo2', 54321);
294 INSERT INTO joinme VALUES('other', 0);
295 CREATE TEMP VIEW joinview AS
296   SELECT foo.*, other FROM foo JOIN joinme ON (f2 = f2j);
297 SELECT * FROM joinview;
298  f1 |  f2  | f3 | f4  | other 
299 ----+------+----+-----+-------
300   2 | more | 42 | 141 | 12345
301  16 | zoo2 | 57 |  99 | 54321
302 (2 rows)
304 CREATE RULE joinview_u AS ON UPDATE TO joinview DO INSTEAD
305   UPDATE foo SET f1 = new.f1, f3 = new.f3
306     FROM joinme WHERE f2 = f2j AND f2 = old.f2
307     RETURNING foo.*, other;
308 UPDATE joinview SET f1 = f1 + 1 WHERE f3 = 57 RETURNING *, other + 1;
309  f1 |  f2  | f3 | f4 | other | ?column? 
310 ----+------+----+----+-------+----------
311  17 | zoo2 | 57 | 99 | 54321 |    54322
312 (1 row)
314 SELECT * FROM joinview;
315  f1 |  f2  | f3 | f4  | other 
316 ----+------+----+-----+-------
317   2 | more | 42 | 141 | 12345
318  17 | zoo2 | 57 |  99 | 54321
319 (2 rows)
321 SELECT * FROM foo;
322  f1 |  f2  | f3 | f4  
323 ----+------+----+-----
324   2 | more | 42 | 141
325  17 | zoo2 | 57 |  99
326 (2 rows)
328 SELECT * FROM voo;
329  f1 |  f2  
330 ----+------
331   2 | more
332  17 | zoo2
333 (2 rows)