]> granicus.if.org Git - postgresql/blob - src/test/regress/expected/with.out
Extend CTE patch to support recursive UNION (ie, without ALL). The
[postgresql] / src / test / regress / expected / with.out
1 --
2 -- Tests for common table expressions (WITH query, ... SELECT ...)
3 --
4 -- Basic WITH
5 WITH q1(x,y) AS (SELECT 1,2)
6 SELECT * FROM q1, q1 AS q2;
7  x | y | x | y 
8 ---+---+---+---
9  1 | 2 | 1 | 2
10 (1 row)
11
12 -- Multiple uses are evaluated only once
13 SELECT count(*) FROM (
14   WITH q1(x) AS (SELECT random() FROM generate_series(1, 5))
15     SELECT * FROM q1
16   UNION
17     SELECT * FROM q1
18 ) ss;
19  count 
20 -------
21      5
22 (1 row)
23
24 -- WITH RECURSIVE
25 -- sum of 1..100
26 WITH RECURSIVE t(n) AS (
27     VALUES (1)
28 UNION ALL
29     SELECT n+1 FROM t WHERE n < 100
30 )
31 SELECT sum(n) FROM t;
32  sum  
33 ------
34  5050
35 (1 row)
36
37 WITH RECURSIVE t(n) AS (
38     SELECT (VALUES(1))
39 UNION ALL
40     SELECT n+1 FROM t WHERE n < 5
41 )
42 SELECT * FROM t;
43  n 
44 ---
45  1
46  2
47  3
48  4
49  5
50 (5 rows)
51
52 -- This is an infinite loop with UNION ALL, but not with UNION
53 WITH RECURSIVE t(n) AS (
54     SELECT 1
55 UNION
56     SELECT 10-n FROM t)
57 SELECT * FROM t;
58  n 
59 ---
60  1
61  9
62 (2 rows)
63
64 -- This'd be an infinite loop, but outside query reads only as much as needed
65 WITH RECURSIVE t(n) AS (
66     VALUES (1)
67 UNION ALL
68     SELECT n+1 FROM t)
69 SELECT * FROM t LIMIT 10;
70  n  
71 ----
72   1
73   2
74   3
75   4
76   5
77   6
78   7
79   8
80   9
81  10
82 (10 rows)
83
84 -- UNION case should have same property
85 WITH RECURSIVE t(n) AS (
86     SELECT 1
87 UNION
88     SELECT n+1 FROM t)
89 SELECT * FROM t LIMIT 10;
90  n  
91 ----
92   1
93   2
94   3
95   4
96   5
97   6
98   7
99   8
100   9
101  10
102 (10 rows)
103
104 -- Test behavior with an unknown-type literal in the WITH
105 WITH q AS (SELECT 'foo' AS x)
106 SELECT x, x IS OF (unknown) as is_unknown FROM q;
107   x  | is_unknown 
108 -----+------------
109  foo | t
110 (1 row)
111
112 WITH RECURSIVE t(n) AS (
113     SELECT 'foo'
114 UNION ALL
115     SELECT n || ' bar' FROM t WHERE length(n) < 20
116 )
117 SELECT n, n IS OF (text) as is_text FROM t;
118             n            | is_text 
119 -------------------------+---------
120  foo                     | t
121  foo bar                 | t
122  foo bar bar             | t
123  foo bar bar bar         | t
124  foo bar bar bar bar     | t
125  foo bar bar bar bar bar | t
126 (6 rows)
127
128 --
129 -- Some examples with a tree
130 --
131 -- department structure represented here is as follows:
132 --
133 -- ROOT-+->A-+->B-+->C
134 --      |         |
135 --      |         +->D-+->F
136 --      +->E-+->G
137 CREATE TEMP TABLE department (
138         id INTEGER PRIMARY KEY,  -- department ID
139         parent_department INTEGER REFERENCES department, -- upper department ID
140         name TEXT -- department name
141 );
142 NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "department_pkey" for table "department"
143 INSERT INTO department VALUES (0, NULL, 'ROOT');
144 INSERT INTO department VALUES (1, 0, 'A');
145 INSERT INTO department VALUES (2, 1, 'B');
146 INSERT INTO department VALUES (3, 2, 'C');
147 INSERT INTO department VALUES (4, 2, 'D');
148 INSERT INTO department VALUES (5, 0, 'E');
149 INSERT INTO department VALUES (6, 4, 'F');
150 INSERT INTO department VALUES (7, 5, 'G');
151 -- extract all departments under 'A'. Result should be A, B, C, D and F
152 WITH RECURSIVE subdepartment AS
153 (
154         -- non recursive term
155         SELECT name as root_name, * FROM department WHERE name = 'A'
156         UNION ALL
157         -- recursive term
158         SELECT sd.root_name, d.* FROM department AS d, subdepartment AS sd
159                 WHERE d.parent_department = sd.id
160 )
161 SELECT * FROM subdepartment ORDER BY name;
162  root_name | id | parent_department | name 
163 -----------+----+-------------------+------
164  A         |  1 |                 0 | A
165  A         |  2 |                 1 | B
166  A         |  3 |                 2 | C
167  A         |  4 |                 2 | D
168  A         |  6 |                 4 | F
169 (5 rows)
170
171 -- extract all departments under 'A' with "level" number
172 WITH RECURSIVE subdepartment(level, id, parent_department, name) AS
173 (
174         -- non recursive term
175         SELECT 1, * FROM department WHERE name = 'A'
176         UNION ALL
177         -- recursive term
178         SELECT sd.level + 1, d.* FROM department AS d, subdepartment AS sd
179                 WHERE d.parent_department = sd.id
180 )
181 SELECT * FROM subdepartment ORDER BY name;
182  level | id | parent_department | name 
183 -------+----+-------------------+------
184      1 |  1 |                 0 | A
185      2 |  2 |                 1 | B
186      3 |  3 |                 2 | C
187      3 |  4 |                 2 | D
188      4 |  6 |                 4 | F
189 (5 rows)
190
191 -- extract all departments under 'A' with "level" number.
192 -- Only shows level 2 or more
193 WITH RECURSIVE subdepartment(level, id, parent_department, name) AS
194 (
195         -- non recursive term
196         SELECT 1, * FROM department WHERE name = 'A'
197         UNION ALL
198         -- recursive term
199         SELECT sd.level + 1, d.* FROM department AS d, subdepartment AS sd
200                 WHERE d.parent_department = sd.id
201 )
202 SELECT * FROM subdepartment WHERE level >= 2 ORDER BY name;
203  level | id | parent_department | name 
204 -------+----+-------------------+------
205      2 |  2 |                 1 | B
206      3 |  3 |                 2 | C
207      3 |  4 |                 2 | D
208      4 |  6 |                 4 | F
209 (4 rows)
210
211 -- "RECURSIVE" is ignored if the query has no self-reference
212 WITH RECURSIVE subdepartment AS
213 (
214         -- note lack of recursive UNION structure
215         SELECT * FROM department WHERE name = 'A'
216 )
217 SELECT * FROM subdepartment ORDER BY name;
218  id | parent_department | name 
219 ----+-------------------+------
220   1 |                 0 | A
221 (1 row)
222
223 -- inside subqueries
224 SELECT count(*) FROM (
225     WITH RECURSIVE t(n) AS (
226         SELECT 1 UNION ALL SELECT n + 1 FROM t WHERE n < 500
227     )
228     SELECT * FROM t) AS t WHERE n < (
229         SELECT count(*) FROM (
230             WITH RECURSIVE t(n) AS (
231                    SELECT 1 UNION ALL SELECT n + 1 FROM t WHERE n < 100
232                 )
233             SELECT * FROM t WHERE n < 50000
234          ) AS t WHERE n < 100);
235  count 
236 -------
237     98
238 (1 row)
239
240 -- use same CTE twice at different subquery levels
241 WITH q1(x,y) AS (
242     SELECT hundred, sum(ten) FROM tenk1 GROUP BY hundred
243   )
244 SELECT count(*) FROM q1 WHERE y > (SELECT sum(y)/100 FROM q1 qsub);
245  count 
246 -------
247     50
248 (1 row)
249
250 -- via a VIEW
251 CREATE TEMPORARY VIEW vsubdepartment AS
252         WITH RECURSIVE subdepartment AS
253         (
254                  -- non recursive term
255                 SELECT * FROM department WHERE name = 'A'
256                 UNION ALL
257                 -- recursive term
258                 SELECT d.* FROM department AS d, subdepartment AS sd
259                         WHERE d.parent_department = sd.id
260         )
261         SELECT * FROM subdepartment;
262 SELECT * FROM vsubdepartment ORDER BY name;
263  id | parent_department | name 
264 ----+-------------------+------
265   1 |                 0 | A
266   2 |                 1 | B
267   3 |                 2 | C
268   4 |                 2 | D
269   6 |                 4 | F
270 (5 rows)
271
272 -- Check reverse listing
273 SELECT pg_get_viewdef('vsubdepartment'::regclass);
274                                                                                                                                                                                     pg_get_viewdef                                                                                                                                                                                     
275 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
276  WITH RECURSIVE subdepartment AS (SELECT department.id, department.parent_department, department.name FROM department WHERE (department.name = 'A'::text) UNION ALL SELECT d.id, d.parent_department, d.name FROM department d, subdepartment sd WHERE (d.parent_department = sd.id)) SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name FROM subdepartment;
277 (1 row)
278
279 SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
280                                     pg_get_viewdef                                    
281 --------------------------------------------------------------------------------------
282   WITH RECURSIVE subdepartment AS (
283                   SELECT department.id, department.parent_department, department.name
284                     FROM department
285                    WHERE department.name = 'A'::text
286          UNION ALL 
287                   SELECT d.id, d.parent_department, d.name
288                     FROM department d, subdepartment sd
289                    WHERE d.parent_department = sd.id
290          )
291   SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name
292     FROM subdepartment;
293 (1 row)
294
295 -- recursive term has sub-UNION
296 WITH RECURSIVE t(i,j) AS (
297         VALUES (1,2)
298         UNION ALL
299         SELECT t2.i, t.j+1 FROM
300                 (SELECT 2 AS i UNION ALL SELECT 3 AS i) AS t2
301                 JOIN t ON (t2.i = t.i+1))
302         SELECT * FROM t;
303  i | j 
304 ---+---
305  1 | 2
306  2 | 3
307  3 | 4
308 (3 rows)
309
310 --
311 -- different tree example
312 --
313 CREATE TEMPORARY TABLE tree(
314     id INTEGER PRIMARY KEY,
315     parent_id INTEGER REFERENCES tree(id)
316 );
317 NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "tree_pkey" for table "tree"
318 INSERT INTO tree
319 VALUES (1, NULL), (2, 1), (3,1), (4,2), (5,2), (6,2), (7,3), (8,3),
320        (9,4), (10,4), (11,7), (12,7), (13,7), (14, 9), (15,11), (16,11);
321 --
322 -- get all paths from "second level" nodes to leaf nodes
323 --
324 WITH RECURSIVE t(id, path) AS (
325     VALUES(1,ARRAY[]::integer[])
326 UNION ALL
327     SELECT tree.id, t.path || tree.id
328     FROM tree JOIN t ON (tree.parent_id = t.id)
329 )
330 SELECT t1.*, t2.* FROM t AS t1 JOIN t AS t2 ON
331         (t1.path[1] = t2.path[1] AND
332         array_upper(t1.path,1) = 1 AND
333         array_upper(t2.path,1) > 1)
334         ORDER BY t1.id, t2.id;
335  id | path | id |    path     
336 ----+------+----+-------------
337   2 | {2}  |  4 | {2,4}
338   2 | {2}  |  5 | {2,5}
339   2 | {2}  |  6 | {2,6}
340   2 | {2}  |  9 | {2,4,9}
341   2 | {2}  | 10 | {2,4,10}
342   2 | {2}  | 14 | {2,4,9,14}
343   3 | {3}  |  7 | {3,7}
344   3 | {3}  |  8 | {3,8}
345   3 | {3}  | 11 | {3,7,11}
346   3 | {3}  | 12 | {3,7,12}
347   3 | {3}  | 13 | {3,7,13}
348   3 | {3}  | 15 | {3,7,11,15}
349   3 | {3}  | 16 | {3,7,11,16}
350 (13 rows)
351
352 -- just count 'em
353 WITH RECURSIVE t(id, path) AS (
354     VALUES(1,ARRAY[]::integer[])
355 UNION ALL
356     SELECT tree.id, t.path || tree.id
357     FROM tree JOIN t ON (tree.parent_id = t.id)
358 )
359 SELECT t1.id, count(t2.*) FROM t AS t1 JOIN t AS t2 ON
360         (t1.path[1] = t2.path[1] AND
361         array_upper(t1.path,1) = 1 AND
362         array_upper(t2.path,1) > 1)
363         GROUP BY t1.id
364         ORDER BY t1.id;
365  id | count 
366 ----+-------
367   2 |     6
368   3 |     7
369 (2 rows)
370
371 --
372 -- test multiple WITH queries
373 --
374 WITH RECURSIVE
375   y (id) AS (VALUES (1)),
376   x (id) AS (SELECT * FROM y UNION ALL SELECT id+1 FROM x WHERE id < 5)
377 SELECT * FROM x;
378  id 
379 ----
380   1
381   2
382   3
383   4
384   5
385 (5 rows)
386
387 -- forward reference OK
388 WITH RECURSIVE
389     x(id) AS (SELECT * FROM y UNION ALL SELECT id+1 FROM x WHERE id < 5),
390     y(id) AS (values (1))
391  SELECT * FROM x;
392  id 
393 ----
394   1
395   2
396   3
397   4
398   5
399 (5 rows)
400
401 WITH RECURSIVE
402    x(id) AS
403      (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 5),
404    y(id) AS
405      (VALUES (1) UNION ALL SELECT id+1 FROM y WHERE id < 10)
406  SELECT y.*, x.* FROM y LEFT JOIN x USING (id);
407  id | id 
408 ----+----
409   1 |  1
410   2 |  2
411   3 |  3
412   4 |  4
413   5 |  5
414   6 |   
415   7 |   
416   8 |   
417   9 |   
418  10 |   
419 (10 rows)
420
421 WITH RECURSIVE
422    x(id) AS
423      (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 5),
424    y(id) AS
425      (VALUES (1) UNION ALL SELECT id+1 FROM x WHERE id < 10)
426  SELECT y.*, x.* FROM y LEFT JOIN x USING (id);
427  id | id 
428 ----+----
429   1 |  1
430   2 |  2
431   3 |  3
432   4 |  4
433   5 |  5
434   6 |   
435 (6 rows)
436
437 WITH RECURSIVE
438    x(id) AS
439      (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 3 ),
440    y(id) AS
441      (SELECT * FROM x UNION ALL SELECT * FROM x),
442    z(id) AS
443      (SELECT * FROM x UNION ALL SELECT id+1 FROM z WHERE id < 10)
444  SELECT * FROM z;
445  id 
446 ----
447   1
448   2
449   3
450   2
451   3
452   4
453   3
454   4
455   5
456   4
457   5
458   6
459   5
460   6
461   7
462   6
463   7
464   8
465   7
466   8
467   9
468   8
469   9
470  10
471   9
472  10
473  10
474 (27 rows)
475
476 WITH RECURSIVE
477    x(id) AS
478      (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 3 ),
479    y(id) AS
480      (SELECT * FROM x UNION ALL SELECT * FROM x),
481    z(id) AS
482      (SELECT * FROM y UNION ALL SELECT id+1 FROM z WHERE id < 10)
483  SELECT * FROM z;
484  id 
485 ----
486   1
487   2
488   3
489   1
490   2
491   3
492   2
493   3
494   4
495   2
496   3
497   4
498   3
499   4
500   5
501   3
502   4
503   5
504   4
505   5
506   6
507   4
508   5
509   6
510   5
511   6
512   7
513   5
514   6
515   7
516   6
517   7
518   8
519   6
520   7
521   8
522   7
523   8
524   9
525   7
526   8
527   9
528   8
529   9
530  10
531   8
532   9
533  10
534   9
535  10
536   9
537  10
538  10
539  10
540 (54 rows)
541
542 --
543 -- error cases
544 --
545 -- INTERSECT
546 WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT SELECT n+1 FROM x)
547         SELECT * FROM x;
548 ERROR:  recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term
549 LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT SELECT n+1 FROM x...
550                        ^
551 WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT ALL SELECT n+1 FROM x)
552         SELECT * FROM x;
553 ERROR:  recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term
554 LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 INTERSECT ALL SELECT n+1 FR...
555                        ^
556 -- EXCEPT
557 WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT SELECT n+1 FROM x)
558         SELECT * FROM x;
559 ERROR:  recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term
560 LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT SELECT n+1 FROM x)
561                        ^
562 WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT ALL SELECT n+1 FROM x)
563         SELECT * FROM x;
564 ERROR:  recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term
565 LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 EXCEPT ALL SELECT n+1 FROM ...
566                        ^
567 -- no non-recursive term
568 WITH RECURSIVE x(n) AS (SELECT n FROM x)
569         SELECT * FROM x;
570 ERROR:  recursive query "x" does not have the form non-recursive-term UNION [ALL] recursive-term
571 LINE 1: WITH RECURSIVE x(n) AS (SELECT n FROM x)
572                        ^
573 -- recursive term in the left hand side (strictly speaking, should allow this)
574 WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1)
575         SELECT * FROM x;
576 ERROR:  recursive reference to query "x" must not appear within its non-recursive term
577 LINE 1: WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1)
578                                               ^
579 CREATE TEMPORARY TABLE y (a INTEGER);
580 INSERT INTO y SELECT generate_series(1, 10);
581 -- LEFT JOIN
582 WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1
583         UNION ALL
584         SELECT x.n+1 FROM y LEFT JOIN x ON x.n = y.a WHERE n < 10)
585 SELECT * FROM x;
586 ERROR:  recursive reference to query "x" must not appear within an outer join
587 LINE 3:  SELECT x.n+1 FROM y LEFT JOIN x ON x.n = y.a WHERE n < 10)
588                                        ^
589 -- RIGHT JOIN
590 WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1
591         UNION ALL
592         SELECT x.n+1 FROM x RIGHT JOIN y ON x.n = y.a WHERE n < 10)
593 SELECT * FROM x;
594 ERROR:  recursive reference to query "x" must not appear within an outer join
595 LINE 3:  SELECT x.n+1 FROM x RIGHT JOIN y ON x.n = y.a WHERE n < 10)
596                            ^
597 -- FULL JOIN
598 WITH RECURSIVE x(n) AS (SELECT a FROM y WHERE a = 1
599         UNION ALL
600         SELECT x.n+1 FROM x FULL JOIN y ON x.n = y.a WHERE n < 10)
601 SELECT * FROM x;
602 ERROR:  recursive reference to query "x" must not appear within an outer join
603 LINE 3:  SELECT x.n+1 FROM x FULL JOIN y ON x.n = y.a WHERE n < 10)
604                            ^
605 -- subquery
606 WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x
607                           WHERE n IN (SELECT * FROM x))
608   SELECT * FROM x;
609 ERROR:  recursive reference to query "x" must not appear within a subquery
610 LINE 2:                           WHERE n IN (SELECT * FROM x))
611                                                             ^
612 -- aggregate functions
613 WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT count(*) FROM x)
614   SELECT * FROM x;
615 ERROR:  aggregates not allowed in a recursive query's recursive term
616 LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT count(*) F...
617                                                           ^
618 WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT sum(n) FROM x)
619   SELECT * FROM x;
620 ERROR:  aggregates not allowed in a recursive query's recursive term
621 LINE 1: WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT sum(n) FRO...
622                                                           ^
623 -- ORDER BY
624 WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x ORDER BY 1)
625   SELECT * FROM x;
626 ERROR:  ORDER BY in a recursive query is not implemented
627 LINE 1: ...VE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x ORDER BY 1)
628                                                                      ^
629 -- LIMIT/OFFSET
630 WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x LIMIT 10 OFFSET 1)
631   SELECT * FROM x;
632 ERROR:  OFFSET in a recursive query is not implemented
633 LINE 1: ... AS (SELECT 1 UNION ALL SELECT n+1 FROM x LIMIT 10 OFFSET 1)
634                                                                      ^
635 -- FOR UPDATE
636 WITH RECURSIVE x(n) AS (SELECT 1 UNION ALL SELECT n+1 FROM x FOR UPDATE)
637   SELECT * FROM x;
638 ERROR:  FOR UPDATE/SHARE in a recursive query is not implemented
639 -- target list has a recursive query name
640 WITH RECURSIVE x(id) AS (values (1)
641     UNION ALL
642     SELECT (SELECT * FROM x) FROM x WHERE id < 5
643 ) SELECT * FROM x;
644 ERROR:  recursive reference to query "x" must not appear within a subquery
645 LINE 3:     SELECT (SELECT * FROM x) FROM x WHERE id < 5
646                                   ^
647 -- mutual recursive query (not implemented)
648 WITH RECURSIVE
649   x (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM y WHERE id < 5),
650   y (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM x WHERE id < 5)
651 SELECT * FROM x;
652 ERROR:  mutual recursion between WITH items is not implemented
653 LINE 2:   x (id) AS (SELECT 1 UNION ALL SELECT id+1 FROM y WHERE id ...
654           ^
655 -- non-linear recursion is not allowed
656 WITH RECURSIVE foo(i) AS
657     (values (1)
658     UNION ALL
659        (SELECT i+1 FROM foo WHERE i < 10
660           UNION ALL
661        SELECT i+1 FROM foo WHERE i < 5)
662 ) SELECT * FROM foo;
663 ERROR:  recursive reference to query "foo" must not appear more than once
664 LINE 6:        SELECT i+1 FROM foo WHERE i < 5)
665                                ^
666 WITH RECURSIVE foo(i) AS
667     (values (1)
668     UNION ALL
669            SELECT * FROM
670        (SELECT i+1 FROM foo WHERE i < 10
671           UNION ALL
672        SELECT i+1 FROM foo WHERE i < 5) AS t
673 ) SELECT * FROM foo;
674 ERROR:  recursive reference to query "foo" must not appear more than once
675 LINE 7:        SELECT i+1 FROM foo WHERE i < 5) AS t
676                                ^
677 WITH RECURSIVE foo(i) AS
678     (values (1)
679     UNION ALL
680        (SELECT i+1 FROM foo WHERE i < 10
681           EXCEPT
682        SELECT i+1 FROM foo WHERE i < 5)
683 ) SELECT * FROM foo;
684 ERROR:  recursive reference to query "foo" must not appear within EXCEPT
685 LINE 6:        SELECT i+1 FROM foo WHERE i < 5)
686                                ^
687 WITH RECURSIVE foo(i) AS
688     (values (1)
689     UNION ALL
690        (SELECT i+1 FROM foo WHERE i < 10
691           INTERSECT
692        SELECT i+1 FROM foo WHERE i < 5)
693 ) SELECT * FROM foo;
694 ERROR:  recursive reference to query "foo" must not appear more than once
695 LINE 6:        SELECT i+1 FROM foo WHERE i < 5)
696                                ^
697 -- Wrong type induced from non-recursive term
698 WITH RECURSIVE foo(i) AS
699    (SELECT i FROM (VALUES(1),(2)) t(i)
700    UNION ALL
701    SELECT (i+1)::numeric(10,0) FROM foo WHERE i < 10)
702 SELECT * FROM foo;
703 ERROR:  recursive query "foo" column 1 has type integer in non-recursive term but type numeric overall
704 LINE 2:    (SELECT i FROM (VALUES(1),(2)) t(i)
705                    ^
706 HINT:  Cast the output of the non-recursive term to the correct type.
707 -- rejects different typmod, too (should we allow this?)
708 WITH RECURSIVE foo(i) AS
709    (SELECT i::numeric(3,0) FROM (VALUES(1),(2)) t(i)
710    UNION ALL
711    SELECT (i+1)::numeric(10,0) FROM foo WHERE i < 10)
712 SELECT * FROM foo;
713 ERROR:  recursive query "foo" column 1 has type numeric(3,0) in non-recursive term but type numeric overall
714 LINE 2:    (SELECT i::numeric(3,0) FROM (VALUES(1),(2)) t(i)
715                    ^
716 HINT:  Cast the output of the non-recursive term to the correct type.