with_mutually_recursive.slt 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. mode cockroach
  10. ## Test correct (intended) behavior:
  11. ## Test a plausibly correct recursive query.
  12. query I
  13. WITH MUTUALLY RECURSIVE
  14. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT a, 7 FROM bar),
  15. bar (a int) as (SELECT a FROM foo)
  16. SELECT * FROM bar;
  17. ----
  18. 1
  19. 1
  20. ## Test a straightforward recursive query.
  21. ## This could not terminate if we fail to consolidate iterates.
  22. query I
  23. WITH MUTUALLY RECURSIVE
  24. t (n int) AS (
  25. VALUES (1)
  26. UNION ALL
  27. SELECT n+1 FROM t WHERE n < 100
  28. )
  29. SELECT sum(n) FROM t;
  30. ----
  31. 5050
  32. ## Same as above, but with a non-erroring RECURSION LIMIT
  33. query I
  34. WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 100)
  35. t (n int) AS (
  36. VALUES (1)
  37. UNION ALL
  38. SELECT n+1 FROM t
  39. )
  40. SELECT sum(n) FROM t;
  41. ----
  42. 5050
  43. ## Test a straightforward mutually recursive query.
  44. query I
  45. WITH MUTUALLY RECURSIVE
  46. evens(n int) AS (
  47. VALUES (1)
  48. UNION ALL
  49. SELECT n+1 FROM odds WHERE n < 100
  50. ),
  51. odds (n int) AS (
  52. VALUES (0)
  53. UNION ALL
  54. SELECT n+1 FROM evens
  55. ),
  56. both (n int) AS (
  57. SELECT * FROM evens
  58. UNION ALL
  59. SELECT * FROM odds
  60. )
  61. SELECT sum(n) FROM both;
  62. ----
  63. 10100
  64. ## Test a potentially surprising recursive query.
  65. ## The analogue of this query in postgres produces only powers of two.
  66. query I
  67. WITH MUTUALLY RECURSIVE
  68. numbers (n int) as (
  69. VALUES (1)
  70. UNION ALL
  71. (
  72. WITH rebound AS (SELECT * FROM numbers)
  73. SELECT distinct t1.n + t2.n AS n
  74. FROM rebound AS t1, rebound AS t2
  75. WHERE t1.n <= 256 AND t2.n <= 256
  76. )
  77. )
  78. SELECT count(*) FROM numbers;
  79. ----
  80. 512
  81. ## Test a correlated recursive subquery.
  82. query II
  83. SELECT bound, (
  84. WITH MUTUALLY RECURSIVE
  85. numbers (n int) as (
  86. VALUES (1)
  87. UNION ALL
  88. (
  89. WITH rebound AS (SELECT * FROM numbers)
  90. SELECT distinct t1.n + t2.n AS n
  91. FROM rebound AS t1, rebound AS t2
  92. WHERE t1.n <= bound AND t2.n <= bound
  93. )
  94. )
  95. SELECT count(*) FROM numbers
  96. )
  97. FROM (
  98. SELECT generate_series AS bound FROM generate_series(1, 10)
  99. );
  100. ----
  101. 1 2
  102. 2 4
  103. 3 6
  104. 4 8
  105. 5 10
  106. 6 12
  107. 7 14
  108. 8 16
  109. 9 18
  110. 10 20
  111. ## Test recursive name resolution in SELECT subquery
  112. query III
  113. WITH MUTUALLY RECURSIVE
  114. foo (a int, b int) AS (SELECT (
  115. SELECT MIN(c) FROM bar
  116. ), 2 UNION SELECT 5, 5 FROM bar),
  117. bar (c int) as (SELECT a FROM foo)
  118. SELECT * FROM foo, bar;
  119. ----
  120. 5 2 5
  121. 5 2 5
  122. 5 5 5
  123. 5 5 5
  124. ## Test recursive name resolution in FROM clause
  125. query III
  126. WITH MUTUALLY RECURSIVE
  127. foo (a int, b int) AS (
  128. SELECT 1, 2 UNION
  129. SELECT * FROM (
  130. SELECT MIN(c), 2 FROM bar
  131. )
  132. ),
  133. bar (c int) as (SELECT a FROM foo)
  134. SELECT * FROM foo, bar;
  135. ----
  136. 1 2 1
  137. ## Test recursive name resolution in FROM clause
  138. query I
  139. WITH MUTUALLY RECURSIVE
  140. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT a, 7 FROM bar),
  141. bar (a int) as (SELECT a FROM foo)
  142. SELECT (SELECT COUNT(*) FROM foo) FROM bar;
  143. ----
  144. 2
  145. 2
  146. ## Test error cases
  147. ## Test a recursive query with mismatched types.
  148. statement error db error: ERROR: WITH MUTUALLY RECURSIVE query "bar" declared types \(integer\), but query returns types \(text\)
  149. WITH MUTUALLY RECURSIVE
  150. foo (a text, b int) AS (SELECT 1, 2 UNION SELECT a, 7 FROM bar),
  151. bar (a int) as (SELECT a FROM foo)
  152. SELECT * FROM bar;
  153. ## Test with fewer columns than declared
  154. statement error db error: ERROR: WITH MUTUALLY RECURSIVE query "foo" declared types \(integer, integer\), but query returns types \(integer\)
  155. WITH MUTUALLY RECURSIVE
  156. foo (a int, b int) AS (SELECT 1 UNION SELECT a FROM bar),
  157. bar (a int) as (SELECT a FROM foo)
  158. SELECT a FROM foo, bar;
  159. ## Test with more columns than declared
  160. statement error db error: ERROR: WITH MUTUALLY RECURSIVE query "foo" declared types \(integer, integer\), but query returns types \(integer, integer, integer\)
  161. WITH MUTUALLY RECURSIVE
  162. foo (a int, b int) AS (SELECT 1, 2, 3 UNION SELECT a, 5, 6 FROM bar),
  163. bar (a int) as (SELECT a FROM foo)
  164. SELECT a FROM foo, bar;
  165. ## Test ambiguity of resulting columns.
  166. statement error column reference "a" is ambiguous
  167. WITH MUTUALLY RECURSIVE
  168. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT a, 5 FROM bar),
  169. bar (a int) as (SELECT a FROM foo)
  170. SELECT a FROM foo, bar;
  171. ## Test column resolution in planning.
  172. statement error column "a" does not exist
  173. WITH MUTUALLY RECURSIVE
  174. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT a, 5 FROM bar),
  175. bar (c int) as (SELECT c FROM foo)
  176. SELECT * FROM foo, bar;
  177. ## Test column resolution in planning.
  178. statement error column "c" does not exist
  179. WITH MUTUALLY RECURSIVE
  180. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT 5, 5 FROM bar),
  181. bar (c int) as (SELECT c FROM foo)
  182. SELECT * FROM foo, bar;
  183. ## Test nested mutual recursion.
  184. statement error column reference "a" is ambiguous
  185. WITH MUTUALLY RECURSIVE
  186. foo (a int, b int) AS (
  187. WITH MUTUALLY RECURSIVE
  188. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT c, 5 FROM bar),
  189. bar (c int) as (SELECT a FROM foo)
  190. SELECT a, c FROM foo, bar
  191. ),
  192. bar (a int) as (SELECT a FROM foo)
  193. SELECT a FROM foo, bar;
  194. # Tests for nested WITH MUTUALLY RECURSIVE
  195. statement ok
  196. CREATE TABLE edges (src int, dst int);
  197. statement ok
  198. INSERT INTO edges SELECT x, x + 1 FROM generate_series(0, 9) as x;
  199. statement ok
  200. INSERT INTO edges VALUES (4, 2), (8, 6);
  201. statement ok
  202. CREATE VIEW strongly_connected_components AS
  203. WITH MUTUALLY RECURSIVE
  204. intra_edges (src int, dst int) as (
  205. SELECT * FROM edges
  206. EXCEPT ALL
  207. SELECT * FROM edges_delayed
  208. UNION ALL
  209. SELECT src, dst
  210. FROM
  211. edges,
  212. forward_labels f_src,
  213. forward_labels f_dst,
  214. reverse_labels r_src,
  215. reverse_labels r_dst
  216. WHERE src = f_src.node
  217. AND src = r_src.node
  218. AND dst = f_dst.node
  219. AND dst = r_dst.node
  220. AND f_src.label = f_dst.label
  221. AND r_src.label = r_dst.label
  222. ),
  223. forward_labels (node int, label int) AS (
  224. WITH MUTUALLY RECURSIVE
  225. label (node int, comp int) AS (
  226. SELECT dst, MIN(comp)
  227. FROM (
  228. SELECT dst, dst AS comp FROM edges
  229. UNION ALL
  230. SELECT intra_edges.dst, label.comp
  231. FROM intra_edges, label
  232. WHERE intra_edges.src = label.node
  233. )
  234. GROUP BY dst
  235. )
  236. SELECT * FROM label
  237. ),
  238. reverse_labels (node int, label int) AS (
  239. WITH MUTUALLY RECURSIVE
  240. label (node int, comp int) AS (
  241. SELECT src, MIN(comp)
  242. FROM (
  243. SELECT src, src AS comp FROM edges
  244. UNION ALL
  245. SELECT intra_edges.src, label.comp
  246. FROM intra_edges, label
  247. WHERE intra_edges.dst = label.node
  248. )
  249. GROUP BY src
  250. )
  251. SELECT * FROM label
  252. ),
  253. edges_delayed (src int, dst int) AS (SELECT * FROM edges)
  254. SELECT * FROM forward_labels UNION SELECT * FROM reverse_labels;
  255. query II
  256. SELECT size, COUNT(*) FROM (
  257. SELECT label, COUNT(*) as size
  258. FROM strongly_connected_components
  259. GROUP BY label
  260. )
  261. GROUP BY size;
  262. ----
  263. 1 5
  264. 3 2
  265. query II
  266. SELECT label, COUNT(*) as size
  267. FROM strongly_connected_components
  268. GROUP BY label
  269. ----
  270. 0 1
  271. 1 1
  272. 2 3
  273. 5 1
  274. 6 3
  275. 9 1
  276. 10 1
  277. ## Tests for sequenced WITH MUTUALLY RECURSIVE
  278. ## We should not see any rounds greater than zero, because the fixed point
  279. ## should have been reached in the first WITH MUTUALLY RECURSIVE.
  280. query II
  281. WITH MUTUALLY RECURSIVE
  282. label (node int, comp int) AS (
  283. SELECT dst, MIN(comp)
  284. FROM (
  285. SELECT dst, dst AS comp FROM edges
  286. UNION ALL
  287. SELECT edges.dst, label.comp
  288. FROM edges, label
  289. WHERE edges.src = label.node
  290. )
  291. GROUP BY dst
  292. )
  293. SELECT round, COUNT(*) FROM (
  294. WITH MUTUALLY RECURSIVE
  295. relabel (node int, comp int, round int) AS (
  296. SELECT DISTINCT ON(node) node, comp, round
  297. FROM (
  298. SELECT node, comp, 0 as round FROM label
  299. UNION ALL
  300. SELECT edges.dst, relabel.comp, relabel.round + 1
  301. FROM edges, relabel
  302. WHERE edges.src = relabel.node
  303. )
  304. ORDER BY node, comp
  305. )
  306. SELECT round FROM relabel
  307. )
  308. GROUP BY round;
  309. ----
  310. 0 10
  311. ## Regression test for https://github.com/MaterializeInc/database-issues/issues/5550
  312. ## Test a WMR query with a delta join.
  313. query III
  314. WITH MUTUALLY RECURSIVE
  315. c1 (f1 INTEGER, f2 INTEGER, f3 INTEGER) AS (
  316. SELECT * FROM (VALUES (0, 0, 0))
  317. UNION ALL (
  318. SELECT
  319. a1.f1 + 1 AS f1,
  320. a1.f2 + 1 AS f2,
  321. a1.f3 + 1 AS f3
  322. FROM
  323. c1 AS a1,
  324. (
  325. SELECT *
  326. FROM c1 AS a1
  327. LEFT JOIN c1 AS a2 USING (f2)
  328. WHERE a1.f1 < 100 AND a2.f2 IS NULL
  329. ) AS a2
  330. WHERE a1 . f1 < 100
  331. )
  332. )
  333. SELECT * FROM c1;
  334. ----
  335. 0 0 0
  336. ## Regression test for https://github.com/MaterializeInc/database-issues/issues/5606
  337. ## Test the situation when a WMR cte has an inner WMR whose body ends with an arrangement.
  338. query I
  339. WITH MUTUALLY RECURSIVE
  340. cnt (i int) AS (
  341. (WITH MUTUALLY RECURSIVE
  342. cnt (i int) AS (
  343. SELECT 1 AS i
  344. UNION
  345. SELECT i+1 FROM cnt WHERE i < 3)
  346. SELECT i FROM cnt
  347. )
  348. UNION
  349. SELECT i+100 FROM cnt WHERE i < 500)
  350. SELECT i FROM cnt
  351. ORDER BY i;
  352. ----
  353. 1
  354. 2
  355. 3
  356. 101
  357. 102
  358. 103
  359. 201
  360. 202
  361. 203
  362. 301
  363. 302
  364. 303
  365. 401
  366. 402
  367. 403
  368. 501
  369. 502
  370. 503
  371. ## Tests for RECURSION LIMIT
  372. ## (See plans in `normalize_lets.slt`)
  373. query I rowsort
  374. WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 3)
  375. cnt (i int) AS (
  376. SELECT 1 AS i
  377. UNION
  378. SELECT i+1 FROM cnt)
  379. SELECT * FROM cnt;
  380. ----
  381. 1
  382. 2
  383. 3
  384. query I rowsort
  385. WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT = 3)
  386. cnt (i int) AS (
  387. SELECT 1 AS i
  388. UNION
  389. SELECT i+1 FROM cnt)
  390. SELECT * FROM cnt;
  391. ----
  392. 1
  393. 2
  394. 3
  395. query error db error: ERROR: Evaluation error: Recursive query exceeded the recursion limit 3\. \(Use RETURN AT RECURSION LIMIT to not error, but return the current state as the final result when reaching the limit\.\)
  396. WITH MUTUALLY RECURSIVE (ERROR AT RECURSION LIMIT 3)
  397. cnt (i int) AS (
  398. SELECT 1 AS i
  399. UNION
  400. SELECT i+1 FROM cnt)
  401. SELECT * FROM cnt;
  402. query II
  403. (WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 3)
  404. cnt (i int) AS (
  405. SELECT 1 AS i
  406. UNION
  407. SELECT i+1 FROM cnt)
  408. SELECT -10, i FROM cnt)
  409. UNION
  410. (WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 5)
  411. cnt (i int) AS (
  412. SELECT 1 AS i
  413. UNION
  414. SELECT i+1 FROM cnt)
  415. SELECT -20, i FROM cnt)
  416. ----
  417. -20 1
  418. -20 2
  419. -20 3
  420. -20 4
  421. -20 5
  422. -10 1
  423. -10 2
  424. -10 3
  425. query I
  426. WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 100)
  427. t0 (n int) AS (
  428. VALUES (1)
  429. UNION ALL
  430. SELECT n+1 FROM t0
  431. ),
  432. t1 (n int) AS (
  433. VALUES (-1)
  434. UNION ALL
  435. SELECT n+1 FROM t1
  436. )
  437. SELECT (SELECT sum(n) FROM t0) - (SELECT sum(n) FROM t1);
  438. ----
  439. 200
  440. query I
  441. WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 6)
  442. cnt (i int) AS (
  443. (WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 3)
  444. cnt (i int) AS (
  445. SELECT 1 AS i
  446. UNION
  447. SELECT i+1 FROM cnt)
  448. SELECT i FROM cnt
  449. )
  450. UNION
  451. SELECT i+100 FROM cnt)
  452. SELECT i FROM cnt
  453. ORDER BY i;
  454. ----
  455. 1
  456. 2
  457. 3
  458. 101
  459. 102
  460. 103
  461. 201
  462. 202
  463. 203
  464. 301
  465. 302
  466. 303
  467. 401
  468. 402
  469. 403
  470. 501
  471. 502
  472. 503
  473. query error db error: ERROR: Evaluation error: Recursive query exceeded the recursion limit 100\. \(Use RETURN AT RECURSION LIMIT to not error, but return the current state as the final result when reaching the limit\.\)
  474. (WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 10)
  475. t (n int) AS (
  476. VALUES (1)
  477. UNION ALL
  478. SELECT n+1 FROM t
  479. )
  480. SELECT sum(n) FROM t)
  481. UNION ALL
  482. (WITH MUTUALLY RECURSIVE (ERROR AT RECURSION LIMIT 100)
  483. t (n int) AS (
  484. VALUES (1)
  485. UNION ALL
  486. SELECT n+1 FROM t
  487. )
  488. SELECT sum(n) FROM t);
  489. statement ok
  490. CREATE TABLE t1 (f1 INTEGER);
  491. statement ok
  492. CREATE MATERIALIZED VIEW v1 AS
  493. WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT 2)
  494. cnt (f1 INTEGER) AS (
  495. SELECT f1 FROM t1 UNION ALL SELECT f1+1 AS f1 FROM cnt
  496. )
  497. SELECT * FROM cnt;
  498. statement ok
  499. INSERT INTO t1 VALUES (1);
  500. query I
  501. SELECT * FROM v1;
  502. ----
  503. 1
  504. 2
  505. statement ok
  506. UPDATE t1 SET f1 = 2;
  507. query I
  508. SELECT * FROM v1;
  509. ----
  510. 2
  511. 3
  512. statement error db error: ERROR: invalid RECURSION LIMIT: must provide an unsigned integer value
  513. WITH MUTUALLY RECURSIVE (RECURSION LIMIT)
  514. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  515. SELECT * FROM cnt;
  516. statement error db error: ERROR: Expected one of RECURSION or RETURN or ERROR, found right parenthesis
  517. WITH MUTUALLY RECURSIVE ()
  518. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  519. SELECT * FROM cnt;
  520. statement error db error: ERROR: invalid RECURSION LIMIT: cannot use value as number
  521. WITH MUTUALLY RECURSIVE (RECURSION LIMIT aaaaaaa)
  522. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  523. SELECT * FROM cnt;
  524. statement error db error: ERROR: invalid RECURSION LIMIT: invalid unsigned numeric value: invalid digit found in string
  525. WITH MUTUALLY RECURSIVE (RECURSION LIMIT -3)
  526. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  527. SELECT * FROM cnt;
  528. statement error db error: ERROR: RECURSION LIMIT specified more than once
  529. WITH MUTUALLY RECURSIVE (RECURSION LIMIT 3, RECURSION LIMIT 5)
  530. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  531. SELECT * FROM cnt;
  532. statement error db error: ERROR: Invalid WITH MUTUALLY RECURSIVE recursion limit\. More than one recursion limit given\. Please give at most one of RECURSION LIMIT, ERROR AT RECURSION LIMIT, RETURN AT RECURSION LIMIT\.
  533. WITH MUTUALLY RECURSIVE (RECURSION LIMIT 3, ERROR AT RECURSION LIMIT 5)
  534. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  535. SELECT * FROM cnt;
  536. statement error db error: ERROR: Invalid WITH MUTUALLY RECURSIVE recursion limit\. More than one recursion limit given\. Please give at most one of RECURSION LIMIT, ERROR AT RECURSION LIMIT, RETURN AT RECURSION LIMIT\.
  537. WITH MUTUALLY RECURSIVE (RECURSION LIMIT 3, RETURN AT RECURSION LIMIT 5)
  538. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  539. SELECT * FROM cnt;
  540. statement error db error: ERROR: Invalid WITH MUTUALLY RECURSIVE recursion limit\. More than one recursion limit given\. Please give at most one of RECURSION LIMIT, ERROR AT RECURSION LIMIT, RETURN AT RECURSION LIMIT\.
  541. WITH MUTUALLY RECURSIVE (ERROR AT RECURSION LIMIT 3, RETURN AT RECURSION LIMIT 5)
  542. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  543. SELECT * FROM cnt;
  544. # It's important that we error out for RECURSION LIMIT 0, because we are NOT handling this case in some optimizer transforms.
  545. statement error db error: ERROR: Invalid WITH MUTUALLY RECURSIVE recursion limit\. Recursion limit has to be greater than 0\.
  546. WITH MUTUALLY RECURSIVE (RECURSION LIMIT 0)
  547. cnt (i int) AS (SELECT 1 AS i UNION SELECT i+1 FROM cnt)
  548. SELECT * FROM cnt;
  549. ## Check casting from derived to proposed types, see
  550. ## https://github.com/MaterializeInc/materialize/pull/23658
  551. statement ok
  552. CREATE TABLE y (a BIGINT);
  553. statement ok
  554. INSERT INTO y VALUES (1);
  555. query T
  556. WITH MUTUALLY RECURSIVE
  557. bar(x NUMERIC) as (SELECT sum(a) FROM y)
  558. SELECT x FROM bar
  559. ----
  560. 1
  561. query T
  562. WITH MUTUALLY RECURSIVE
  563. bar(x NUMERIC) as (SELECT sum(a) FROM y)
  564. SELECT pg_typeof(x) FROM bar
  565. ----
  566. numeric
  567. query T
  568. WITH MUTUALLY RECURSIVE
  569. bar(x NUMERIC) as (SELECT sum(a) + 1.23456 FROM y)
  570. SELECT x FROM bar
  571. ----
  572. 2.23456
  573. query T
  574. WITH MUTUALLY RECURSIVE
  575. bar(x NUMERIC(38,2)) as (SELECT sum(a) + 1.23456 FROM y)
  576. SELECT x FROM bar
  577. ----
  578. 2.23
  579. query T
  580. WITH MUTUALLY RECURSIVE
  581. bar(x UINT2) as (SELECT 1::INT8)
  582. SELECT x FROM bar
  583. ----
  584. 1
  585. query error "-1" uint2 out of range
  586. WITH MUTUALLY RECURSIVE
  587. bar(x UINT2) as (SELECT -1::INT8)
  588. SELECT x FROM bar
  589. # TODO: '1' should be coercible to an integer.
  590. query error db error: ERROR: WITH MUTUALLY RECURSIVE query "bar" declared types \(bigint\), but query returns types \(text\)
  591. WITH MUTUALLY RECURSIVE
  592. bar(x INT8) as (SELECT '1')
  593. SELECT x FROM bar
  594. statement ok
  595. CREATE TYPE list_numeric_scale_2 AS LIST (ELEMENT TYPE = NUMERIC(38,2));
  596. query T
  597. WITH MUTUALLY RECURSIVE
  598. bar(x list_numeric_scale_2) as (SELECT LIST[sum(a) + 1.2345] FROM y)
  599. SELECT x::TEXT FROM bar
  600. ----
  601. {2.23}
  602. query error db error: ERROR: WITH MUTUALLY RECURSIVE query "bar" declared types \(list_numeric_scale_2\), but query returns types \(text list\)
  603. WITH MUTUALLY RECURSIVE
  604. bar(x list_numeric_scale_2) as (SELECT LIST['1'::TEXT])
  605. SELECT x FROM bar
  606. ## Adapted from https://www.sqlite.org/lang_with.html#outlandish_recursive_query_examples
  607. query T multiline
  608. WITH MUTUALLY RECURSIVE
  609. xaxis(x double) AS (VALUES(-2.0) UNION ALL SELECT x+0.05 FROM xaxis WHERE x<1.2),
  610. yaxis(y double) AS (VALUES(-1.0) UNION ALL SELECT y+0.1 FROM yaxis WHERE y<1.0),
  611. m(iter int, cx double, cy double, x double, y double) AS (
  612. SELECT 0, x, y, 0.0, 0.0 FROM xaxis, yaxis
  613. UNION ALL
  614. SELECT iter+1, cx, cy, x*x-y*y + cx, 2.0*x*y + cy FROM m
  615. WHERE (x*x + y*y) < 4.0 AND iter<28
  616. ),
  617. m2(iter int, cx double, cy double) AS (
  618. SELECT max(iter), cx, cy FROM m GROUP BY cx, cy
  619. ),
  620. a(t text, cy double) AS (
  621. SELECT string_agg( substr(' .+*#', 1+least(iter/7,4), 1), '' ORDER BY cx), cy
  622. FROM m2 GROUP BY cy
  623. )
  624. SELECT string_agg(rtrim(t), chr(10) ORDER BY cy) FROM a;
  625. ----
  626. ....#
  627. ..#*..
  628. ..+####+.
  629. .......+####.... +
  630. ..##+*##########+.++++
  631. .+.##################+.
  632. .............+###################+.+
  633. ..++..#.....*#####################+.
  634. ...+#######++#######################.
  635. ....+*################################.
  636. #############################################...
  637. ....+*################################.
  638. ...+#######++#######################.
  639. ..++..#.....*#####################+.
  640. .............+###################+.+
  641. .+.##################+.
  642. ..##+*##########+.++++
  643. .......+####.... +
  644. ..+####+.
  645. ..#*..
  646. ....#
  647. +.
  648. EOF