materializations.td 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  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. $ set-arg-default default-replica-size=1
  10. $ set-arg-default single-replica-cluster=quickstart
  11. # Test creating and dropping various views and sources that depend upon
  12. # on another, and indices on those views and sources.
  13. $ set schema={
  14. "type": "record",
  15. "name": "row",
  16. "fields": [
  17. {"name": "a", "type": "long"},
  18. {"name": "b", "type": "long"}
  19. ]
  20. }
  21. $ kafka-create-topic topic=data
  22. > CREATE CONNECTION kafka_conn
  23. TO KAFKA (BROKER '${testdrive.kafka-addr}', SECURITY PROTOCOL PLAINTEXT);
  24. > CREATE CONNECTION IF NOT EXISTS csr_conn TO CONFLUENT SCHEMA REGISTRY (
  25. URL '${testdrive.schema-registry-url}'
  26. );
  27. > CREATE SOURCE data
  28. IN CLUSTER ${arg.single-replica-cluster}
  29. FROM KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-data-${testdrive.seed}')
  30. > CREATE TABLE data_tbl FROM SOURCE data (REFERENCE "testdrive-data-${testdrive.seed}")
  31. FORMAT AVRO USING SCHEMA '${schema}'
  32. > SELECT * FROM data_tbl
  33. > CREATE VIEW data_view as SELECT * from data_tbl
  34. > SELECT * FROM data_view
  35. > CREATE MATERIALIZED VIEW test1 AS
  36. SELECT b, sum(a) FROM data_tbl GROUP BY b
  37. > SHOW VIEWS
  38. name comment
  39. ------------------
  40. data_view ""
  41. > SHOW MATERIALIZED VIEWS
  42. name cluster comment
  43. ---------------------------
  44. test1 quickstart ""
  45. > SELECT * FROM test1
  46. b sum
  47. ------
  48. $ kafka-ingest format=avro topic=data schema=${schema} timestamp=1
  49. {"a": 1, "b": 1}
  50. {"a": 2, "b": 1}
  51. {"a": 3, "b": 1}
  52. {"a": 1, "b": 2}
  53. > SELECT * FROM test1
  54. b sum
  55. ------
  56. 1 6
  57. 2 1
  58. > SHOW COLUMNS FROM test1
  59. name nullable type comment
  60. ------------------------------
  61. b false bigint ""
  62. sum false numeric ""
  63. > SHOW VIEWS LIKE '%data%'
  64. data_view ""
  65. > SHOW CREATE MATERIALIZED VIEW test1
  66. name create_sql
  67. -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  68. materialize.public.test1 "CREATE MATERIALIZED VIEW materialize.public.test1\n IN CLUSTER quickstart\n WITH (REFRESH = ON COMMIT)\n AS SELECT b, pg_catalog.sum(a) FROM materialize.public.data_tbl GROUP BY b;"
  69. # Materialized view can be built on a not-materialized view.
  70. > CREATE MATERIALIZED VIEW test2 AS
  71. SELECT b, 1 + sum(a + 1) FROM data_view GROUP BY b
  72. > SELECT * FROM test2
  73. b ?column?
  74. -----------
  75. 1 10
  76. 2 3
  77. # Materialize data_view.
  78. > CREATE DEFAULT INDEX ON data_view
  79. > SELECT * FROM data_view
  80. a b
  81. ----
  82. 1 1
  83. 2 1
  84. 3 1
  85. 1 2
  86. > CREATE VIEW test3 AS
  87. SELECT b, min(a) FROM data_view GROUP BY b
  88. > SELECT * FROM test3
  89. b min
  90. ------
  91. 1 1
  92. 2 1
  93. > CREATE MATERIALIZED VIEW test4 AS
  94. SELECT b, max(a) FROM data_view GROUP BY b
  95. > SELECT * FROM test4
  96. b max
  97. ------
  98. 1 3
  99. 2 1
  100. # Unmaterialize data view.
  101. > DROP INDEX data_view_primary_idx
  102. # Can continue to select from view that depends on the unmaterialized view.
  103. > SELECT * FROM test4
  104. b max
  105. ------
  106. 1 3
  107. 2 1
  108. > SELECT * FROM test4 where b = 2
  109. b max
  110. ------
  111. 2 1
  112. > SELECT * from data_view
  113. a b
  114. ----
  115. 1 1
  116. 2 1
  117. 3 1
  118. 1 2
  119. # Cannot create sink from unmaterialized view.
  120. ! CREATE SINK not_mat_sink2
  121. IN CLUSTER ${arg.single-replica-cluster}
  122. FROM data_view
  123. INTO KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-data-view2-sink-${testdrive.seed}')
  124. FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY CONNECTION csr_conn
  125. ENVELOPE DEBEZIUM
  126. contains:data_view is a view, which cannot be exported as a sink
  127. # Can create indexed view from unmaterialized view.
  128. > CREATE VIEW test5 AS
  129. SELECT b, max(a) AS c FROM data_view GROUP BY b
  130. > CREATE DEFAULT INDEX ON test5
  131. # or from an indexed unmaterialized view
  132. ! CREATE SINK not_mat_sink2
  133. IN CLUSTER ${arg.single-replica-cluster}
  134. FROM test5
  135. INTO KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-data-view2-sink-${testdrive.seed}')
  136. FORMAT AVRO USING CONFLUENT SCHEMA REGISTRY CONNECTION csr_conn
  137. ENVELOPE DEBEZIUM
  138. contains:test5 is a view, which cannot be exported as a sink
  139. $ set-regex match=(\s\(u\d+\)) replacement=
  140. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM test5;
  141. Explained Query (fast path):
  142. ReadIndex on=materialize.public.test5 test5_primary_idx=[*** full scan ***]
  143. Used Indexes:
  144. - materialize.public.test5_primary_idx (*** full scan ***)
  145. Target cluster: quickstart
  146. > SELECT * FROM test5
  147. b c
  148. ------
  149. 1 3
  150. 2 1
  151. > SELECT c+b from test5
  152. 4
  153. 3
  154. > CREATE INDEX idx1 ON test5(c)
  155. ! SELECT * FROM idx1
  156. contains:catalog item 'materialize.public.idx1' is an index and so cannot be depended upon
  157. # If there exists a second primary index, dropping one primary index will not
  158. # unmaterialize the view.
  159. > DROP INDEX test5_primary_idx
  160. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM test5
  161. Explained Query (fast path):
  162. Project (#1, #0)
  163. ReadIndex on=materialize.public.test5 idx1=[*** full scan ***]
  164. Used Indexes:
  165. - materialize.public.idx1 (*** full scan ***)
  166. Target cluster: quickstart
  167. > SELECT * from test5
  168. b c
  169. ------
  170. 1 3
  171. 2 1
  172. > SELECT c-b from test5
  173. 2
  174. -1
  175. # Unmaterialize test5.
  176. > DROP INDEX idx1
  177. # Still works.
  178. > SELECT * from test5
  179. b c
  180. ------
  181. 1 3
  182. 2 1
  183. # Test that materialized views can be even if it requires multiple layers of
  184. # recursing through the AST to find a source.
  185. > CREATE MATERIALIZED VIEW test6 AS SELECT (-c + 2*b) AS d FROM test5
  186. > SELECT * from test6
  187. d
  188. ----
  189. -1
  190. 3
  191. # Dependencies are still queryable after creating a dependent
  192. # materialized view.
  193. > SELECT * from test5
  194. b c
  195. ------
  196. 1 3
  197. 2 1
  198. > SELECT * from data_view
  199. a b
  200. ----
  201. 1 1
  202. 2 1
  203. 3 1
  204. 1 2
  205. # Rematerialize data_view creating an index on it.
  206. > CREATE INDEX data_view_idx on data_view(a)
  207. > SELECT * from data_view
  208. a b
  209. ---
  210. 1 1
  211. 2 1
  212. 3 1
  213. 1 2
  214. # Existing materialized dependencies can be selected from as normal.
  215. > SELECT * from test6
  216. d
  217. ----
  218. -1
  219. 3
  220. # Dependencies can be selected from again if they do not depend on any other raw
  221. # source.
  222. > SELECT * from test5
  223. b c
  224. ------
  225. 1 3
  226. 2 1
  227. # Create a suboptimal second index on the same column in data_view.
  228. > CREATE INDEX data_view_idx2 on data_view(a)
  229. > SELECT * from data_view
  230. a b
  231. ---
  232. 1 1
  233. 2 1
  234. 3 1
  235. 1 2
  236. > SELECT * from test6
  237. d
  238. ----
  239. -1
  240. 3
  241. > SELECT * from test5
  242. b c
  243. ------
  244. 1 3
  245. 2 1
  246. # Delete the first copy of the same index and ensure everything selects as
  247. # normal.
  248. > DROP INDEX data_view_idx
  249. > SELECT * from data_view
  250. a b
  251. ---
  252. 1 1
  253. 2 1
  254. 3 1
  255. 1 2
  256. > SELECT * from test6
  257. d
  258. ----
  259. -1
  260. 3
  261. > SELECT * from test5
  262. b c
  263. ------
  264. 1 3
  265. 2 1
  266. # Materialized sources tests
  267. $ kafka-create-topic topic=mat
  268. > CREATE SOURCE mat_data
  269. IN CLUSTER ${arg.single-replica-cluster}
  270. FROM KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-mat-${testdrive.seed}')
  271. > CREATE TABLE mat_data_tbl FROM SOURCE mat_data (REFERENCE "testdrive-mat-${testdrive.seed}")
  272. FORMAT AVRO USING SCHEMA '${schema}'
  273. > CREATE DEFAULT INDEX ON mat_data
  274. > SELECT * from mat_data_tbl
  275. $ kafka-ingest format=avro topic=mat schema=${schema} timestamp=1
  276. {"a": -1, "b": 0}
  277. {"a": -1, "b": 1}
  278. {"a": 3, "b": 4}
  279. {"a": 1, "b": 2}
  280. > SELECT * from mat_data_tbl
  281. a b
  282. ----
  283. -1 0
  284. -1 1
  285. 3 4
  286. 1 2
  287. > SHOW SOURCES
  288. name type cluster comment
  289. -------------------------------------------------------------------
  290. data kafka ${arg.single-replica-cluster} ""
  291. data_progress progress <null> ""
  292. mat_data kafka ${arg.single-replica-cluster} ""
  293. mat_data_progress progress <null> ""
  294. # If there exists another index, dropping the primary index will not #
  295. # unmaterialize the source. This also tests creating a default index when the
  296. # default index name is already taken.
  297. > CREATE DEFAULT INDEX ON mat_data
  298. > DROP INDEX mat_data_primary_idx
  299. > SELECT a+b from mat_data_tbl
  300. -1
  301. 0
  302. 7
  303. 3
  304. # Can create both materialized and unmaterialized views from materialized
  305. # source.
  306. > CREATE MATERIALIZED VIEW test7 as SELECT count(*) from mat_data_tbl
  307. > SELECT * from test7
  308. count
  309. -----
  310. 4
  311. > CREATE VIEW test8 as SELECT -b as c, -a as d from mat_data_tbl
  312. > SELECT * from test8
  313. c d
  314. -----
  315. 0 1
  316. -1 1
  317. -4 -3
  318. -2 -1
  319. # Unmaterialize source.
  320. > DROP INDEX mat_data_primary_idx1
  321. # Still works.
  322. > SELECT * from mat_data_tbl
  323. a b
  324. ----
  325. -1 0
  326. -1 1
  327. 3 4
  328. 1 2
  329. > SELECT * from test7
  330. count
  331. -----
  332. 4
  333. > SELECT * from test8
  334. c d
  335. -----
  336. 0 1
  337. -1 1
  338. -4 -3
  339. -2 -1
  340. $ kafka-ingest format=avro topic=mat schema=${schema} timestamp=2
  341. {"a": -3, "b": 0}
  342. {"a": -1, "b": 0}
  343. {"a": 0, "b": 4}
  344. {"a": 1, "b": 2}
  345. # Rematerialize source.
  346. > CREATE INDEX mat_data_idx3 on mat_data_tbl(b)
  347. > SELECT * from mat_data_tbl
  348. a b
  349. ----
  350. -1 0
  351. -1 1
  352. 3 4
  353. 1 2
  354. -3 0
  355. -1 0
  356. 0 4
  357. 1 2
  358. > SELECT * from test7
  359. count
  360. -----
  361. 8
  362. > SELECT * from test8
  363. c d
  364. ------
  365. 0 1
  366. -1 1
  367. -4 -3
  368. -2 -1
  369. 0 3
  370. 0 1
  371. -4 0
  372. -2 -1
  373. # Check arrangements, seeing new arrangements can mean a significant increase
  374. # in memory consumptions and should be understood before adapting the values.
  375. > SET cluster_replica = r1
  376. > SELECT mdod.dataflow_name, mdod.name
  377. FROM mz_introspection.mz_arrangement_sharing mash
  378. JOIN mz_introspection.mz_dataflow_operator_dataflows mdod ON mash.operator_id = mdod.id
  379. JOIN mz_introspection.mz_compute_exports USING (dataflow_id)
  380. WHERE export_id LIKE 'u%'
  381. "Dataflow: materialize.public.test4" "Arrange ReduceMinsMaxes"
  382. "Dataflow: materialize.public.test4" "Arranged MinsMaxesHierarchical input"
  383. "Dataflow: materialize.public.test4" "Arranged MinsMaxesHierarchical input"
  384. "Dataflow: materialize.public.test4" "Arranged MinsMaxesHierarchical input"
  385. "Dataflow: materialize.public.test4" "Arranged MinsMaxesHierarchical input"
  386. "Dataflow: materialize.public.test4" "Arranged MinsMaxesHierarchical input"
  387. "Dataflow: materialize.public.test4" "Arranged MinsMaxesHierarchical input"
  388. "Dataflow: materialize.public.test4" "Arranged MinsMaxesHierarchical input"
  389. "Dataflow: materialize.public.test4" ReduceMinsMaxes
  390. "Dataflow: materialize.public.test4" "Reduced Fallibly MinsMaxesHierarchical"
  391. "Dataflow: materialize.public.test4" "Reduced Fallibly MinsMaxesHierarchical"
  392. "Dataflow: materialize.public.test4" "Reduced Fallibly MinsMaxesHierarchical"
  393. "Dataflow: materialize.public.test4" "Reduced Fallibly MinsMaxesHierarchical"
  394. "Dataflow: materialize.public.test4" "Reduced Fallibly MinsMaxesHierarchical"
  395. "Dataflow: materialize.public.test4" "Reduced Fallibly MinsMaxesHierarchical"
  396. "Dataflow: materialize.public.test4" "Reduced Fallibly MinsMaxesHierarchical"
  397. "Dataflow: materialize.public.test6" "Arrange ReduceMinsMaxes"
  398. "Dataflow: materialize.public.test6" "Arranged MinsMaxesHierarchical input"
  399. "Dataflow: materialize.public.test6" "Arranged MinsMaxesHierarchical input"
  400. "Dataflow: materialize.public.test6" "Arranged MinsMaxesHierarchical input"
  401. "Dataflow: materialize.public.test6" "Arranged MinsMaxesHierarchical input"
  402. "Dataflow: materialize.public.test6" "Arranged MinsMaxesHierarchical input"
  403. "Dataflow: materialize.public.test6" "Arranged MinsMaxesHierarchical input"
  404. "Dataflow: materialize.public.test6" "Arranged MinsMaxesHierarchical input"
  405. "Dataflow: materialize.public.test6" ReduceMinsMaxes
  406. "Dataflow: materialize.public.test6" "Reduced Fallibly MinsMaxesHierarchical"
  407. "Dataflow: materialize.public.test6" "Reduced Fallibly MinsMaxesHierarchical"
  408. "Dataflow: materialize.public.test6" "Reduced Fallibly MinsMaxesHierarchical"
  409. "Dataflow: materialize.public.test6" "Reduced Fallibly MinsMaxesHierarchical"
  410. "Dataflow: materialize.public.test6" "Reduced Fallibly MinsMaxesHierarchical"
  411. "Dataflow: materialize.public.test6" "Reduced Fallibly MinsMaxesHierarchical"
  412. "Dataflow: materialize.public.test6" "Reduced Fallibly MinsMaxesHierarchical"
  413. "Dataflow: materialize.public.data_view_idx" "ArrangeBy[[Column(0, \"a\")]]"
  414. "Dataflow: materialize.public.data_view_idx" "ArrangeBy[[Column(0, \"a\")]]-errors"
  415. "Dataflow: materialize.public.data_view_primary_idx" "ArrangeBy[[Column(0, \"a\"), Column(1, \"b\")]]"
  416. "Dataflow: materialize.public.data_view_primary_idx" "ArrangeBy[[Column(0, \"a\"), Column(1, \"b\")]]-errors"
  417. "Dataflow: materialize.public.mat_data_idx3" "ArrangeBy[[Column(1, \"b\")]]"
  418. "Dataflow: materialize.public.mat_data_idx3" "ArrangeBy[[Column(1, \"b\")]]-errors"
  419. "Dataflow: materialize.public.test1" AccumulableErrorCheck
  420. "Dataflow: materialize.public.test1" "ArrangeAccumulable [val: empty]"
  421. "Dataflow: materialize.public.test1" ReduceAccumulable
  422. "Dataflow: materialize.public.test2" AccumulableErrorCheck
  423. "Dataflow: materialize.public.test2" "ArrangeAccumulable [val: empty]"
  424. "Dataflow: materialize.public.test2" ReduceAccumulable
  425. "Dataflow: materialize.public.test7" AccumulableErrorCheck
  426. "Dataflow: materialize.public.test7" "ArrangeAccumulable [val: empty]"
  427. "Dataflow: materialize.public.test7" ReduceAccumulable