physical_plan_as_text_redacted.slt 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403
  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. statement ok
  10. CREATE TABLE t (
  11. a int,
  12. b int
  13. )
  14. statement ok
  15. CREATE TABLE u (
  16. c int,
  17. d int
  18. )
  19. statement ok
  20. CREATE TABLE v (
  21. e int,
  22. f int
  23. )
  24. statement ok
  25. CREATE INDEX t_a_idx ON T(a);
  26. statement ok
  27. CREATE INDEX t_b_idx ON T(b);
  28. statement ok
  29. CREATE VIEW ov AS SELECT * FROM t ORDER BY b asc, a desc LIMIT 5
  30. statement ok
  31. CREATE INDEX ov_a_idx ON ov(a);
  32. statement ok
  33. CREATE INDEX ov_b_idx ON ov(b);
  34. statement ok
  35. CREATE MATERIALIZED VIEW mv AS
  36. SELECT * FROM t WHERE a IS NOT NULL
  37. statement ok
  38. CREATE VIEW hierarchical_group_by AS
  39. SELECT
  40. a,
  41. MIN(b),
  42. MAX(DISTINCT b)
  43. FROM t
  44. GROUP BY a
  45. statement ok
  46. CREATE MATERIALIZED VIEW hierarchical_group_by_mv AS
  47. SELECT * FROM hierarchical_group_by
  48. statement ok
  49. CREATE VIEW hierarchical_global AS
  50. SELECT
  51. MIN(b),
  52. MAX(DISTINCT b)
  53. FROM t
  54. statement ok
  55. CREATE MATERIALIZED VIEW hierarchical_global_mv AS
  56. SELECT * FROM hierarchical_global
  57. statement ok
  58. CREATE VIEW collated_group_by AS
  59. SELECT
  60. a,
  61. COUNT(DISTINCT b),
  62. STRING_AGG(b::text || '1', ',') AS b1,
  63. MIN(b),
  64. MAX(DISTINCT b),
  65. SUM(b),
  66. STRING_AGG(b::text || '2', ',') AS b2
  67. FROM t
  68. GROUP BY a
  69. statement ok
  70. CREATE MATERIALIZED VIEW collated_group_by_mv AS
  71. SELECT * FROM collated_group_by
  72. statement ok
  73. CREATE VIEW collated_global AS
  74. SELECT
  75. COUNT(DISTINCT b),
  76. STRING_AGG(b::text || '1', ',') AS b1,
  77. MIN(b),
  78. MAX(DISTINCT b),
  79. SUM(b),
  80. STRING_AGG(b::text || '2', ',') AS b2
  81. FROM t
  82. statement ok
  83. CREATE MATERIALIZED VIEW collated_global_mv AS
  84. SELECT * FROM collated_global
  85. mode cockroach
  86. # Test constant error.
  87. query T multiline
  88. EXPLAIN PHYSICAL PLAN WITH(no fast path, redacted) AS VERBOSE TEXT FOR
  89. SELECT 1 / 0
  90. ----
  91. Explained Query:
  92. Error █
  93. Target cluster: quickstart
  94. EOF
  95. # Test constant with two elements.
  96. query T multiline
  97. EXPLAIN PHYSICAL PLAN WITH(no fast path, redacted) AS VERBOSE TEXT FOR
  98. (SELECT 1, 2) UNION ALL (SELECT 1, 2) UNION ALL (SELECT 3, 4)
  99. ----
  100. Explained Query:
  101. Constant
  102. - ((█, █) x 2)
  103. - (█, █)
  104. Target cluster: mz_catalog_server
  105. EOF
  106. # Test basic linear chains.
  107. # PassArrangements plan (identity transform on an arranged input).
  108. query T multiline
  109. EXPLAIN PHYSICAL PLAN WITH(no fast path, redacted) AS VERBOSE TEXT FOR
  110. SELECT * FROM t
  111. ----
  112. Explained Query:
  113. Get::PassArrangements materialize.public.t
  114. raw=false
  115. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  116. types=[integer?, integer?]
  117. Used Indexes:
  118. - materialize.public.t_a_idx (*** full scan ***)
  119. Target cluster: quickstart
  120. EOF
  121. # PassArrangements plan (identity transform on a raw input).
  122. query T multiline
  123. EXPLAIN PHYSICAL PLAN WITH(no fast path, redacted) AS VERBOSE TEXT FOR
  124. SELECT * FROM u
  125. ----
  126. Explained Query:
  127. Get::PassArrangements materialize.public.u
  128. raw=true
  129. Source materialize.public.u
  130. Target cluster: quickstart
  131. EOF
  132. # GetArrangement plan (linear transform of an arranged input).
  133. query T multiline
  134. EXPLAIN PHYSICAL PLAN WITH(no fast path, redacted) AS VERBOSE TEXT FOR
  135. SELECT a + b, 1 FROM t
  136. ----
  137. Explained Query:
  138. Get::Arrangement materialize.public.t
  139. project=(#2, #3)
  140. map=((#0{a} + #1{b}), █)
  141. key=#0{a}
  142. raw=false
  143. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  144. types=[integer?, integer?]
  145. Used Indexes:
  146. - materialize.public.t_a_idx (*** full scan ***)
  147. Target cluster: quickstart
  148. EOF
  149. # GetCollection plan (linear transform of a raw input).
  150. query T multiline
  151. EXPLAIN PHYSICAL PLAN WITH(no fast path, redacted) AS VERBOSE TEXT FOR
  152. SELECT c + d, 1 FROM u
  153. ----
  154. Explained Query:
  155. Get::Collection materialize.public.u
  156. raw=true
  157. Source materialize.public.u
  158. project=(#2, #3)
  159. map=((#0{c} + #1{d}), █)
  160. Target cluster: quickstart
  161. EOF
  162. # TopKBasic plan.
  163. query T multiline
  164. EXPLAIN PHYSICAL PLAN WITH(no fast path, redacted) AS VERBOSE TEXT FOR
  165. INDEX ov_a_idx
  166. ----
  167. materialize.public.ov_a_idx:
  168. ArrangeBy
  169. raw=true
  170. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  171. types=[integer?, integer?]
  172. Get::PassArrangements materialize.public.ov
  173. raw=true
  174. materialize.public.ov:
  175. TopK::Basic order_by=[#1 asc nulls_last, #0 desc nulls_first] limit=█
  176. ArrangeBy
  177. input_key=[#0{a}]
  178. raw=true
  179. Get::PassArrangements materialize.public.t
  180. raw=false
  181. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  182. types=[integer?, integer?]
  183. Used Indexes:
  184. - materialize.public.t_a_idx (*** full scan ***)
  185. Target cluster: quickstart
  186. EOF
  187. # MonotonicTopK plan.
  188. query T multiline
  189. EXPLAIN PHYSICAL PLAN WITH(no fast path, redacted) AS VERBOSE TEXT FOR
  190. SELECT * FROM (SELECT * FROM t ORDER BY b asc, a desc LIMIT 5)
  191. ----
  192. Explained Query:
  193. TopK::MonotonicTopK order_by=[#1 asc nulls_last, #0 desc nulls_first] limit=█ must_consolidate
  194. ArrangeBy
  195. input_key=[#0{a}]
  196. raw=true
  197. Get::PassArrangements materialize.public.t
  198. raw=false
  199. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  200. types=[integer?, integer?]
  201. Used Indexes:
  202. - materialize.public.t_a_idx (*** full scan ***)
  203. Target cluster: quickstart
  204. EOF
  205. # Test Threshold, Union, Distinct, Negate.
  206. query T multiline
  207. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  208. SELECT a FROM t EXCEPT ALL SELECT b FROM mv
  209. ----
  210. Explained Query:
  211. Threshold::Basic ensure_arrangement={ key=[#0], permutation=id, thinning=() }
  212. ArrangeBy
  213. raw=false
  214. arrangements[0]={ key=[#0], permutation=id, thinning=() }
  215. types=[integer?]
  216. Union consolidate_output=true
  217. Get::Arrangement materialize.public.t
  218. project=(#0)
  219. key=#0{a}
  220. raw=false
  221. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  222. types=[integer?, integer?]
  223. Negate
  224. Get::Collection materialize.public.mv
  225. raw=true
  226. Source materialize.public.mv
  227. project=(#1)
  228. Used Indexes:
  229. - materialize.public.t_a_idx (*** full scan ***)
  230. Target cluster: quickstart
  231. EOF
  232. # Test CTEs.
  233. query T multiline
  234. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  235. WITH cte(x) as (SELECT a FROM t EXCEPT ALL SELECT b FROM mv)
  236. (SELECT x + 1 FROM cte UNION ALL SELECT x - 1 FROM cte)
  237. ----
  238. Explained Query:
  239. With
  240. cte l0 =
  241. Threshold::Basic ensure_arrangement={ key=[#0], permutation=id, thinning=() }
  242. ArrangeBy
  243. raw=false
  244. arrangements[0]={ key=[#0], permutation=id, thinning=() }
  245. types=[integer?]
  246. Union consolidate_output=true
  247. Get::Arrangement materialize.public.t
  248. project=(#0)
  249. key=#0{a}
  250. raw=false
  251. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  252. types=[integer?, integer?]
  253. Negate
  254. Get::Collection materialize.public.mv
  255. raw=true
  256. Return
  257. Union
  258. Get::Arrangement l0
  259. project=(#1)
  260. map=((#0{x} + █))
  261. key=#0
  262. raw=false
  263. arrangements[0]={ key=[#0], permutation=id, thinning=() }
  264. types=[integer?]
  265. Get::Arrangement l0
  266. project=(#1)
  267. map=((#0{x} - █))
  268. key=#0
  269. raw=false
  270. arrangements[0]={ key=[#0], permutation=id, thinning=() }
  271. types=[integer?]
  272. Source materialize.public.mv
  273. project=(#1)
  274. Used Indexes:
  275. - materialize.public.t_a_idx (*** full scan ***)
  276. Target cluster: quickstart
  277. EOF
  278. # Test Mfp.
  279. query T multiline
  280. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  281. WITH cte(x) as (SELECT a FROM t EXCEPT ALL SELECT b FROM mv)
  282. SELECT x * 5 FROM cte WHERE x = 5
  283. ----
  284. Explained Query:
  285. Mfp
  286. project=(#1)
  287. map=(█)
  288. input_key=#0
  289. Threshold::Basic ensure_arrangement={ key=[#0], permutation=id, thinning=() }
  290. ArrangeBy
  291. raw=false
  292. arrangements[0]={ key=[#0], permutation=id, thinning=() }
  293. types=[integer]
  294. Union consolidate_output=true
  295. Join::Linear
  296. linear_stage[0]
  297. closure
  298. project=(#0)
  299. lookup={ relation=0, key=[#0{a}] }
  300. stream={ key=[#0], thinning=() }
  301. source={ relation=1, key=[#0] }
  302. Get::PassArrangements materialize.public.t
  303. raw=false
  304. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  305. types=[integer?, integer?]
  306. ArrangeBy
  307. raw=true
  308. arrangements[0]={ key=[#0], permutation=id, thinning=() }
  309. types=[integer]
  310. Constant
  311. - (█)
  312. Negate
  313. Get::Collection materialize.public.mv
  314. raw=true
  315. Source materialize.public.mv
  316. project=(#1)
  317. filter=((#1{x} = █))
  318. Used Indexes:
  319. - materialize.public.t_a_idx (lookup)
  320. Target cluster: quickstart
  321. EOF
  322. # Test FlatMap.
  323. query T multiline
  324. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  325. SELECT generate_series(a, b) from t
  326. ----
  327. Explained Query:
  328. FlatMap generate_series(#0{a}, #1{b}, █)
  329. mfp_after
  330. project=(#2)
  331. input_key=#0{a}
  332. Get::PassArrangements materialize.public.t
  333. raw=false
  334. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  335. types=[integer?, integer?]
  336. Used Indexes:
  337. - materialize.public.t_a_idx (*** full scan ***)
  338. Target cluster: quickstart
  339. EOF
  340. # Test Reduce::Distinct.
  341. query T multiline
  342. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  343. SELECT DISTINCT a, b FROM t
  344. ----
  345. Explained Query:
  346. Reduce::Distinct
  347. val_plan
  348. project=()
  349. key_plan=id
  350. input_key=#0{a}
  351. Get::PassArrangements materialize.public.t
  352. raw=false
  353. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  354. types=[integer?, integer?]
  355. Used Indexes:
  356. - materialize.public.t_a_idx (*** full scan ***)
  357. Target cluster: quickstart
  358. EOF
  359. # Test Reduce::Accumulable (with GROUP BY).
  360. query T multiline
  361. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  362. SELECT
  363. a,
  364. SUM(b),
  365. COUNT(DISTINCT b)
  366. FROM t
  367. GROUP BY a
  368. ----
  369. Explained Query:
  370. Reduce::Accumulable
  371. simple_aggrs[0]=(0, 0, sum(#1{b}))
  372. distinct_aggrs[0]=(1, 1, count(distinct #1{b}))
  373. val_plan
  374. project=(#1, #1)
  375. key_plan
  376. project=(#0)
  377. input_key=#0{a}
  378. Get::PassArrangements materialize.public.t
  379. raw=false
  380. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  381. types=[integer?, integer?]
  382. Used Indexes:
  383. - materialize.public.t_a_idx (*** full scan ***)
  384. Target cluster: quickstart
  385. EOF
  386. # Test Reduce::Accumulable (global aggregate).
  387. query T multiline
  388. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  389. SELECT
  390. SUM(b),
  391. COUNT(DISTINCT b)
  392. FROM t
  393. ----
  394. Explained Query:
  395. With
  396. cte l0 =
  397. Reduce::Accumulable
  398. simple_aggrs[0]=(0, 0, sum(#0{b}))
  399. distinct_aggrs[0]=(1, 1, count(distinct #0{b}))
  400. val_plan
  401. project=(#0, #0)
  402. key_plan
  403. project=()
  404. Get::Arrangement materialize.public.t
  405. project=(#1)
  406. key=#0{a}
  407. raw=false
  408. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  409. types=[integer?, integer?]
  410. Return
  411. Union
  412. ArrangeBy
  413. input_key=[]
  414. raw=true
  415. Get::PassArrangements l0
  416. raw=false
  417. arrangements[0]={ key=[], permutation=id, thinning=(#0, #1) }
  418. Mfp
  419. project=(#0, #1)
  420. map=(█, █)
  421. Union consolidate_output=true
  422. Negate
  423. Get::Arrangement l0
  424. project=()
  425. key=
  426. raw=false
  427. arrangements[0]={ key=[], permutation=id, thinning=(#0, #1) }
  428. Constant
  429. - ()
  430. Used Indexes:
  431. - materialize.public.t_a_idx (*** full scan ***)
  432. Target cluster: quickstart
  433. EOF
  434. # Test Reduce::Hierarchical (with GROUP BY).
  435. query T multiline
  436. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  437. MATERIALIZED VIEW hierarchical_group_by_mv
  438. ----
  439. materialize.public.hierarchical_group_by_mv:
  440. Reduce::Hierarchical
  441. aggr_funcs=[min, max]
  442. skips=[0, 0]
  443. buckets=[268435456, 16777216, 1048576, 65536, 4096, 256, 16]
  444. val_plan
  445. project=(#1, #1)
  446. key_plan
  447. project=(#0)
  448. input_key=#0{a}
  449. Get::PassArrangements materialize.public.t
  450. raw=false
  451. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  452. types=[integer?, integer?]
  453. Used Indexes:
  454. - materialize.public.t_a_idx (*** full scan ***)
  455. Target cluster: quickstart
  456. EOF
  457. # Test Reduce::Hierarchical (with GROUP BY, one-shot).
  458. query T multiline
  459. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  460. SELECT * FROM hierarchical_group_by
  461. ----
  462. Explained Query:
  463. Reduce::Hierarchical
  464. aggr_funcs=[min, max]
  465. skips=[0, 0]
  466. monotonic
  467. must_consolidate
  468. val_plan
  469. project=(#1, #1)
  470. key_plan
  471. project=(#0)
  472. input_key=#0{a}
  473. Get::PassArrangements materialize.public.t
  474. raw=false
  475. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  476. types=[integer?, integer?]
  477. Used Indexes:
  478. - materialize.public.t_a_idx (*** full scan ***)
  479. Target cluster: quickstart
  480. EOF
  481. # Test Reduce::Hierarchical (global aggregate).
  482. query T multiline
  483. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  484. MATERIALIZED VIEW hierarchical_global_mv
  485. ----
  486. materialize.public.hierarchical_global_mv:
  487. With
  488. cte l0 =
  489. Reduce::Hierarchical
  490. aggr_funcs=[min, max]
  491. skips=[0, 0]
  492. buckets=[268435456, 16777216, 1048576, 65536, 4096, 256, 16]
  493. val_plan
  494. project=(#0, #0)
  495. key_plan
  496. project=()
  497. Get::Arrangement materialize.public.t
  498. project=(#1)
  499. key=#0{a}
  500. raw=false
  501. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  502. types=[integer?, integer?]
  503. Return
  504. Union
  505. ArrangeBy
  506. input_key=[]
  507. raw=true
  508. Get::PassArrangements l0
  509. raw=false
  510. arrangements[0]={ key=[], permutation=id, thinning=(#0, #1) }
  511. Mfp
  512. project=(#0, #1)
  513. map=(█, █)
  514. Union consolidate_output=true
  515. Negate
  516. Get::Arrangement l0
  517. project=()
  518. key=
  519. raw=false
  520. arrangements[0]={ key=[], permutation=id, thinning=(#0, #1) }
  521. Constant
  522. - ()
  523. Used Indexes:
  524. - materialize.public.t_a_idx (*** full scan ***)
  525. Target cluster: quickstart
  526. EOF
  527. # Test Reduce::Hierarchical (global aggregate, one-shot).
  528. query T multiline
  529. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  530. SELECT * FROM hierarchical_global
  531. ----
  532. Explained Query:
  533. With
  534. cte l0 =
  535. Reduce::Hierarchical
  536. aggr_funcs=[min, max]
  537. skips=[0, 0]
  538. monotonic
  539. must_consolidate
  540. val_plan
  541. project=(#0, #0)
  542. key_plan
  543. project=()
  544. Get::Arrangement materialize.public.t
  545. project=(#1)
  546. key=#0{a}
  547. raw=false
  548. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  549. types=[integer?, integer?]
  550. Return
  551. Union
  552. ArrangeBy
  553. input_key=[]
  554. raw=true
  555. Get::PassArrangements l0
  556. raw=false
  557. arrangements[0]={ key=[], permutation=id, thinning=(#0, #1) }
  558. Mfp
  559. project=(#0, #1)
  560. map=(█, █)
  561. Union consolidate_output=true
  562. Negate
  563. Get::Arrangement l0
  564. project=()
  565. key=
  566. raw=false
  567. arrangements[0]={ key=[], permutation=id, thinning=(#0, #1) }
  568. Constant
  569. - ()
  570. Used Indexes:
  571. - materialize.public.t_a_idx (*** full scan ***)
  572. Target cluster: quickstart
  573. EOF
  574. # Test Reduce::Basic (with GROUP BY).
  575. query T multiline
  576. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  577. SELECT
  578. a,
  579. STRING_AGG(b::text || '1', ','),
  580. STRING_AGG(b::text || '2', ',')
  581. FROM t
  582. GROUP BY a
  583. ----
  584. Explained Query:
  585. Reduce::Basic
  586. aggrs[0]=(0, string_agg[order_by=[]](row(row((integer_to_text(#1{b}) || █), █))))
  587. aggrs[1]=(1, string_agg[order_by=[]](row(row((integer_to_text(#1{b}) || █), █))))
  588. val_plan
  589. project=(#3, #4)
  590. map=(integer_to_text(#1{b}), row(row((#2 || █), █)), row(row((#2 || █), █)))
  591. key_plan
  592. project=(#0)
  593. input_key=#0{a}
  594. Get::PassArrangements materialize.public.t
  595. raw=false
  596. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  597. types=[integer?, integer?]
  598. Used Indexes:
  599. - materialize.public.t_a_idx (*** full scan ***)
  600. Target cluster: quickstart
  601. EOF
  602. # Test Reduce::Basic (global aggregate).
  603. query T multiline
  604. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  605. SELECT
  606. STRING_AGG(b::text || '1', ','),
  607. STRING_AGG(b::text || '2', ',')
  608. FROM t
  609. ----
  610. Explained Query:
  611. With
  612. cte l0 =
  613. Reduce::Basic
  614. aggrs[0]=(0, string_agg[order_by=[]](row(row((integer_to_text(#0{b}) || █), █))))
  615. aggrs[1]=(1, string_agg[order_by=[]](row(row((integer_to_text(#0{b}) || █), █))))
  616. val_plan
  617. project=(#2, #3)
  618. map=(integer_to_text(#0{b}), row(row((#1 || █), █)), row(row((#1 || █), █)))
  619. key_plan
  620. project=()
  621. Get::Arrangement materialize.public.t
  622. project=(#1)
  623. key=#0{a}
  624. raw=false
  625. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  626. types=[integer?, integer?]
  627. Return
  628. Union
  629. ArrangeBy
  630. input_key=[]
  631. raw=true
  632. Get::PassArrangements l0
  633. raw=false
  634. arrangements[0]={ key=[], permutation=id, thinning=(#0, #1) }
  635. Mfp
  636. project=(#0, #1)
  637. map=(█, █)
  638. Union consolidate_output=true
  639. Negate
  640. Get::Arrangement l0
  641. project=()
  642. key=
  643. raw=false
  644. arrangements[0]={ key=[], permutation=id, thinning=(#0, #1) }
  645. Constant
  646. - ()
  647. Used Indexes:
  648. - materialize.public.t_a_idx (*** full scan ***)
  649. Target cluster: quickstart
  650. EOF
  651. # Test Reduce::Collated (with GROUP BY).
  652. query T multiline
  653. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  654. MATERIALIZED VIEW collated_group_by_mv
  655. ----
  656. materialize.public.collated_group_by_mv:
  657. Reduce::Collation
  658. aggregate_types=[a, b, h, h, a, b]
  659. accumulable
  660. simple_aggrs[0]=(1, 4, sum(#1{b}))
  661. distinct_aggrs[0]=(0, 0, count(distinct #1{b}))
  662. hierarchical
  663. aggr_funcs=[min, max]
  664. skips=[2, 0]
  665. buckets=[268435456, 16777216, 1048576, 65536, 4096, 256, 16]
  666. basic
  667. aggrs[0]=(1, string_agg[order_by=[]](row(row((integer_to_text(#1{b}) || █), █))))
  668. aggrs[1]=(5, string_agg[order_by=[]](row(row((integer_to_text(#1{b}) || █), █))))
  669. val_plan
  670. project=(#1, #3, #1, #1, #1, #4)
  671. map=(integer_to_text(#1{b}), row(row((#2 || █), █)), row(row((#2 || █), █)))
  672. key_plan
  673. project=(#0)
  674. input_key=#0{a}
  675. Get::PassArrangements materialize.public.t
  676. raw=false
  677. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  678. types=[integer?, integer?]
  679. Used Indexes:
  680. - materialize.public.t_a_idx (*** full scan ***)
  681. Target cluster: quickstart
  682. EOF
  683. # Test Reduce::Collated (with GROUP BY, one-shot).
  684. query T multiline
  685. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  686. SELECT * FROM collated_group_by
  687. ----
  688. Explained Query:
  689. Reduce::Collation
  690. aggregate_types=[a, b, h, h, a, b]
  691. accumulable
  692. simple_aggrs[0]=(1, 4, sum(#1{b}))
  693. distinct_aggrs[0]=(0, 0, count(distinct #1{b}))
  694. hierarchical
  695. aggr_funcs=[min, max]
  696. skips=[2, 0]
  697. monotonic
  698. must_consolidate
  699. basic
  700. aggrs[0]=(1, string_agg[order_by=[]](row(row((integer_to_text(#1{b}) || █), █))))
  701. aggrs[1]=(5, string_agg[order_by=[]](row(row((integer_to_text(#1{b}) || █), █))))
  702. val_plan
  703. project=(#1, #3, #1, #1, #1, #4)
  704. map=(integer_to_text(#1{b}), row(row((#2 || █), █)), row(row((#2 || █), █)))
  705. key_plan
  706. project=(#0)
  707. input_key=#0{a}
  708. Get::PassArrangements materialize.public.t
  709. raw=false
  710. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  711. types=[integer?, integer?]
  712. Used Indexes:
  713. - materialize.public.t_a_idx (*** full scan ***)
  714. Target cluster: quickstart
  715. EOF
  716. # Test Reduce::Collated (global aggregate).
  717. query T multiline
  718. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  719. MATERIALIZED VIEW collated_global_mv
  720. ----
  721. materialize.public.collated_global_mv:
  722. With
  723. cte l0 =
  724. Reduce::Collation
  725. aggregate_types=[a, b, h, h, a, b]
  726. accumulable
  727. simple_aggrs[0]=(1, 4, sum(#0{b}))
  728. distinct_aggrs[0]=(0, 0, count(distinct #0{b}))
  729. hierarchical
  730. aggr_funcs=[min, max]
  731. skips=[2, 0]
  732. buckets=[268435456, 16777216, 1048576, 65536, 4096, 256, 16]
  733. basic
  734. aggrs[0]=(1, string_agg[order_by=[]](row(row((integer_to_text(#0{b}) || █), █))))
  735. aggrs[1]=(5, string_agg[order_by=[]](row(row((integer_to_text(#0{b}) || █), █))))
  736. val_plan
  737. project=(#0, #2, #0, #0, #0, #3)
  738. map=(integer_to_text(#0{b}), row(row((#1 || █), █)), row(row((#1 || █), █)))
  739. key_plan
  740. project=()
  741. Get::Arrangement materialize.public.t
  742. project=(#1)
  743. key=#0{a}
  744. raw=false
  745. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  746. types=[integer?, integer?]
  747. Return
  748. Union
  749. ArrangeBy
  750. input_key=[]
  751. raw=true
  752. Get::PassArrangements l0
  753. raw=false
  754. arrangements[0]={ key=[], permutation=id, thinning=(#0..=#5) }
  755. Mfp
  756. project=(#0..=#5)
  757. map=(█, █, █, █, █, █)
  758. Union consolidate_output=true
  759. Negate
  760. Get::Arrangement l0
  761. project=()
  762. key=
  763. raw=false
  764. arrangements[0]={ key=[], permutation=id, thinning=(#0..=#5) }
  765. Constant
  766. - ()
  767. Used Indexes:
  768. - materialize.public.t_a_idx (*** full scan ***)
  769. Target cluster: quickstart
  770. EOF
  771. # Test Reduce::Collated (global aggregate, one-shot).
  772. query T multiline
  773. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  774. SELECT * FROM collated_global
  775. ----
  776. Explained Query:
  777. With
  778. cte l0 =
  779. Reduce::Collation
  780. aggregate_types=[a, b, h, h, a, b]
  781. accumulable
  782. simple_aggrs[0]=(1, 4, sum(#0{b}))
  783. distinct_aggrs[0]=(0, 0, count(distinct #0{b}))
  784. hierarchical
  785. aggr_funcs=[min, max]
  786. skips=[2, 0]
  787. monotonic
  788. must_consolidate
  789. basic
  790. aggrs[0]=(1, string_agg[order_by=[]](row(row((integer_to_text(#0{b}) || █), █))))
  791. aggrs[1]=(5, string_agg[order_by=[]](row(row((integer_to_text(#0{b}) || █), █))))
  792. val_plan
  793. project=(#0, #2, #0, #0, #0, #3)
  794. map=(integer_to_text(#0{b}), row(row((#1 || █), █)), row(row((#1 || █), █)))
  795. key_plan
  796. project=()
  797. Get::Arrangement materialize.public.t
  798. project=(#1)
  799. key=#0{a}
  800. raw=false
  801. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  802. types=[integer?, integer?]
  803. Return
  804. Union
  805. ArrangeBy
  806. input_key=[]
  807. raw=true
  808. Get::PassArrangements l0
  809. raw=false
  810. arrangements[0]={ key=[], permutation=id, thinning=(#0..=#5) }
  811. Mfp
  812. project=(#0..=#5)
  813. map=(█, █, █, █, █, █)
  814. Union consolidate_output=true
  815. Negate
  816. Get::Arrangement l0
  817. project=()
  818. key=
  819. raw=false
  820. arrangements[0]={ key=[], permutation=id, thinning=(#0..=#5) }
  821. Constant
  822. - ()
  823. Used Indexes:
  824. - materialize.public.t_a_idx (*** full scan ***)
  825. Target cluster: quickstart
  826. EOF
  827. # Test EXPLAIN INDEX for an indexed source
  828. query T multiline
  829. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  830. INDEX t_a_idx
  831. ----
  832. materialize.public.t_a_idx:
  833. ArrangeBy
  834. raw=true
  835. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  836. types=[integer?, integer?]
  837. Get::PassArrangements materialize.public.t
  838. raw=true
  839. Source materialize.public.t
  840. Target cluster: quickstart
  841. EOF
  842. # Test EXPLAIN INDEX for an indexed view (first index)
  843. query T multiline
  844. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  845. INDEX ov_a_idx;
  846. ----
  847. materialize.public.ov_a_idx:
  848. ArrangeBy
  849. raw=true
  850. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  851. types=[integer?, integer?]
  852. Get::PassArrangements materialize.public.ov
  853. raw=true
  854. materialize.public.ov:
  855. TopK::Basic order_by=[#1 asc nulls_last, #0 desc nulls_first] limit=█
  856. ArrangeBy
  857. input_key=[#0{a}]
  858. raw=true
  859. Get::PassArrangements materialize.public.t
  860. raw=false
  861. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  862. types=[integer?, integer?]
  863. Used Indexes:
  864. - materialize.public.t_a_idx (*** full scan ***)
  865. Target cluster: quickstart
  866. EOF
  867. # Test EXPLAIN INDEX for an indexed view (based on a prior index)
  868. query T multiline
  869. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  870. INDEX ov_b_idx;
  871. ----
  872. materialize.public.ov_b_idx:
  873. ArrangeBy
  874. input_key=[#0{a}]
  875. raw=false
  876. arrangements[0]={ key=[#1{b}], permutation={#0: #1, #1: #0}, thinning=(#0) }
  877. types=[integer?, integer?]
  878. Get::PassArrangements materialize.public.ov
  879. raw=false
  880. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  881. types=[integer?, integer?]
  882. Used Indexes:
  883. - materialize.public.ov_a_idx (*** full scan ***, index export)
  884. Target cluster: quickstart
  885. EOF
  886. # Test Join::Differential (acyclic).
  887. query T multiline
  888. EXPLAIN PHYSICAL PLAN WITH(non negative) AS VERBOSE TEXT FOR
  889. SELECT b + d, c + e, a + e
  890. FROM t, u, v
  891. WHERE a = c AND d = e AND b + d > 42
  892. ----
  893. Explained Query:
  894. Join::Delta
  895. plan_path[0]
  896. final_closure
  897. project=(#0, #1, #1)
  898. delta_stage[1]
  899. closure
  900. project=(#1, #2)
  901. lookup={ relation=2, key=[#0{e}] }
  902. stream={ key=[#0{d}], thinning=(#1, #2) }
  903. delta_stage[0]
  904. closure
  905. project=(#2..=#4)
  906. filter=((#3 > 42))
  907. map=((#1{b} + #2{d}), (#0{a} + #2{d}))
  908. lookup={ relation=1, key=[#0{c}] }
  909. stream={ key=[#0{a}], thinning=(#1) }
  910. source={ relation=0, key=[#0{a}] }
  911. plan_path[1]
  912. final_closure
  913. project=(#0, #1, #1)
  914. delta_stage[1]
  915. closure
  916. project=(#1, #2)
  917. lookup={ relation=2, key=[#0{e}] }
  918. stream={ key=[#0{d}], thinning=(#1, #2) }
  919. delta_stage[0]
  920. closure
  921. project=(#1, #3, #4)
  922. filter=((#3 > 42))
  923. map=((#2{b} + #1{d}), (#0{a} + #1{d}))
  924. lookup={ relation=0, key=[#0{a}] }
  925. stream={ key=[#0{c}], thinning=(#1) }
  926. source={ relation=1, key=[#0{c}] }
  927. plan_path[2]
  928. final_closure
  929. project=(#0, #1, #1)
  930. delta_stage[1]
  931. closure
  932. project=(#3, #4)
  933. filter=((#3 > 42))
  934. map=((#2{b} + #1{d}), (#0{a} + #1{d}))
  935. lookup={ relation=0, key=[#0{a}] }
  936. stream={ key=[#0{c}], thinning=(#1) }
  937. delta_stage[0]
  938. closure
  939. project=(#1, #0)
  940. lookup={ relation=1, key=[#1{d}] }
  941. stream={ key=[#0{e}], thinning=() }
  942. source={ relation=2, key=[#0{e}] }
  943. Get::PassArrangements materialize.public.t
  944. raw=false
  945. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  946. types=[integer?, integer?]
  947. ArrangeBy
  948. raw=true
  949. arrangements[0]={ key=[#0{c}], permutation=id, thinning=(#1) }
  950. arrangements[1]={ key=[#1{d}], permutation={#0: #1, #1: #0}, thinning=(#0) }
  951. types=[integer, integer]
  952. Get::Collection materialize.public.u
  953. raw=true
  954. ArrangeBy
  955. raw=true
  956. arrangements[0]={ key=[#0{e}], permutation=id, thinning=() }
  957. types=[integer]
  958. Get::Collection materialize.public.v
  959. raw=true
  960. Source materialize.public.u
  961. filter=((#0{c}) IS NOT NULL AND (#1{d}) IS NOT NULL)
  962. Source materialize.public.v
  963. project=(#0)
  964. filter=((#0{e}) IS NOT NULL)
  965. Used Indexes:
  966. - materialize.public.t_a_idx (delta join 1st input (full scan))
  967. Target cluster: quickstart
  968. EOF
  969. # Create indexes required for differential join tests
  970. statement ok
  971. CREATE INDEX u_c_idx ON U(c);
  972. statement ok
  973. CREATE INDEX u_d_idx ON U(d);
  974. statement ok
  975. CREATE INDEX v_e_idx ON V(e);
  976. # Test Join::Differential (cyclic).
  977. query T multiline
  978. EXPLAIN PHYSICAL PLAN WITH(non negative) AS VERBOSE TEXT FOR
  979. SELECT a, b, c, d, e, f
  980. FROM t, u, v
  981. WHERE a = c AND d = e AND f = a
  982. ----
  983. Explained Query:
  984. Join::Delta
  985. plan_path[0]
  986. final_closure
  987. project=(#0, #1, #0, #2, #2, #0)
  988. delta_stage[1]
  989. closure
  990. project=(#1, #2, #0)
  991. lookup={ relation=2, key=[#0{e}, #1{f}] }
  992. stream={ key=[#2{d}, #0{a}], thinning=(#1) }
  993. delta_stage[0]
  994. lookup={ relation=1, key=[#0{c}] }
  995. stream={ key=[#0{a}], thinning=(#1) }
  996. source={ relation=0, key=[#0{a}] }
  997. plan_path[1]
  998. final_closure
  999. project=(#0, #1, #0, #2, #2, #0)
  1000. delta_stage[1]
  1001. closure
  1002. project=(#0, #2, #1)
  1003. lookup={ relation=0, key=[#0{a}] }
  1004. stream={ key=[#0{c}], thinning=(#1) }
  1005. delta_stage[0]
  1006. closure
  1007. project=(#1, #0)
  1008. lookup={ relation=2, key=[#0{e}, #1{f}] }
  1009. stream={ key=[#1{d}, #0{c}], thinning=() }
  1010. source={ relation=1, key=[#0{c}] }
  1011. plan_path[2]
  1012. final_closure
  1013. project=(#0, #1, #0, #2, #2, #0)
  1014. delta_stage[1]
  1015. closure
  1016. project=(#0, #2, #1)
  1017. lookup={ relation=0, key=[#0{a}] }
  1018. stream={ key=[#1{f}], thinning=(#0) }
  1019. delta_stage[0]
  1020. closure
  1021. project=(#1, #0)
  1022. lookup={ relation=1, key=[#0{c}, #1{d}] }
  1023. stream={ key=[#1{f}, #0{e}], thinning=() }
  1024. source={ relation=2, key=[#0{e}, #1{f}] }
  1025. Get::PassArrangements materialize.public.t
  1026. raw=false
  1027. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  1028. types=[integer?, integer?]
  1029. ArrangeBy
  1030. raw=true
  1031. arrangements[0]={ key=[#0{c}], permutation=id, thinning=(#1) }
  1032. arrangements[1]={ key=[#0{c}, #1{d}], permutation=id, thinning=() }
  1033. types=[integer, integer]
  1034. Get::Arrangement materialize.public.u
  1035. filter=((#0{c}) IS NOT NULL AND (#1{d}) IS NOT NULL)
  1036. key=#0{c}
  1037. raw=false
  1038. arrangements[0]={ key=[#0{c}], permutation=id, thinning=(#1) }
  1039. types=[integer?, integer?]
  1040. ArrangeBy
  1041. raw=true
  1042. arrangements[0]={ key=[#0{e}, #1{f}], permutation=id, thinning=() }
  1043. types=[integer, integer]
  1044. Get::Arrangement materialize.public.v
  1045. filter=((#0{e}) IS NOT NULL AND (#1{f}) IS NOT NULL)
  1046. key=#0{e}
  1047. raw=false
  1048. arrangements[0]={ key=[#0{e}], permutation=id, thinning=(#1) }
  1049. types=[integer?, integer?]
  1050. Used Indexes:
  1051. - materialize.public.t_a_idx (delta join 1st input (full scan))
  1052. - materialize.public.u_c_idx (*** full scan ***)
  1053. - materialize.public.v_e_idx (*** full scan ***)
  1054. Target cluster: quickstart
  1055. EOF
  1056. # Test Join::Delta (star).
  1057. query T multiline
  1058. EXPLAIN PHYSICAL PLAN WITH(non negative) AS VERBOSE TEXT FOR
  1059. SELECT a, b, c, d, e, f
  1060. FROM t, u, v
  1061. WHERE a = c and a = e
  1062. ----
  1063. Explained Query:
  1064. Join::Delta
  1065. plan_path[0]
  1066. final_closure
  1067. project=(#0, #1, #0, #2, #0, #3)
  1068. delta_stage[1]
  1069. lookup={ relation=2, key=[#0{e}] }
  1070. stream={ key=[#0{a}], thinning=(#1, #2) }
  1071. delta_stage[0]
  1072. lookup={ relation=1, key=[#0{c}] }
  1073. stream={ key=[#0{a}], thinning=(#1) }
  1074. initial_closure
  1075. filter=((#0{a}) IS NOT NULL)
  1076. source={ relation=0, key=[#0{a}] }
  1077. plan_path[1]
  1078. final_closure
  1079. project=(#0, #1, #0, #2, #0, #3)
  1080. delta_stage[1]
  1081. closure
  1082. project=(#1..=#4)
  1083. lookup={ relation=2, key=[#0{e}] }
  1084. stream={ key=[#2{c}], thinning=(#0, #1, #3) }
  1085. delta_stage[0]
  1086. closure
  1087. project=(#0, #2, #0, #1)
  1088. filter=((#0{a}) IS NOT NULL)
  1089. lookup={ relation=0, key=[#0{a}] }
  1090. stream={ key=[#0{c}], thinning=(#1) }
  1091. source={ relation=1, key=[#0{c}] }
  1092. plan_path[2]
  1093. final_closure
  1094. project=(#0, #1, #0, #2, #0, #3)
  1095. delta_stage[1]
  1096. closure
  1097. project=(#1, #2, #4, #3)
  1098. lookup={ relation=1, key=[#0{c}] }
  1099. stream={ key=[#2{e}], thinning=(#0, #1, #3) }
  1100. delta_stage[0]
  1101. closure
  1102. project=(#0, #2, #0, #1)
  1103. filter=((#0{a}) IS NOT NULL)
  1104. lookup={ relation=0, key=[#0{a}] }
  1105. stream={ key=[#0{e}], thinning=(#1) }
  1106. source={ relation=2, key=[#0{e}] }
  1107. Get::PassArrangements materialize.public.t
  1108. raw=false
  1109. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  1110. types=[integer?, integer?]
  1111. Get::PassArrangements materialize.public.u
  1112. raw=false
  1113. arrangements[0]={ key=[#0{c}], permutation=id, thinning=(#1) }
  1114. types=[integer?, integer?]
  1115. Get::PassArrangements materialize.public.v
  1116. raw=false
  1117. arrangements[0]={ key=[#0{e}], permutation=id, thinning=(#1) }
  1118. types=[integer?, integer?]
  1119. Used Indexes:
  1120. - materialize.public.t_a_idx (delta join 1st input (full scan))
  1121. - materialize.public.u_c_idx (delta join lookup)
  1122. - materialize.public.v_e_idx (delta join lookup)
  1123. Target cluster: quickstart
  1124. EOF
  1125. # Test materialize#17348.
  1126. statement ok
  1127. 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);
  1128. query T multiline
  1129. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT *
  1130. FROM r AS r0, r AS r1
  1131. WHERE
  1132. r0.f0=r1.f0 AND
  1133. r0.f2=r1.f2 AND
  1134. r0.f3=r1.f3 AND
  1135. r0.f4=r1.f4 AND
  1136. r0.f6=r1.f6 AND
  1137. r0.f8=r1.f8 AND
  1138. r0.f9=r1.f9 AND
  1139. r0.f11=r1.f11 AND
  1140. r0.f12=r1.f12 AND
  1141. r0.f13=r1.f13 AND
  1142. r0.f15=r1.f15 AND
  1143. r0.f16=r1.f16;
  1144. ----
  1145. Explained Query:
  1146. With
  1147. cte l0 =
  1148. ArrangeBy keys=[[#0{f0}, #2{f2}..=#4{f4}, #6{f6}, #8{f8}, #9{f9}, #11{f11}..=#13{f13}, #15{f15}, #16{f16}]]
  1149. 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
  1150. ReadStorage materialize.public.r
  1151. Return
  1152. 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})
  1153. 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
  1154. Get l0
  1155. Get l0
  1156. Source materialize.public.r
  1157. 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)
  1158. Target cluster: quickstart
  1159. EOF
  1160. # Test `LetRec` printing, with and without RECURSION LIMIT
  1161. # With materialize#27389 this stopped testing a thing; see issue database-issues#8294.
  1162. query T multiline
  1163. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  1164. SELECT * FROM (
  1165. WITH MUTUALLY RECURSIVE (RECURSION LIMIT 5)
  1166. foo (a int8) AS (SELECT DISTINCT a FROM foo)
  1167. SELECT * FROM foo
  1168. )
  1169. UNION ALL
  1170. SELECT * FROM (
  1171. WITH MUTUALLY RECURSIVE
  1172. bar (a int8) AS (SELECT DISTINCT a - 2 FROM bar)
  1173. SELECT * FROM bar
  1174. );
  1175. ----
  1176. Explained Query (fast path):
  1177. Constant <empty>
  1178. Target cluster: mz_catalog_server
  1179. EOF
  1180. query T multiline
  1181. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  1182. SELECT lead(b, 3, -5) IGNORE NULLS OVER () as l
  1183. FROM t;
  1184. ----
  1185. Explained Query:
  1186. Mfp
  1187. project=(#1)
  1188. map=(record_get[0](#0))
  1189. input_key=
  1190. Reduce::Basic
  1191. aggr=(0, lead[ignore_nulls=true, order_by=[]](row(row(row(#0, #1), row(#1{b}, █, █)))), fused_unnest_list=true)
  1192. val_plan
  1193. project=(#2)
  1194. map=(row(row(row(#0, #1), row(#1{b}, █, █))))
  1195. key_plan
  1196. project=()
  1197. input_key=#0{a}
  1198. Get::PassArrangements materialize.public.t
  1199. raw=false
  1200. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  1201. types=[integer?, integer?]
  1202. Used Indexes:
  1203. - materialize.public.t_a_idx (*** full scan ***)
  1204. Target cluster: quickstart
  1205. EOF
  1206. query T multiline
  1207. EXPLAIN PHYSICAL PLAN WITH(redacted) AS VERBOSE TEXT FOR
  1208. SELECT lag(b, 3, -5) IGNORE NULLS OVER (PARTITION BY b, a ORDER BY b+8, a-7) as l
  1209. FROM t;
  1210. ----
  1211. Explained Query:
  1212. Mfp
  1213. project=(#3)
  1214. map=(record_get[0](#2))
  1215. input_key=#0, #1
  1216. Reduce::Basic
  1217. aggr=(0, lag[ignore_nulls=true, order_by=[#0 asc nulls_last, #1 asc nulls_last]](row(row(row(#0, #1), row(#1{b}, █, █)), (#1{b} + █), (#0{a} - █))), fused_unnest_list=true)
  1218. val_plan
  1219. project=(#2)
  1220. map=(row(row(row(#0, #1), row(#1{b}, █, █)), (#1{b} + █), (#0{a} - █)))
  1221. key_plan
  1222. project=(#1, #0)
  1223. input_key=#0{a}
  1224. Get::PassArrangements materialize.public.t
  1225. raw=false
  1226. arrangements[0]={ key=[#0{a}], permutation=id, thinning=(#1) }
  1227. types=[integer?, integer?]
  1228. Used Indexes:
  1229. - materialize.public.t_a_idx (*** full scan ***)
  1230. Target cluster: quickstart
  1231. EOF