aoc_1222.slt 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  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. # https://github.com/MaterializeInc/advent-of-code-2023/blob/main/week1/aoc_1222.md
  10. mode cockroach
  11. statement ok
  12. CREATE TABLE input (input TEXT);
  13. statement ok
  14. INSERT INTO input VALUES (
  15. '3,5,62~3,9,62
  16. 5,5,623~5,1,623
  17. 8,3,176~8,2,176
  18. 7,6,17~7,8,17
  19. 9,3,821~9,3,163
  20. 2,9,71~2,6,71
  21. 3,3,514~3,3,390
  22. 7,4,494~7,9,494
  23. 5,9,842~5,9,840
  24. 9,1,41~9,1,296
  25. 5,4,276~5,4,94
  26. 3,3,838~3,6,838
  27. 9,8,425~6,8,425
  28. 1,2,55~1,8,55
  29. 1,4,249~3,4,249
  30. 8,8,541~5,8,541
  31. 5,4,634~5,4,365
  32. 4,9,745~4,9,293
  33. 3,6,621~3,6,287
  34. 4,9,645~4,9,389
  35. 7,1,712~0,1,712
  36. 8,2,69~7,2,69
  37. 2,3,374~8,3,374
  38. 7,9,495~0,9,495
  39. 4,9,200~8,9,200');
  40. query II
  41. WITH MUTUALLY RECURSIVE
  42. lines(r INT, line TEXT) AS (
  43. SELECT r, regexp_split_to_array(input, '\n')[r] as line
  44. FROM input, generate_series(1, array_length(regexp_split_to_array(input, '\n'), 1)) r
  45. ),
  46. cells(r INT, x INT, y INT, z INT) AS (
  47. SELECT xs.r, x, y, z
  48. FROM (SELECT r, generate_series(regexp_split_to_array(regexp_split_to_array(line, '~')[1], ',')[1]::INT,
  49. regexp_split_to_array(regexp_split_to_array(line, '~')[2], ',')[1]::INT) x FROM lines) xs,
  50. (SELECT r, generate_series(regexp_split_to_array(regexp_split_to_array(line, '~')[1], ',')[2]::INT,
  51. regexp_split_to_array(regexp_split_to_array(line, '~')[2], ',')[2]::INT) y FROM lines) ys,
  52. (SELECT r, generate_series(regexp_split_to_array(regexp_split_to_array(line, '~')[1], ',')[3]::INT,
  53. regexp_split_to_array(regexp_split_to_array(line, '~')[2], ',')[3]::INT) z FROM lines) zs
  54. WHERE xs.r = ys.r
  55. AND xs.r = zs.r
  56. ),
  57. -- Part one: let the pieces fall, with a minimum z value of one.
  58. parts(r INT, x INT, y INT, z INT) AS (
  59. SELECT * FROM cells
  60. EXCEPT ALL SELECT * FROM cells_delayed
  61. UNION ALL
  62. SELECT r, x, y, CASE WHEN r IN (SELECT * FROM supported) THEN z ELSE z - 1 END
  63. FROM parts
  64. ),
  65. -- One piece supports a *different* piece if it is directly below a piece of the other.
  66. supports(r1 INT, r2 INT) AS (
  67. SELECT DISTINCT p1.r, p2.r
  68. FROM parts p1, parts p2
  69. WHERE p1.x = p2.x
  70. AND p1.y = p2.y
  71. AND p1.z + 1 = p2.z
  72. AND p1.r != p2.r
  73. ),
  74. supported(r INT) AS (
  75. SELECT r FROM parts WHERE z = 1
  76. UNION
  77. SELECT r2 FROM supports
  78. ),
  79. -- A piece is safe to remove if it is does not uniquely support any other piece.
  80. part1(part1 BIGINT) AS (
  81. SELECT COUNT(DISTINCT r)
  82. FROM lines
  83. WHERE r NOT IN (
  84. SELECT r1
  85. FROM supports
  86. WHERE r2 IN (
  87. SELECT r2
  88. FROM supports
  89. GROUP BY r2
  90. HAVING COUNT(*) = 1
  91. )
  92. )
  93. ),
  94. cells_delayed(r INT, x INT, y INT, z INT) AS ( SELECT * FROM cells ),
  95. -- Part two: for each piece, how many pieces would fall if you removed it?
  96. -- Extend `supports` to transitive support: if r1 vanished would r2 fall?
  97. supports_trans(r1 INT, r2 INT) AS (
  98. -- Uniquely supported pieces would certainly fall.
  99. SELECT *
  100. FROM supports
  101. WHERE r2 IN (SELECT r2 FROM supports GROUP BY r2 HAVING COUNT(*) = 1)
  102. -- Any piece all of whose supports would fall without 'a' also falls without it.
  103. UNION
  104. SELECT st.r1, s1.r2
  105. FROM supports_trans st, supports s1
  106. WHERE st.r2 = s1.r1
  107. GROUP BY st.r1, s1.r2
  108. HAVING COUNT(*) = (SELECT COUNT(*) FROM supports WHERE supports.r2 = s1.r2)
  109. ),
  110. part2(part2 BIGINT) AS (SELECT COUNT(*) FROM supports_trans)
  111. SELECT * FROM part1, part2;
  112. ----
  113. 23 3
  114. query T multiline
  115. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR
  116. WITH MUTUALLY RECURSIVE
  117. lines(r INT, line TEXT) AS (
  118. SELECT r, regexp_split_to_array(input, '\n')[r] as line
  119. FROM input, generate_series(1, array_length(regexp_split_to_array(input, '\n'), 1)) r
  120. ),
  121. cells(r INT, x INT, y INT, z INT) AS (
  122. SELECT xs.r, x, y, z
  123. FROM (SELECT r, generate_series(regexp_split_to_array(regexp_split_to_array(line, '~')[1], ',')[1]::INT,
  124. regexp_split_to_array(regexp_split_to_array(line, '~')[2], ',')[1]::INT) x FROM lines) xs,
  125. (SELECT r, generate_series(regexp_split_to_array(regexp_split_to_array(line, '~')[1], ',')[2]::INT,
  126. regexp_split_to_array(regexp_split_to_array(line, '~')[2], ',')[2]::INT) y FROM lines) ys,
  127. (SELECT r, generate_series(regexp_split_to_array(regexp_split_to_array(line, '~')[1], ',')[3]::INT,
  128. regexp_split_to_array(regexp_split_to_array(line, '~')[2], ',')[3]::INT) z FROM lines) zs
  129. WHERE xs.r = ys.r
  130. AND xs.r = zs.r
  131. ),
  132. -- Part one: let the pieces fall, with a minimum z value of one.
  133. parts(r INT, x INT, y INT, z INT) AS (
  134. SELECT * FROM cells
  135. EXCEPT ALL SELECT * FROM cells_delayed
  136. UNION ALL
  137. SELECT r, x, y, CASE WHEN r IN (SELECT * FROM supported) THEN z ELSE z - 1 END
  138. FROM parts
  139. ),
  140. -- One piece supports a *different* piece if it is directly below a piece of the other.
  141. supports(r1 INT, r2 INT) AS (
  142. SELECT DISTINCT p1.r, p2.r
  143. FROM parts p1, parts p2
  144. WHERE p1.x = p2.x
  145. AND p1.y = p2.y
  146. AND p1.z + 1 = p2.z
  147. AND p1.r != p2.r
  148. ),
  149. supported(r INT) AS (
  150. SELECT r FROM parts WHERE z = 1
  151. UNION
  152. SELECT r2 FROM supports
  153. ),
  154. -- A piece is safe to remove if it is does not uniquely support any other piece.
  155. part1(part1 BIGINT) AS (
  156. SELECT COUNT(DISTINCT r)
  157. FROM lines
  158. WHERE r NOT IN (
  159. SELECT r1
  160. FROM supports
  161. WHERE r2 IN (
  162. SELECT r2
  163. FROM supports
  164. GROUP BY r2
  165. HAVING COUNT(*) = 1
  166. )
  167. )
  168. ),
  169. cells_delayed(r INT, x INT, y INT, z INT) AS ( SELECT * FROM cells ),
  170. -- Part two: for each piece, how many pieces would fall if you removed it?
  171. -- Extend `supports` to transitive support: if r1 vanished would r2 fall?
  172. supports_trans(r1 INT, r2 INT) AS (
  173. -- Uniquely supported pieces would certainly fall.
  174. SELECT *
  175. FROM supports
  176. WHERE r2 IN (SELECT r2 FROM supports GROUP BY r2 HAVING COUNT(*) = 1)
  177. -- Any piece all of whose supports would fall without 'a' also falls without it.
  178. UNION
  179. SELECT st.r1, s1.r2
  180. FROM supports_trans st, supports s1
  181. WHERE st.r2 = s1.r1
  182. GROUP BY st.r1, s1.r2
  183. HAVING COUNT(*) = (SELECT COUNT(*) FROM supports WHERE supports.r2 = s1.r2)
  184. ),
  185. part2(part2 BIGINT) AS (SELECT COUNT(*) FROM supports_trans)
  186. SELECT * FROM part1, part2;
  187. ----
  188. Explained Query:
  189. With
  190. cte l0 =
  191. Project (#1, #2) // { arity: 2 }
  192. Map (array_index(regexp_split_to_array["\n", case_insensitive=false](#0{input}), integer_to_bigint(#1{r}))) // { arity: 3 }
  193. FlatMap generate_series(1, (regexp_split_to_array["\n", case_insensitive=false](#0{input}) array_length 1), 1) // { arity: 2 }
  194. ReadStorage materialize.public.input // { arity: 1 }
  195. cte l1 =
  196. Project (#0) // { arity: 1 }
  197. Get l0 // { arity: 2 }
  198. cte l2 =
  199. Distinct project=[#0] // { arity: 1 }
  200. Get l1 // { arity: 1 }
  201. cte l3 =
  202. Project (#0, #1, #3, #5) // { arity: 4 }
  203. Join on=(#0{r} = #2{r} = #4{r}) type=delta // { arity: 6 }
  204. implementation
  205. %0 » %1[#0{r}]K » %2[#0{r}]K
  206. %1 » %0[#0{r}]K » %2[#0{r}]K
  207. %2 » %0[#0{r}]K » %1[#0{r}]K
  208. ArrangeBy keys=[[#0{r}]] // { arity: 2 }
  209. Project (#0, #2) // { arity: 2 }
  210. FlatMap generate_series(text_to_integer(array_index(regexp_split_to_array[",", case_insensitive=false](array_index(regexp_split_to_array["~", case_insensitive=false](#1{line}), 1)), 1)), text_to_integer(array_index(regexp_split_to_array[",", case_insensitive=false](array_index(regexp_split_to_array["~", case_insensitive=false](#1{line}), 2)), 1)), 1) // { arity: 3 }
  211. Get l0 // { arity: 2 }
  212. ArrangeBy keys=[[#0{r}]] // { arity: 2 }
  213. Project (#0, #2) // { arity: 2 }
  214. FlatMap generate_series(text_to_integer(array_index(regexp_split_to_array[",", case_insensitive=false](array_index(regexp_split_to_array["~", case_insensitive=false](#1{line}), 1)), 2)), text_to_integer(array_index(regexp_split_to_array[",", case_insensitive=false](array_index(regexp_split_to_array["~", case_insensitive=false](#1{line}), 2)), 2)), 1) // { arity: 3 }
  215. Get l0 // { arity: 2 }
  216. ArrangeBy keys=[[#0{r}]] // { arity: 2 }
  217. Project (#0, #2) // { arity: 2 }
  218. FlatMap generate_series(text_to_integer(array_index(regexp_split_to_array[",", case_insensitive=false](array_index(regexp_split_to_array["~", case_insensitive=false](#1{line}), 1)), 3)), text_to_integer(array_index(regexp_split_to_array[",", case_insensitive=false](array_index(regexp_split_to_array["~", case_insensitive=false](#1{line}), 2)), 3)), 1) // { arity: 3 }
  219. Get l0 // { arity: 2 }
  220. Return // { arity: 2 }
  221. With Mutually Recursive
  222. cte l4 =
  223. Distinct project=[#0] // { arity: 1 }
  224. Project (#0) // { arity: 1 }
  225. Get l9 // { arity: 4 }
  226. cte l5 =
  227. Reduce group_by=[#0] aggregates=[any((#0{r} = #1{right_col0_0}))] // { arity: 2 }
  228. CrossJoin type=differential // { arity: 2 }
  229. implementation
  230. %0:l4[×] » %1:l12[×]
  231. ArrangeBy keys=[[]] // { arity: 1 }
  232. Get l4 // { arity: 1 }
  233. ArrangeBy keys=[[]] // { arity: 1 }
  234. Get l12 // { arity: 1 }
  235. cte l6 =
  236. ArrangeBy keys=[[#0]] // { arity: 1 }
  237. Get l4 // { arity: 1 }
  238. cte l7 =
  239. Union // { arity: 2 }
  240. Get l5 // { arity: 2 }
  241. Project (#0, #2) // { arity: 2 }
  242. Map (false) // { arity: 3 }
  243. Join on=(#0 = #1) type=differential // { arity: 2 }
  244. implementation
  245. %1:l6[#0]UK » %0[#0]K
  246. ArrangeBy keys=[[#0]] // { arity: 1 }
  247. Union // { arity: 1 }
  248. Negate // { arity: 1 }
  249. Project (#0) // { arity: 1 }
  250. Get l5 // { arity: 2 }
  251. Get l4 // { arity: 1 }
  252. Get l6 // { arity: 1 }
  253. cte l8 =
  254. Union // { arity: 2 }
  255. Get l7 // { arity: 2 }
  256. Project (#0, #2) // { arity: 2 }
  257. FlatMap guard_subquery_size(#1{count}) // { arity: 3 }
  258. Reduce group_by=[#0] aggregates=[count(*)] // { arity: 2 }
  259. Project (#0) // { arity: 1 }
  260. Get l7 // { arity: 2 }
  261. cte l9 =
  262. Union // { arity: 4 }
  263. Threshold // { arity: 4 }
  264. Union // { arity: 4 }
  265. Get l3 // { arity: 4 }
  266. Negate // { arity: 4 }
  267. Get l16 // { arity: 4 }
  268. Project (#0..=#2, #6) // { arity: 4 }
  269. Map (case when #5{any} then #3{z} else (#3{z} - 1) end) // { arity: 7 }
  270. Join on=(#0 = #4) type=differential // { arity: 6 }
  271. implementation
  272. %0:l9[#0]K » %1[#0]K
  273. ArrangeBy keys=[[#0]] // { arity: 4 }
  274. Get l9 // { arity: 4 }
  275. ArrangeBy keys=[[#0]] // { arity: 2 }
  276. Union // { arity: 2 }
  277. Get l8 // { arity: 2 }
  278. Project (#0, #2) // { arity: 2 }
  279. Map (null) // { arity: 3 }
  280. Join on=(#0 = #1) type=differential // { arity: 2 }
  281. implementation
  282. %1:l6[#0]UK » %0[#0]K
  283. ArrangeBy keys=[[#0]] // { arity: 1 }
  284. Union // { arity: 1 }
  285. Negate // { arity: 1 }
  286. Distinct project=[#0] // { arity: 1 }
  287. Project (#0) // { arity: 1 }
  288. Get l8 // { arity: 2 }
  289. Get l4 // { arity: 1 }
  290. Get l6 // { arity: 1 }
  291. cte l10 =
  292. Distinct project=[#0, #1] // { arity: 2 }
  293. Project (#0, #4) // { arity: 2 }
  294. Filter (#0{r} != #4{r}) // { arity: 8 }
  295. Join on=(#1{x} = #5{x} AND #2{y} = #6{y} AND #7{z} = (#3{z} + 1)) type=differential // { arity: 8 }
  296. implementation
  297. %0:l9[#1{x}, #2{y}, (#3{z} + 1)]KKK » %1:l9[#1{x}..=#3{z}]KKK
  298. ArrangeBy keys=[[#1{x}, #2{y}, (#3{z} + 1)]] // { arity: 4 }
  299. Get l9 // { arity: 4 }
  300. ArrangeBy keys=[[#1{x}..=#3{z}]] // { arity: 4 }
  301. Get l9 // { arity: 4 }
  302. cte l11 =
  303. Project (#1) // { arity: 1 }
  304. Get l10 // { arity: 2 }
  305. cte l12 =
  306. Distinct project=[#0] // { arity: 1 }
  307. Union // { arity: 1 }
  308. Project (#0) // { arity: 1 }
  309. Filter (#3{z} = 1) // { arity: 4 }
  310. Get l9 // { arity: 4 }
  311. Get l11 // { arity: 1 }
  312. cte l13 =
  313. CrossJoin type=differential // { arity: 3 }
  314. implementation
  315. %0:l2[×] » %1:l10[×]
  316. ArrangeBy keys=[[]] // { arity: 1 }
  317. Get l2 // { arity: 1 }
  318. ArrangeBy keys=[[]] // { arity: 2 }
  319. Get l10 // { arity: 2 }
  320. cte l14 =
  321. ArrangeBy keys=[[#0]] // { arity: 1 }
  322. Get l11 // { arity: 1 }
  323. cte l15 =
  324. Reduce aggregates=[count(distinct #0{r})] // { arity: 1 }
  325. Project (#0) // { arity: 1 }
  326. Join on=(#0 = #1) type=differential // { arity: 2 }
  327. implementation
  328. %0:l1[#0]K » %1[#0]K
  329. ArrangeBy keys=[[#0]] // { arity: 1 }
  330. Get l1 // { arity: 1 }
  331. ArrangeBy keys=[[#0]] // { arity: 1 }
  332. Union // { arity: 1 }
  333. Negate // { arity: 1 }
  334. Distinct project=[#0] // { arity: 1 }
  335. Project (#0) // { arity: 1 }
  336. Filter (#3{count} = 1) // { arity: 4 }
  337. Join on=(#1 = #2) type=differential // { arity: 4 }
  338. implementation
  339. %1[#0]UKAef » %0:l13[#1]Kef
  340. ArrangeBy keys=[[#1]] // { arity: 2 }
  341. Project (#0, #2) // { arity: 2 }
  342. Filter (#0 = #1) // { arity: 3 }
  343. Get l13 // { arity: 3 }
  344. ArrangeBy keys=[[#0]] // { arity: 2 }
  345. Reduce group_by=[#0] aggregates=[count(*)] // { arity: 2 }
  346. Project (#0) // { arity: 1 }
  347. Join on=(#0 = #1) type=differential // { arity: 2 }
  348. implementation
  349. %0[#0]UKA » %1:l14[#0]K
  350. ArrangeBy keys=[[#0]] // { arity: 1 }
  351. Distinct project=[#0] // { arity: 1 }
  352. Project (#2) // { arity: 1 }
  353. Get l13 // { arity: 3 }
  354. Get l14 // { arity: 1 }
  355. Get l2 // { arity: 1 }
  356. cte l16 =
  357. Get l3 // { arity: 4 }
  358. cte l17 =
  359. Reduce group_by=[#0, #1] aggregates=[count(*)] // { arity: 3 }
  360. Project (#0, #3) // { arity: 2 }
  361. Join on=(#1{r2} = #2{r1}) type=differential // { arity: 4 }
  362. implementation
  363. %0:l22[#1{r2}]K » %1:l10[#0{r1}]K
  364. ArrangeBy keys=[[#1{r2}]] // { arity: 2 }
  365. Get l22 // { arity: 2 }
  366. ArrangeBy keys=[[#0{r1}]] // { arity: 2 }
  367. Get l10 // { arity: 2 }
  368. cte l18 =
  369. Distinct project=[#0] // { arity: 1 }
  370. Project (#1) // { arity: 1 }
  371. Get l17 // { arity: 3 }
  372. cte l19 =
  373. ArrangeBy keys=[[#0{r2}]] // { arity: 1 }
  374. Get l18 // { arity: 1 }
  375. cte l20 =
  376. Reduce group_by=[#0] aggregates=[count(*)] // { arity: 2 }
  377. Project (#0) // { arity: 1 }
  378. Join on=(#0{r2} = #1{r2}) type=differential // { arity: 2 }
  379. implementation
  380. %0:l19[#0{r2}]UK » %1:l14[#0{r2}]K
  381. Get l19 // { arity: 1 }
  382. Get l14 // { arity: 1 }
  383. cte l21 =
  384. Union // { arity: 2 }
  385. Get l20 // { arity: 2 }
  386. Project (#0, #2) // { arity: 2 }
  387. Map (0) // { arity: 3 }
  388. Join on=(#0 = #1) type=differential // { arity: 2 }
  389. implementation
  390. %1:l19[#0]UK » %0[#0]K
  391. ArrangeBy keys=[[#0]] // { arity: 1 }
  392. Union // { arity: 1 }
  393. Negate // { arity: 1 }
  394. Project (#0) // { arity: 1 }
  395. Get l20 // { arity: 2 }
  396. Get l18 // { arity: 1 }
  397. Get l19 // { arity: 1 }
  398. cte l22 =
  399. Distinct project=[#0, #1] // { arity: 2 }
  400. Union // { arity: 2 }
  401. Project (#0, #1) // { arity: 2 }
  402. Filter (#3{count} = 1) // { arity: 4 }
  403. Join on=(#1 = #2) type=differential // { arity: 4 }
  404. implementation
  405. %1[#0]UKAef » %0:l10[#1]Kef
  406. ArrangeBy keys=[[#1]] // { arity: 2 }
  407. Get l10 // { arity: 2 }
  408. ArrangeBy keys=[[#0]] // { arity: 2 }
  409. Reduce group_by=[#0] aggregates=[count(*)] // { arity: 2 }
  410. Get l11 // { arity: 1 }
  411. Project (#0, #1) // { arity: 2 }
  412. Join on=(#1 = #3 AND #2{count} = #4{count}) type=differential // { arity: 5 }
  413. implementation
  414. %0:l17[#1, #2{"?column?"}]KK » %1[#0, #1]KK
  415. ArrangeBy keys=[[#1, #2{count}]] // { arity: 3 }
  416. Get l17 // { arity: 3 }
  417. ArrangeBy keys=[[#0, #1{count}]] // { arity: 2 }
  418. Union // { arity: 2 }
  419. Get l21 // { arity: 2 }
  420. Project (#0, #2) // { arity: 2 }
  421. FlatMap guard_subquery_size(#1{count}) // { arity: 3 }
  422. Reduce group_by=[#0] aggregates=[count(*)] // { arity: 2 }
  423. Project (#0) // { arity: 1 }
  424. Get l21 // { arity: 2 }
  425. Return // { arity: 2 }
  426. With
  427. cte l23 =
  428. Reduce aggregates=[count(*)] // { arity: 1 }
  429. Project () // { arity: 0 }
  430. Get l22 // { arity: 2 }
  431. Return // { arity: 2 }
  432. CrossJoin type=differential // { arity: 2 }
  433. implementation
  434. %0[×]U » %1[×]U
  435. ArrangeBy keys=[[]] // { arity: 1 }
  436. Union // { arity: 1 }
  437. Get l15 // { arity: 1 }
  438. Map (0) // { arity: 1 }
  439. Union // { arity: 0 }
  440. Negate // { arity: 0 }
  441. Project () // { arity: 0 }
  442. Get l15 // { arity: 1 }
  443. Constant // { arity: 0 }
  444. - ()
  445. ArrangeBy keys=[[]] // { arity: 1 }
  446. Union // { arity: 1 }
  447. Get l23 // { arity: 1 }
  448. Map (0) // { arity: 1 }
  449. Union // { arity: 0 }
  450. Negate // { arity: 0 }
  451. Project () // { arity: 0 }
  452. Get l23 // { arity: 1 }
  453. Constant // { arity: 0 }
  454. - ()
  455. Source materialize.public.input
  456. Target cluster: quickstart
  457. EOF