source-linear-operators.td 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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 single-replica-cluster=quickstart
  10. # Test that filter and demand information are properly progatated from a view
  11. # down to an unmaterialized source.
  12. $ set schema={
  13. "type": "record",
  14. "name": "row",
  15. "fields": [
  16. {"name": "a", "type": ["long", "null"]},
  17. {"name": "b", "type": ["long", "null"]},
  18. {"name": "c", "type": ["long", "null"]},
  19. {"name": "d", "type": ["long", "null"]}
  20. ]
  21. }
  22. $ kafka-create-topic topic=data
  23. $ kafka-ingest format=avro topic=data schema=${schema}
  24. {"a": {"long": 1}, "b": {"long": 1}, "c": {"long": 3}, "d": {"long": 4}}
  25. {"a": {"long": 2}, "b": {"long": 1}, "c": {"long": 5}, "d": {"long": 4}}
  26. {"a": {"long": 3}, "b": {"long": 1}, "c": {"long": 3}, "d": {"long": 5}}
  27. {"a": {"long": 1}, "b": {"long": 2}, "c": {"long": 2}, "d": {"long": 3}}
  28. > CREATE CONNECTION kafka_conn
  29. TO KAFKA (BROKER '${testdrive.kafka-addr}', SECURITY PROTOCOL PLAINTEXT);
  30. > CREATE SOURCE data
  31. IN CLUSTER ${arg.single-replica-cluster}
  32. FROM KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-data-${testdrive.seed}')
  33. > CREATE TABLE data_tbl FROM SOURCE data (REFERENCE "testdrive-data-${testdrive.seed}")
  34. FORMAT AVRO USING SCHEMA '${schema}'
  35. $ set-regex match=u\d+ replacement=UID
  36. # basic test: pushing filters down to sources
  37. > CREATE VIEW v as SELECT * from data_tbl where a = 1 and d = 3;
  38. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  39. Explained Query:
  40. Filter (#0{a} = 1) AND (#3{d} = 3)
  41. ReadStorage materialize.public.data_tbl
  42. Source materialize.public.data_tbl
  43. filter=((#0{a} = 1) AND (#3{d} = 3))
  44. Target cluster: quickstart
  45. > CREATE DEFAULT INDEX ON v;
  46. > SELECT * FROM v
  47. 1 2 2 3
  48. > DROP VIEW v;
  49. # basic test: pushing demand down to sources
  50. > CREATE VIEW v as SELECT b from data_tbl where b = 1;
  51. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  52. Explained Query:
  53. Project (#1)
  54. Filter (#1{b} = 1)
  55. ReadStorage materialize.public.data_tbl
  56. Source materialize.public.data_tbl
  57. filter=((#1{b} = 1))
  58. Target cluster: quickstart
  59. > CREATE DEFAULT INDEX ON v;
  60. > SELECT * FROM v
  61. 1
  62. 1
  63. 1
  64. > DROP VIEW v;
  65. > CREATE VIEW inner_view as SELECT a, b, d from data_tbl where d = 4;
  66. # Filter gets pushed through intervening view.
  67. > CREATE VIEW v as SELECT b from inner_view where a = 1
  68. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  69. Explained Query:
  70. Project (#1)
  71. Filter (#0{a} = 1) AND (#3{d} = 4)
  72. ReadStorage materialize.public.data_tbl
  73. Source materialize.public.data_tbl
  74. filter=((#0{a} = 1) AND (#3{d} = 4))
  75. Target cluster: quickstart
  76. > CREATE DEFAULT INDEX ON v;
  77. > SELECT * FROM v
  78. 1
  79. > DROP VIEW v;
  80. # Demand gets pushed through intervening view.
  81. > CREATE VIEW v as SELECT d from inner_view where a = 1;
  82. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  83. Explained Query:
  84. Project (#3)
  85. Filter (#0{a} = 1) AND (#3{d} = 4)
  86. ReadStorage materialize.public.data_tbl
  87. Source materialize.public.data_tbl
  88. filter=((#0{a} = 1) AND (#3{d} = 4))
  89. Target cluster: quickstart
  90. > CREATE DEFAULT INDEX ON v;
  91. > SELECT * FROM v
  92. 4
  93. > DROP VIEW v;
  94. > CREATE VIEW v as SELECT s1.a from data_tbl s1, data_tbl s2 where s1.a = s2.b and s2.d = 4;
  95. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  96. Explained Query:
  97. Project (#0)
  98. Join on=(#0{a} = #1{b}) type=differential
  99. ArrangeBy keys=[[#0{a}]]
  100. Project (#0)
  101. Filter (#0{a}) IS NOT NULL
  102. ReadStorage materialize.public.data_tbl
  103. ArrangeBy keys=[[#0{b}]]
  104. Project (#1)
  105. Filter (#3{d} = 4) AND (#1{b}) IS NOT NULL
  106. ReadStorage materialize.public.data_tbl
  107. Source materialize.public.data_tbl
  108. Target cluster: quickstart
  109. > CREATE DEFAULT INDEX ON v;
  110. > SELECT * FROM v
  111. 1
  112. 1
  113. 1
  114. 1
  115. > DROP VIEW v;
  116. # filters and demand can be inferred in more complicated queries
  117. > CREATE VIEW v as SELECT s2.a from data_tbl s1, data_tbl s2 where s1.a = s2.b and s2.d = 4 and s1.d = 4;
  118. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  119. Explained Query:
  120. Project (#1)
  121. Join on=(#0{a} = #2{b}) type=differential
  122. ArrangeBy keys=[[#0{a}]]
  123. Project (#0)
  124. Filter (#3{d} = 4) AND (#0{a}) IS NOT NULL
  125. ReadStorage materialize.public.data_tbl
  126. ArrangeBy keys=[[#1{b}]]
  127. Project (#0, #1)
  128. Filter (#3{d} = 4) AND (#1{b}) IS NOT NULL
  129. ReadStorage materialize.public.data_tbl
  130. Source materialize.public.data_tbl
  131. filter=((#3{d} = 4))
  132. Target cluster: quickstart
  133. > CREATE DEFAULT INDEX ON v;
  134. > SELECT * FROM v
  135. 1
  136. 2
  137. > DROP VIEW v;
  138. > CREATE VIEW v as SELECT s2.c from data_tbl s1, data_tbl s2 where s1.a = s2.a
  139. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  140. Explained Query:
  141. With
  142. cte l0 =
  143. Project (#0, #2)
  144. Filter (#0{a}) IS NOT NULL
  145. ReadStorage materialize.public.data_tbl
  146. Return
  147. Project (#2)
  148. Join on=(#0{a} = #1{a}) type=differential
  149. ArrangeBy keys=[[#0{a}]]
  150. Project (#0)
  151. Get l0
  152. ArrangeBy keys=[[#0{a}]]
  153. Get l0
  154. Source materialize.public.data_tbl
  155. filter=((#0{a}) IS NOT NULL)
  156. Target cluster: quickstart
  157. > CREATE DEFAULT INDEX ON v;
  158. > SELECT * FROM v
  159. 3
  160. 5
  161. 3
  162. 2
  163. 3
  164. 2
  165. > DROP VIEW v;
  166. > CREATE VIEW v as SELECT * FROM (SELECT a, sum(b) FROM data_tbl GROUP BY a UNION ALL SELECT a, (a + c)::numeric FROM data_tbl) WHERE a = 1;
  167. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  168. Explained Query:
  169. Union
  170. Project (#1, #0)
  171. Map (1)
  172. Reduce aggregates=[sum(#0{b})]
  173. Project (#1)
  174. Filter (#0 = 1)
  175. ReadStorage materialize.public.data_tbl
  176. Project (#0, #4)
  177. Filter (#0 = 1)
  178. Map (bigint_to_numeric((1 + #2{c})))
  179. ReadStorage materialize.public.data_tbl
  180. Source materialize.public.data_tbl
  181. filter=((#0 = 1))
  182. Target cluster: quickstart
  183. > CREATE DEFAULT INDEX ON v;
  184. > SELECT * FROM v
  185. 1 3
  186. 1 3
  187. 1 4
  188. > DROP VIEW v;
  189. # multiple source test
  190. $ kafka-create-topic topic=data2
  191. $ kafka-ingest format=avro topic=data2 schema=${schema}
  192. {"a": {"long": 3}, "b": {"long": 2}, "c": null, "d": {"long": 4}}
  193. {"a": {"long": 2}, "b": {"long": 1}, "c": {"long": 5}, "d": null}
  194. > CREATE SOURCE data2
  195. IN CLUSTER ${arg.single-replica-cluster}
  196. FROM KAFKA CONNECTION kafka_conn (TOPIC 'testdrive-data2-${testdrive.seed}')
  197. > CREATE TABLE data2_tbl FROM SOURCE data2 (REFERENCE "testdrive-data2-${testdrive.seed}")
  198. FORMAT AVRO USING SCHEMA '${schema}'
  199. > CREATE VIEW v as SELECT a, c FROM data_tbl EXCEPT ALL SELECT a, c FROM data2_tbl where d is null
  200. ? EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR SELECT * FROM v;
  201. Explained Query:
  202. Threshold
  203. Union
  204. Project (#0, #2)
  205. ReadStorage materialize.public.data_tbl
  206. Negate
  207. Project (#0, #2)
  208. Filter (#3{d}) IS NULL
  209. ReadStorage materialize.public.data2_tbl
  210. Source materialize.public.data_tbl
  211. Source materialize.public.data2_tbl
  212. filter=((#3{d}) IS NULL)
  213. Target cluster: quickstart
  214. > CREATE DEFAULT INDEX ON v;
  215. > SELECT * FROM v
  216. 1 2
  217. 1 3
  218. 3 3
  219. > DROP VIEW v;