physical_plan_aggregates.slt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. mode cockroach
  10. statement ok
  11. CREATE TABLE t (
  12. a INT NOT NULL,
  13. b TEXT NOT NULL,
  14. c TEXT
  15. );
  16. statement ok
  17. INSERT INTO t VALUES (1, '10', 'x'), (2, '20', NULL), (3, '30', NULL), (4, '40', 'x'), (5, '50a', 'x'), (5, '50b', 'y'), (5, '50c', 'z');
  18. query T multiline
  19. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b) FROM t GROUP BY a;
  20. ----
  21. Explained Query:
  22. Reduce::Basic
  23. aggr=(0, array_agg[order_by=[]](row(array[#1{b}])))
  24. val_plan
  25. project=(#2)
  26. map=(row(array[#1{b}]))
  27. key_plan
  28. project=(#0)
  29. Get::Collection materialize.public.t
  30. raw=true
  31. Source materialize.public.t
  32. project=(#0, #1)
  33. Target cluster: quickstart
  34. EOF
  35. query T multiline
  36. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b), array_agg(c) FROM t GROUP BY a;
  37. ----
  38. Explained Query:
  39. Reduce::Basic
  40. aggrs[0]=(0, array_agg[order_by=[]](row(array[#1{b}])))
  41. aggrs[1]=(1, array_agg[order_by=[]](row(array[#2{c}])))
  42. val_plan
  43. project=(#3, #4)
  44. map=(row(array[#1{b}]), row(array[#2{c}]))
  45. key_plan
  46. project=(#0)
  47. Get::PassArrangements materialize.public.t
  48. raw=true
  49. Source materialize.public.t
  50. Target cluster: quickstart
  51. EOF
  52. query T multiline
  53. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b), string_agg(c, ',') FROM t GROUP BY a;
  54. ----
  55. Explained Query:
  56. Reduce::Basic
  57. aggrs[0]=(0, array_agg[order_by=[]](row(array[#1{b}])))
  58. aggrs[1]=(1, string_agg[order_by=[]](row(row(#2{c}, ","))))
  59. val_plan
  60. project=(#3, #4)
  61. map=(row(array[#1{b}]), row(row(#2{c}, ",")))
  62. key_plan
  63. project=(#0)
  64. Get::PassArrangements materialize.public.t
  65. raw=true
  66. Source materialize.public.t
  67. Target cluster: quickstart
  68. EOF
  69. query T multiline
  70. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b), string_agg(c, ',' ORDER BY b DESC) FROM t GROUP BY a;
  71. ----
  72. Explained Query:
  73. Reduce::Basic
  74. aggrs[0]=(0, array_agg[order_by=[]](row(array[#1{b}])))
  75. aggrs[1]=(1, string_agg[order_by=[#0 desc nulls_first]](row(row(#2{c}, ","), #1{b})))
  76. val_plan
  77. project=(#3, #4)
  78. map=(row(array[#1{b}]), row(row(#2{c}, ","), #1{b}))
  79. key_plan
  80. project=(#0)
  81. Get::PassArrangements materialize.public.t
  82. raw=true
  83. Source materialize.public.t
  84. Target cluster: quickstart
  85. EOF
  86. query T multiline
  87. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b), max(c) FROM t WHERE c <> 'x' GROUP BY a;
  88. ----
  89. Explained Query:
  90. Reduce::Collation
  91. aggregate_types=[b, h]
  92. hierarchical
  93. aggr_funcs=[max]
  94. skips=[1]
  95. monotonic
  96. must_consolidate
  97. basic
  98. aggr=(0, array_agg[order_by=[]](row(array[#1{b}])))
  99. val_plan
  100. project=(#3, #2)
  101. map=(row(array[#1{b}]))
  102. key_plan
  103. project=(#0)
  104. Get::Collection materialize.public.t
  105. raw=true
  106. Source materialize.public.t
  107. filter=((#2{c} != "x"))
  108. Target cluster: quickstart
  109. EOF
  110. query T multiline
  111. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b), max(b) FROM t GROUP BY a HAVING count(a) > 1;
  112. ----
  113. Explained Query:
  114. Reduce::Collation
  115. aggregate_types=[b, h, a]
  116. accumulable
  117. simple_aggrs[0]=(0, 2, count(*))
  118. hierarchical
  119. aggr_funcs=[max]
  120. skips=[1]
  121. monotonic
  122. must_consolidate
  123. basic
  124. aggr=(0, array_agg[order_by=[]](row(array[#1{b}])))
  125. val_plan
  126. project=(#2, #1, #3)
  127. map=(row(array[#1{b}]), true)
  128. key_plan
  129. project=(#0)
  130. mfp_after
  131. project=(#0..=#2)
  132. filter=((#3{"?column?"} > 1))
  133. Get::Collection materialize.public.t
  134. raw=true
  135. Source materialize.public.t
  136. project=(#0, #1)
  137. Target cluster: quickstart
  138. EOF
  139. query T multiline
  140. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, min(b), max(b) FROM t GROUP BY a;
  141. ----
  142. Explained Query:
  143. Reduce::Hierarchical
  144. aggr_funcs=[min, max]
  145. skips=[0, 0]
  146. monotonic
  147. must_consolidate
  148. val_plan
  149. project=(#1, #1)
  150. key_plan
  151. project=(#0)
  152. Get::Collection materialize.public.t
  153. raw=true
  154. Source materialize.public.t
  155. project=(#0, #1)
  156. Target cluster: quickstart
  157. EOF
  158. query T multiline
  159. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b ORDER BY b ASC), array_agg(b ORDER BY b DESC) FROM t GROUP BY a;
  160. ----
  161. Explained Query:
  162. Reduce::Basic
  163. aggrs[0]=(0, array_agg[order_by=[#0 asc nulls_last]](row(array[#1{b}], #1{b})))
  164. aggrs[1]=(1, array_agg[order_by=[#0 desc nulls_first]](row(array[#1{b}], #1{b})))
  165. val_plan
  166. project=(#2, #2)
  167. map=(row(array[#1{b}], #1{b}))
  168. key_plan
  169. project=(#0)
  170. Get::Collection materialize.public.t
  171. raw=true
  172. Source materialize.public.t
  173. project=(#0, #1)
  174. Target cluster: quickstart
  175. EOF
  176. query T multiline
  177. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT array_agg(b ORDER BY b ASC), array_agg(b ORDER BY b DESC), bool_or(b IS NOT NULL) FROM t;
  178. ----
  179. Explained Query:
  180. With
  181. cte l0 =
  182. Reduce::Collation
  183. aggregate_types=[b, b, a]
  184. accumulable
  185. simple_aggrs[0]=(0, 2, sum(1))
  186. basic
  187. aggrs[0]=(0, array_agg[order_by=[#0 asc nulls_last]](row(array[#0{b}], #0{b})))
  188. aggrs[1]=(1, array_agg[order_by=[#0 desc nulls_first]](row(array[#0{b}], #0{b})))
  189. val_plan
  190. project=(#1, #1, #2)
  191. map=(row(array[#0{b}], #0{b}), 1)
  192. key_plan
  193. project=()
  194. Get::Collection materialize.public.t
  195. raw=true
  196. Return
  197. Mfp
  198. project=(#0, #1, #3)
  199. map=((#2{"?column?"} > 0))
  200. Union
  201. ArrangeBy
  202. input_key=[]
  203. raw=true
  204. Get::PassArrangements l0
  205. raw=false
  206. arrangements[0]={ key=[], permutation=id, thinning=(#0..=#2) }
  207. Mfp
  208. project=(#0..=#2)
  209. map=(null, null, null)
  210. Union consolidate_output=true
  211. Negate
  212. Get::Arrangement l0
  213. project=()
  214. key=
  215. raw=false
  216. arrangements[0]={ key=[], permutation=id, thinning=(#0..=#2) }
  217. Constant
  218. - ()
  219. Source materialize.public.t
  220. project=(#1)
  221. Target cluster: quickstart
  222. EOF
  223. query T multiline
  224. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT t1.a, array_agg(t1.c), array_agg(t2.c) FROM t t1 INNER JOIN t t2 ON t1.c = t2.c WHERE t1.c IS NOT NULL GROUP BY t1.a;
  225. ----
  226. Explained Query:
  227. With
  228. cte l0 =
  229. Get::Collection materialize.public.t
  230. raw=true
  231. Return
  232. Mfp
  233. project=(#0, #1, #1)
  234. input_key=#0
  235. Reduce::Basic
  236. aggr=(0, array_agg[order_by=[]](row(array[#1{c}])))
  237. val_plan
  238. project=(#2)
  239. map=(row(array[#1{c}]))
  240. key_plan
  241. project=(#0)
  242. Join::Linear
  243. linear_stage[0]
  244. closure
  245. project=(#1, #0)
  246. lookup={ relation=1, key=[#0{c}] }
  247. stream={ key=[#1{c}], thinning=(#0) }
  248. source={ relation=0, key=[#1{c}] }
  249. ArrangeBy
  250. raw=true
  251. arrangements[0]={ key=[#1{c}], permutation={#0: #1, #1: #0}, thinning=(#0) }
  252. types=[integer, text]
  253. Get::PassArrangements l0
  254. raw=true
  255. ArrangeBy
  256. raw=true
  257. arrangements[0]={ key=[#0{c}], permutation=id, thinning=() }
  258. types=[text]
  259. Get::Collection l0
  260. project=(#1)
  261. raw=true
  262. Source materialize.public.t
  263. project=(#0, #2)
  264. filter=((#2{c}) IS NOT NULL)
  265. Target cluster: quickstart
  266. EOF
  267. query T multiline
  268. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT sum(a), jsonb_agg(b), array_agg(b), array_agg(b) FROM t;
  269. ----
  270. Explained Query:
  271. With
  272. cte l0 =
  273. Reduce::Collation
  274. aggregate_types=[a, b, b]
  275. accumulable
  276. simple_aggrs[0]=(0, 0, sum(#0{a}))
  277. basic
  278. aggrs[0]=(1, jsonb_agg[order_by=[]](row(jsonbable_to_jsonb(#1{b}))))
  279. aggrs[1]=(2, array_agg[order_by=[]](row(array[#1{b}])))
  280. val_plan
  281. project=(#0, #2, #3)
  282. map=(row(jsonbable_to_jsonb(#1{b})), row(array[#1{b}]))
  283. key_plan
  284. project=()
  285. Get::Collection materialize.public.t
  286. raw=true
  287. Return
  288. Mfp
  289. project=(#0..=#2, #2)
  290. Union
  291. ArrangeBy
  292. input_key=[]
  293. raw=true
  294. Get::PassArrangements l0
  295. raw=false
  296. arrangements[0]={ key=[], permutation=id, thinning=(#0..=#2) }
  297. Mfp
  298. project=(#0..=#2)
  299. map=(null, null, null)
  300. Union consolidate_output=true
  301. Negate
  302. Get::Arrangement l0
  303. project=()
  304. key=
  305. raw=false
  306. arrangements[0]={ key=[], permutation=id, thinning=(#0..=#2) }
  307. Constant
  308. - ()
  309. Source materialize.public.t
  310. project=(#0, #1)
  311. Target cluster: quickstart
  312. EOF
  313. query T multiline
  314. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b ORDER BY b) FROM t GROUP BY a HAVING array_agg(b ORDER BY b) = array_agg(b ORDER BY b DESC);
  315. ----
  316. Explained Query:
  317. Reduce::Basic
  318. aggrs[0]=(0, array_agg[order_by=[#0 asc nulls_last]](row(array[#1{b}], #1{b})))
  319. aggrs[1]=(1, array_agg[order_by=[#0 desc nulls_first]](row(array[#1{b}], #1{b})))
  320. val_plan
  321. project=(#2, #2)
  322. map=(row(array[#1{b}], #1{b}))
  323. key_plan
  324. project=(#0)
  325. mfp_after
  326. project=(#0, #1)
  327. filter=((#1{"?column?"} = #2{"?column?"}))
  328. Get::Collection materialize.public.t
  329. raw=true
  330. Source materialize.public.t
  331. project=(#0, #1)
  332. Target cluster: quickstart
  333. EOF
  334. query T multiline
  335. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b), array_agg(sha256(b::BYTEA)) FROM t GROUP BY a;
  336. ----
  337. Explained Query:
  338. Reduce::Basic
  339. aggrs[0]=(0, array_agg[order_by=[]](row(array[#1{b}])))
  340. aggrs[1]=(1, array_agg[order_by=[]](row(array[digest(text_to_bytea(#1{b}), "sha256")])))
  341. val_plan
  342. project=(#2, #3)
  343. map=(row(array[#1{b}]), row(array[digest(text_to_bytea(#1{b}), "sha256")]))
  344. key_plan
  345. project=(#0)
  346. Get::Collection materialize.public.t
  347. raw=true
  348. Source materialize.public.t
  349. project=(#0, #1)
  350. Target cluster: quickstart
  351. EOF
  352. query T multiline
  353. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, array_agg(b), array_agg(CASE WHEN a = 1 THEN 'ooo' ELSE b END) FROM t GROUP BY a;
  354. ----
  355. Explained Query:
  356. Reduce::Basic
  357. aggrs[0]=(0, array_agg[order_by=[]](row(array[#1{b}])))
  358. aggrs[1]=(1, array_agg[order_by=[]](row(array[case when (#0{a} = 1) then "ooo" else #1{b} end])))
  359. val_plan
  360. project=(#2, #3)
  361. map=(row(array[#1{b}]), row(array[case when (#0{a} = 1) then "ooo" else #1{b} end]))
  362. key_plan
  363. project=(#0)
  364. Get::Collection materialize.public.t
  365. raw=true
  366. Source materialize.public.t
  367. project=(#0, #1)
  368. Target cluster: quickstart
  369. EOF
  370. query T multiline
  371. EXPLAIN PHYSICAL PLAN AS VERBOSE TEXT FOR SELECT a, dense_rank() OVER (ORDER BY a), array_agg(b) FROM t GROUP BY a;
  372. ----
  373. Explained Query:
  374. Mfp
  375. project=(#2, #4, #3)
  376. map=(record_get[1](#0), record_get[0](#1), record_get[1](#1), record_get[0](#0))
  377. input_key=
  378. Reduce::Basic
  379. aggr=(0, dense_rank[order_by=[#0 asc nulls_last]](row(list[row(#0, #1)], #0{a})), fused_unnest_list=true)
  380. val_plan
  381. project=(#2)
  382. map=(row(list[row(#0, #1)], #0{a}))
  383. key_plan
  384. project=()
  385. input_key=#0
  386. Reduce::Basic
  387. aggr=(0, array_agg[order_by=[]](row(array[#1{b}])))
  388. val_plan
  389. project=(#2)
  390. map=(row(array[#1{b}]))
  391. key_plan
  392. project=(#0)
  393. Get::Collection materialize.public.t
  394. raw=true
  395. Source materialize.public.t
  396. project=(#0, #1)
  397. Target cluster: quickstart
  398. EOF