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