physical_plan_as_text.slt 40 KB

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