raw_plan_as_text.slt 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833
  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. simple conn=mz_system,user=mz_system
  10. ALTER SYSTEM SET unsafe_enable_table_keys = true
  11. ----
  12. COMPLETE 0
  13. statement ok
  14. CREATE TABLE t (
  15. a int,
  16. b int
  17. )
  18. statement ok
  19. CREATE VIEW ov AS SELECT * FROM t ORDER BY b asc, a desc LIMIT 5
  20. statement ok
  21. CREATE VIEW v AS
  22. SELECT * FROM t WHERE a IS NOT NULL
  23. statement ok
  24. CREATE INDEX v_a_idx ON v(a)
  25. statement ok
  26. CREATE MATERIALIZED VIEW mv AS
  27. SELECT * FROM t WHERE a IS NOT NULL
  28. mode cockroach
  29. # EXPLAIN INDEX is not supported for raw plans
  30. statement error cannot EXPLAIN RAW PLAN FOR INDEX
  31. EXPLAIN RAW PLAN AS TEXT FOR
  32. INDEX v_a_idx
  33. # EXPLAIN CREATE INDEX is not supported for raw plans
  34. statement error cannot EXPLAIN RAW PLAN FOR CREATE INDEX
  35. EXPLAIN RAW PLAN AS TEXT FOR
  36. CREATE INDEX v_a_idx ON v(a)
  37. # Test basic linear chains.
  38. query T multiline
  39. EXPLAIN RAW PLAN AS TEXT FOR
  40. SELECT a + 1, b, 4 FROM mv WHERE a > 0
  41. ----
  42. Project (#2, #1, #3)
  43. Map ((#0{a} + 1), 4)
  44. Filter (#0{a} > 0)
  45. Get materialize.public.mv
  46. Target cluster: quickstart
  47. EOF
  48. # Test table functions (CallTable).
  49. query T multiline
  50. EXPLAIN RAW PLAN AS TEXT FOR
  51. SELECT * FROM generate_series(1, 7)
  52. ----
  53. CallTable generate_series(1, 7, 1)
  54. Target cluster: quickstart
  55. EOF
  56. # Test Threshold, Union, Distinct, Negate.
  57. query T multiline
  58. EXPLAIN RAW PLAN WITH (raw syntax) AS TEXT FOR
  59. SELECT a FROM t EXCEPT SELECT b FROM mv
  60. ----
  61. Threshold
  62. Union
  63. Distinct
  64. Project (#0)
  65. Get materialize.public.t
  66. Negate
  67. Distinct
  68. Project (#1)
  69. Get materialize.public.mv
  70. Target cluster: quickstart
  71. EOF
  72. # Test virtual syntax (EXCEPT).
  73. query T multiline
  74. EXPLAIN RAW PLAN AS TEXT FOR
  75. SELECT a FROM t EXCEPT SELECT b FROM mv
  76. ----
  77. Except
  78. Project (#0)
  79. Get materialize.public.t
  80. Project (#1)
  81. Get materialize.public.mv
  82. Target cluster: quickstart
  83. EOF
  84. # Test virtual syntax (EXCEPT ALL).
  85. query T multiline
  86. EXPLAIN RAW PLAN AS TEXT FOR
  87. SELECT a FROM t EXCEPT ALL SELECT b FROM mv
  88. ----
  89. ExceptAll
  90. Project (#0)
  91. Get materialize.public.t
  92. Project (#1)
  93. Get materialize.public.mv
  94. Target cluster: quickstart
  95. EOF
  96. # Test Finish.
  97. query T multiline
  98. EXPLAIN RAW PLAN AS TEXT FOR
  99. SELECT * FROM t ORDER BY b asc, a desc LIMIT 5
  100. ----
  101. Finish order_by=[#1 asc nulls_last, #0 desc nulls_first] limit=5 output=[#0, #1]
  102. Get materialize.public.t
  103. Target cluster: quickstart
  104. EOF
  105. # Test Reduce (global).
  106. query T multiline
  107. EXPLAIN RAW PLAN AS TEXT FOR
  108. SELECT abs(min(a) - max(a)) FROM t
  109. ----
  110. Project (#2)
  111. Map (abs((#0{?column?} - #1{?column?})))
  112. Reduce aggregates=[min(#0{a}), max(#0{a})]
  113. Get materialize.public.t
  114. Target cluster: quickstart
  115. EOF
  116. # Test Reduce (local).
  117. query T multiline
  118. EXPLAIN RAW PLAN AS TEXT FOR
  119. SELECT abs(min(a) - max(a)) FROM t GROUP BY b
  120. ----
  121. Project (#3)
  122. Map (abs((#1{?column?} - #2{?column?})))
  123. Reduce group_by=[#2] aggregates=[min(#0{a}), max(#0{a})]
  124. Map (#1{b})
  125. Get materialize.public.t
  126. Target cluster: quickstart
  127. EOF
  128. # Test EXISTS subqueries.
  129. query T multiline
  130. EXPLAIN RAW PLAN AS TEXT FOR
  131. SELECT * FROM t WHERE EXISTS(SELECT * FROM mv WHERE t.a < mv.a) AND EXISTS(SELECT * FROM mv WHERE t.b > mv.b)
  132. ----
  133. With
  134. cte [l2 as subquery-2] =
  135. Filter (#^1{b} > #1{b})
  136. Get materialize.public.mv
  137. cte [l1 as subquery-1] =
  138. Filter (#^0{a} < #0{a})
  139. Get materialize.public.mv
  140. Return
  141. Filter (exists(Get l1) AND exists(Get l2))
  142. Get materialize.public.t
  143. Target cluster: quickstart
  144. EOF
  145. # Test SELECT subqueries.
  146. query T multiline
  147. EXPLAIN RAW PLAN AS TEXT FOR
  148. SELECT (SELECT v.a FROM v WHERE v.b = t.b LIMIT 1), (SELECT mv.a FROM mv WHERE mv.b = t.b LIMIT 1) FROM t
  149. ----
  150. Project (#2, #3)
  151. With
  152. cte [l2 as subquery-2] =
  153. Project (#0)
  154. TopK limit=1
  155. Filter (#1{b} = #^1{b})
  156. Get materialize.public.mv
  157. cte [l1 as subquery-1] =
  158. Project (#0)
  159. TopK limit=1
  160. Filter (#1{b} = #^1{b})
  161. Get materialize.public.v
  162. Return
  163. Map (select(Get l1), select(Get l2))
  164. Get materialize.public.t
  165. Target cluster: quickstart
  166. EOF
  167. # Test CrossJoin derived from a comma join without a predicate.
  168. query T multiline
  169. EXPLAIN RAW PLAN AS TEXT FOR
  170. SELECT t1.a, t2.a FROM t as t1, t as t2
  171. ----
  172. Project (#0, #2)
  173. CrossJoin
  174. Get materialize.public.t
  175. Get materialize.public.t
  176. Target cluster: quickstart
  177. EOF
  178. # Test CrossJoin derived from an INNER JOIN with a trivial ON clause.
  179. query T multiline
  180. EXPLAIN RAW PLAN AS TEXT FOR
  181. SELECT t1.a, t2.a FROM t as t1 INNER JOIN t as t2 ON true
  182. ----
  183. Project (#0, #2)
  184. CrossJoin
  185. Get materialize.public.t
  186. Get materialize.public.t
  187. Target cluster: quickstart
  188. EOF
  189. # Test InnerJoin (comma syntax).
  190. query T multiline
  191. EXPLAIN RAW PLAN AS TEXT FOR
  192. SELECT t1.a, t2.a
  193. FROM
  194. t as t1,
  195. t as t2,
  196. t as t3
  197. WHERE t1.b = t2.b AND t2.b = t3.b
  198. ----
  199. Project (#0, #2)
  200. Filter ((#1{b} = #3{b}) AND (#3{b} = #5{b}))
  201. CrossJoin
  202. CrossJoin
  203. Get materialize.public.t
  204. Get materialize.public.t
  205. Get materialize.public.t
  206. Target cluster: quickstart
  207. EOF
  208. # Test InnerJoin (ON syntax).
  209. query T multiline
  210. EXPLAIN RAW PLAN AS TEXT FOR
  211. SELECT t1.a, t2.a
  212. FROM t as t1
  213. INNER JOIN t as t2 ON t1.b = t2.b
  214. INNER JOIN t as t3 ON t2.b = t3.b
  215. ----
  216. Project (#0, #2)
  217. InnerJoin (#3{b} = #5{b})
  218. InnerJoin (#1{b} = #3{b})
  219. Get materialize.public.t
  220. Get materialize.public.t
  221. Get materialize.public.t
  222. Target cluster: quickstart
  223. EOF
  224. # Test InnerJoin (ON syntax).
  225. query T multiline
  226. EXPLAIN RAW PLAN AS TEXT FOR
  227. SELECT t1.a, t2.a
  228. FROM t as t1
  229. LEFT JOIN t as t2 ON t1.b = t2.b
  230. RIGHT JOIN t as t3 ON t2.b = t3.b
  231. ----
  232. Project (#0, #2)
  233. RightOuterJoin (#3{b} = #5{b})
  234. LeftOuterJoin (#1{b} = #3{b})
  235. Get materialize.public.t
  236. Get materialize.public.t
  237. Get materialize.public.t
  238. Target cluster: quickstart
  239. EOF
  240. # Test a single CTE.
  241. query T multiline
  242. EXPLAIN RAW PLAN AS TEXT FOR
  243. WITH x AS (SELECT t.a * t.b as v from t) SELECT x.v + 5 FROM x
  244. ----
  245. Project (#1)
  246. With
  247. cte [l0 as x] =
  248. Project (#2)
  249. Map ((#0{a} * #1{b}))
  250. Get materialize.public.t
  251. Return
  252. Map ((#0{v} + 5))
  253. Get l0
  254. Target cluster: quickstart
  255. EOF
  256. # Test multiple CTEs: directly nested 'Let' variants are rendered in a flattened way.
  257. query T multiline
  258. EXPLAIN RAW PLAN AS TEXT FOR
  259. WITH A AS (SELECT 1 AS a), B as (SELECT a as b FROM A WHERE a > 0) SELECT * FROM A, B;
  260. ----
  261. With
  262. cte [l0 as a] =
  263. Map (1)
  264. Constant
  265. - ()
  266. cte [l1 as b] =
  267. Filter (#0{a} > 0)
  268. Get l0
  269. Return
  270. CrossJoin
  271. Get l0
  272. Get l1
  273. Target cluster: mz_catalog_server
  274. EOF
  275. # Test multiple CTEs: a case where we cannot pull the let statement up through
  276. # the join because the local l0 is correlated against the lhs of the enclosing join.
  277. query T multiline
  278. EXPLAIN RAW PLAN AS TEXT FOR
  279. SELECT
  280. *
  281. FROM
  282. (
  283. SELECT * FROM t
  284. ) as r1
  285. CROSS JOIN LATERAL (
  286. WITH r2 as (
  287. SELECT MAX(r1.a * t.a) AS m FROM t
  288. )
  289. SELECT * FROM r2 WHERE r2.m != r1.a
  290. ) as r3
  291. CROSS JOIN LATERAL (
  292. WITH r4 as (
  293. SELECT MAX(r1.a * t.a) AS m FROM t
  294. )
  295. SELECT * FROM r4 WHERE r4.m != r1.a OR (r4.m IS NOT NULL AND r1.a IS NULL)
  296. ) as r5;
  297. ----
  298. CrossJoin
  299. CrossJoin
  300. Get materialize.public.t
  301. With
  302. cte [l0 as r2] =
  303. Reduce aggregates=[max((#^0{a} * #0{a}))]
  304. Get materialize.public.t
  305. Return
  306. Filter (#0{m} != #^0{a})
  307. Get l0
  308. With
  309. cte [l0 as r4] =
  310. Reduce aggregates=[max((#^0{a} * #0{a}))]
  311. Get materialize.public.t
  312. Return
  313. Filter ((#0{m} != #^0{a}) OR ((#0{m}) IS NOT NULL AND (#^0{a}) IS NULL))
  314. Get l0
  315. Target cluster: quickstart
  316. EOF
  317. # Test multiple CTEs: a case where we cannot pull the let statement up
  318. # through the join because the local l0 is correlated against the lhs of
  319. # the enclosing join.
  320. query T multiline
  321. EXPLAIN RAW PLAN AS TEXT FOR
  322. SELECT
  323. *
  324. FROM
  325. (
  326. SELECT * FROM t
  327. ) as r1
  328. CROSS JOIN LATERAL (
  329. WITH r4 as (
  330. SELECT MAX(r1.a * t.a) AS m FROM t
  331. )
  332. SELECT *
  333. FROM
  334. r4
  335. CROSS JOIN LATERAL (
  336. WITH r2 as (
  337. SELECT MAX(r1.a * t.a) AS m FROM t
  338. )
  339. SELECT * FROM r2 WHERE r1.a = r4.m AND r2.m > 5
  340. ) as r3
  341. WHERE a != r1.a
  342. ) as r5;
  343. ----
  344. CrossJoin
  345. Get materialize.public.t
  346. With
  347. cte [l0 as r4] =
  348. Reduce aggregates=[max((#^0{a} * #0{a}))]
  349. Get materialize.public.t
  350. Return
  351. Filter (#^0{a} != #^0{a})
  352. CrossJoin
  353. Get l0
  354. With
  355. cte [l1 as r2] =
  356. Reduce aggregates=[max((#^^0{a} * #0{a}))]
  357. Get materialize.public.t
  358. Return
  359. Filter ((#^^0{a} = #^0{m}) AND (#0{m} > 5))
  360. Get l1
  361. Target cluster: quickstart
  362. EOF
  363. query T multiline
  364. EXPLAIN RAW PLAN AS TEXT FOR SELECT COUNT(*);
  365. ----
  366. Reduce aggregates=[count(*)]
  367. Constant
  368. - ()
  369. Target cluster: quickstart
  370. EOF
  371. # Test materialize#17348.
  372. statement ok
  373. CREATE TABLE r(f0 INT, f1 INT, f2 INT, f3 INT, f4 INT, f5 INT, f6 INT, f7 INT, f8 INT, f9 INT, f10 INT, f11 INT, f12 INT, f13 INT, f14 INT, f15 INT, f16 INT);
  374. query T multiline
  375. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT *
  376. FROM r AS r0, r AS r1
  377. WHERE
  378. r0.f0=r1.f0 AND
  379. r0.f2=r1.f2 AND
  380. r0.f3=r1.f3 AND
  381. r0.f4=r1.f4 AND
  382. r0.f6=r1.f6 AND
  383. r0.f8=r1.f8 AND
  384. r0.f9=r1.f9 AND
  385. r0.f11=r1.f11 AND
  386. r0.f12=r1.f12 AND
  387. r0.f13=r1.f13 AND
  388. r0.f15=r1.f15 AND
  389. r0.f16=r1.f16;
  390. ----
  391. Explained Query:
  392. With
  393. cte l0 =
  394. ArrangeBy keys=[[#0{f0}, #2{f2}..=#4{f4}, #6{f6}, #8{f8}, #9{f9}, #11{f11}..=#13{f13}, #15{f15}, #16{f16}]]
  395. Filter (#0{f0}) IS NOT NULL AND (#2{f2}) IS NOT NULL AND (#3{f3}) IS NOT NULL AND (#4{f4}) IS NOT NULL AND (#6{f6}) IS NOT NULL AND (#8{f8}) IS NOT NULL AND (#9{f9}) IS NOT NULL AND (#11{f11}) IS NOT NULL AND (#12{f12}) IS NOT NULL AND (#13{f13}) IS NOT NULL AND (#15{f15}) IS NOT NULL AND (#16{f16}) IS NOT NULL
  396. ReadStorage materialize.public.r
  397. Return
  398. Project (#0{f0}..=#16{f16}, #0{f0}, #18{f1}, #2{f2}..=#4{f4}, #22{f5}, #6{f6}, #24{f7}, #8{f8}, #9{f9}, #27{f10}, #11{f11}..=#13{f13}, #31{f14}, #15{f15}, #16{f16})
  399. Join on=(#0{f0} = #17{f0} AND #2{f2} = #19{f2} AND #3{f3} = #20{f3} AND #4{f4} = #21{f4} AND #6{f6} = #23{f6} AND #8{f8} = #25{f8} AND #9{f9} = #26{f9} AND #11{f11} = #28{f11} AND #12{f12} = #29{f12} AND #13{f13} = #30{f13} AND #15{f15} = #32{f15} AND #16{f16} = #33{f16}) type=differential
  400. Get l0
  401. Get l0
  402. Source materialize.public.r
  403. filter=((#0{f0}) IS NOT NULL AND (#2{f2}) IS NOT NULL AND (#3{f3}) IS NOT NULL AND (#4{f4}) IS NOT NULL AND (#6{f6}) IS NOT NULL AND (#8{f8}) IS NOT NULL AND (#9{f9}) IS NOT NULL AND (#11{f11}) IS NOT NULL AND (#12{f12}) IS NOT NULL AND (#13{f13}) IS NOT NULL AND (#15{f15}) IS NOT NULL AND (#16{f16}) IS NOT NULL)
  404. Target cluster: quickstart
  405. EOF
  406. query T multiline
  407. EXPLAIN RAW PLAN AS TEXT FOR
  408. SELECT lag(b, 3) OVER ()
  409. FROM t;
  410. ----
  411. Project (#2)
  412. Map (lag(row(#1{b}, 3, null)) over (order by []))
  413. Get materialize.public.t
  414. Target cluster: quickstart
  415. EOF
  416. query T multiline
  417. EXPLAIN RAW PLAN AS TEXT FOR
  418. SELECT lag(b, 333) RESPECT NULLS OVER ()
  419. FROM t;
  420. ----
  421. Project (#2)
  422. Map (lag(row(#1{b}, 333, null)) over (order by []))
  423. Get materialize.public.t
  424. Target cluster: quickstart
  425. EOF
  426. query T multiline
  427. EXPLAIN RAW PLAN AS TEXT FOR
  428. SELECT lag(b, 333) IGNORE NULLS OVER ()
  429. FROM t;
  430. ----
  431. Project (#2)
  432. Map (lag(row(#1{b}, 333, null)) ignore nulls over (order by []))
  433. Get materialize.public.t
  434. Target cluster: quickstart
  435. EOF
  436. query T multiline
  437. EXPLAIN RAW PLAN AS TEXT FOR
  438. SELECT row_number() OVER (ORDER BY r DESC)
  439. FROM (
  440. SELECT row_number() OVER (PARTITION BY l) as r
  441. FROM (
  442. SELECT lag(b, 3) OVER (PARTITION BY b%2, a%3 ORDER BY a DESC, -b, 2*b + a NULLS FIRST) as l
  443. FROM t
  444. )
  445. );
  446. ----
  447. Project (#1)
  448. Map (row_number() over (order by [#0{r} desc nulls_first]))
  449. Project (#1)
  450. Map (row_number() over (partition by [#0{l}] order by []))
  451. Project (#2)
  452. Map (lag(row(#1{b}, 3, null)) over (partition by [(#1{b} % 2), (#0{a} % 3)] order by [#0{a} desc nulls_first, -(#1{b}) asc nulls_last, ((2 * #1{b}) + #0{a}) asc nulls_first]))
  453. Get materialize.public.t
  454. Target cluster: quickstart
  455. EOF
  456. # Default frame is not printed (even when explicitly specified by the user).
  457. query T multiline
  458. EXPLAIN RAW PLAN AS TEXT FOR
  459. SELECT
  460. first_value(b) over (partition by b%6 order by b + 33 asc range between unbounded preceding and current row)
  461. FROM t;
  462. ----
  463. Project (#2)
  464. Map (first_value(#1{b}) over (partition by [(#1{b} % 6)] order by [(#1{b} + 33) asc nulls_last]))
  465. Get materialize.public.t
  466. Target cluster: quickstart
  467. EOF
  468. query T multiline
  469. EXPLAIN RAW PLAN AS TEXT FOR
  470. SELECT
  471. first_value(b) over (partition by b%6 order by b + 33 asc rows between 2 preceding and current row)
  472. FROM t;
  473. ----
  474. Project (#2)
  475. Map (first_value(#1{b}) over (partition by [(#1{b} % 6)] order by [(#1{b} + 33) asc nulls_last] rows between 2 preceding and current row))
  476. Get materialize.public.t
  477. Target cluster: quickstart
  478. EOF
  479. query T multiline
  480. EXPLAIN RAW PLAN AS TEXT FOR
  481. SELECT
  482. sum(b + 8) over (partition by b%6 order by b + 33 desc rows between 2 preceding and 3 following)
  483. FROM t;
  484. ----
  485. Project (#2)
  486. Map (sum((#1{b} + 8)) over (partition by [(#1{b} % 6)] order by [(#1{b} + 33) desc nulls_first] rows between 2 preceding and 3 following))
  487. Get materialize.public.t
  488. Target cluster: quickstart
  489. EOF
  490. query T multiline
  491. EXPLAIN RAW PLAN AS TEXT FOR
  492. WITH MUTUALLY RECURSIVE
  493. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT a, 7 FROM bar),
  494. bar (a int) as (SELECT a FROM foo)
  495. SELECT * FROM bar;
  496. ----
  497. With Mutually Recursive
  498. cte [l0 as foo] =
  499. Distinct
  500. Union
  501. Map (1, 2)
  502. Constant
  503. - ()
  504. Map (7)
  505. Get l1
  506. cte [l1 as bar] =
  507. Project (#0)
  508. Get l0
  509. Return
  510. Get l1
  511. Target cluster: mz_catalog_server
  512. EOF
  513. query T multiline
  514. EXPLAIN RAW PLAN AS TEXT FOR
  515. WITH MUTUALLY RECURSIVE (RECURSION LIMIT = 5)
  516. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT a, 7 FROM bar),
  517. bar (a int) as (SELECT a FROM foo)
  518. SELECT * FROM bar;
  519. ----
  520. With Mutually Recursive [recursion_limit=5]
  521. cte [l0 as foo] =
  522. Distinct
  523. Union
  524. Map (1, 2)
  525. Constant
  526. - ()
  527. Map (7)
  528. Get l1
  529. cte [l1 as bar] =
  530. Project (#0)
  531. Get l0
  532. Return
  533. Get l1
  534. Target cluster: mz_catalog_server
  535. EOF
  536. query T multiline
  537. EXPLAIN RAW PLAN AS TEXT FOR
  538. WITH MUTUALLY RECURSIVE (RETURN AT RECURSION LIMIT = 5)
  539. foo (a int, b int) AS (SELECT 1, 2 UNION SELECT a, 7 FROM bar),
  540. bar (a int) as (SELECT a FROM foo)
  541. SELECT * FROM bar;
  542. ----
  543. With Mutually Recursive [recursion_limit=5, return_at_limit]
  544. cte [l0 as foo] =
  545. Distinct
  546. Union
  547. Map (1, 2)
  548. Constant
  549. - ()
  550. Map (7)
  551. Get l1
  552. cte [l1 as bar] =
  553. Project (#0)
  554. Get l0
  555. Return
  556. Get l1
  557. Target cluster: mz_catalog_server
  558. EOF
  559. statement ok
  560. CREATE TABLE accounts(id int, balance int);
  561. statement ok
  562. CREATE TABLE account_details(id bigint, address string);
  563. statement ok
  564. CREATE OR REPLACE VIEW v AS
  565. SELECT
  566. *
  567. FROM
  568. accounts a
  569. LEFT JOIN account_details ad USING(id)
  570. WHERE
  571. balance = 100;
  572. # Must explain the "Raw Plan".
  573. query T multiline
  574. EXPLAIN RAW PLAN AS TEXT FOR
  575. VIEW v;
  576. ----
  577. Project (#0, #1, #3)
  578. Filter (#1{balance} = 100)
  579. LeftOuterJoin (integer_to_bigint(#0{id}) = #2{id})
  580. Get materialize.public.accounts
  581. Get materialize.public.account_details
  582. EOF
  583. statement ok
  584. CREATE TABLE t5(
  585. x int,
  586. y int NOT NULL,
  587. z int
  588. );
  589. # `count(*)` is planned as `count(true)`. We take care in EXPLAIN to show `count(true)` as `count(*)` to avoid confusing
  590. # users.
  591. query T multiline
  592. EXPLAIN RAW PLAN AS TEXT FOR
  593. SELECT count(*)
  594. FROM t5;
  595. ----
  596. Reduce aggregates=[count(*)]
  597. Get materialize.public.t5
  598. Target cluster: quickstart
  599. EOF
  600. query error DISTINCT \* not supported as function args
  601. EXPLAIN RAW PLAN AS TEXT FOR
  602. SELECT count(distinct *)
  603. FROM t5;
  604. # `count(true)` is currently also printed as `count(*)` in EXPLAIN, which I'd say is fine.
  605. query T multiline
  606. EXPLAIN RAW PLAN AS TEXT FOR
  607. SELECT count(true)
  608. FROM t5;
  609. ----
  610. Reduce aggregates=[count(*)]
  611. Get materialize.public.t5
  612. Target cluster: quickstart
  613. EOF
  614. # But `count(DISTINCT true)` means an entirely different thing, so EXPLAIN shouldn't conflate it with `count(*)`.
  615. query T multiline
  616. EXPLAIN RAW PLAN AS TEXT FOR
  617. SELECT count(DISTINCT true)
  618. FROM t5;
  619. ----
  620. Reduce aggregates=[count(distinct true)]
  621. Get materialize.public.t5
  622. Target cluster: quickstart
  623. EOF
  624. # OFFSET clause in RowSetFinishing
  625. query T multiline
  626. EXPLAIN RAW PLAN AS TEXT FOR
  627. SELECT a+b
  628. FROM t
  629. OFFSET 1;
  630. ----
  631. Finish offset=1 output=[#0]
  632. Project (#2)
  633. Map ((#0{a} + #1{b}))
  634. Get materialize.public.t
  635. Target cluster: quickstart
  636. EOF
  637. # OFFSET clause in TopK
  638. query T multiline
  639. EXPLAIN RAW PLAN AS TEXT FOR
  640. SELECT a+b, (SELECT a*b FROM t OFFSET 1)
  641. FROM t;
  642. ----
  643. Project (#2, #3)
  644. With
  645. cte [l1 as subquery-1] =
  646. Project (#2)
  647. TopK offset=1
  648. Map ((#0{a} * #1{b}))
  649. Get materialize.public.t
  650. Return
  651. Map ((#0{a} + #1{b}), select(Get l1))
  652. Get materialize.public.t
  653. Target cluster: quickstart
  654. EOF
  655. # OFFSET 0 makes the TopK disappear, even if it was an expression that comes out to 0.
  656. query T multiline
  657. EXPLAIN RAW PLAN AS TEXT FOR
  658. SELECT a+b
  659. FROM t
  660. OFFSET 0;
  661. ----
  662. Project (#2)
  663. Map ((#0{a} + #1{b}))
  664. Get materialize.public.t
  665. Target cluster: quickstart
  666. EOF
  667. query T multiline
  668. EXPLAIN RAW PLAN AS TEXT FOR
  669. SELECT a+b
  670. FROM t
  671. OFFSET 7-7;
  672. ----
  673. Project (#2)
  674. Map ((#0{a} + #1{b}))
  675. Get materialize.public.t
  676. Target cluster: quickstart
  677. EOF
  678. # The OFFSET should _not_ be printed when it is 0.
  679. query T multiline
  680. EXPLAIN RAW PLAN AS TEXT FOR
  681. SELECT a+b
  682. FROM t
  683. LIMIT 9
  684. OFFSET 7-7;
  685. ----
  686. Finish limit=9 output=[#0]
  687. Project (#2)
  688. Map ((#0{a} + #1{b}))
  689. Get materialize.public.t
  690. Target cluster: quickstart
  691. EOF
  692. query error db error: ERROR: Invalid OFFSET clause: invalid input syntax for type bigint: invalid digit found in string: "aaa"
  693. EXPLAIN RAW PLAN AS TEXT FOR
  694. SELECT a+b
  695. FROM t
  696. OFFSET 'aaa'::bigint;