materialized_views.slt 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811
  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. # Setup
  11. statement ok
  12. CREATE TABLE t (a int, b int)
  13. statement ok
  14. INSERT INTO t VALUES (1, 2), (3, 4), (5, 6)
  15. statement ok
  16. CREATE CLUSTER other REPLICAS (r1 (SIZE '1'), r2 (SIZE '2-2'))
  17. # Test: Materialized view can be created.
  18. statement ok
  19. CREATE MATERIALIZED VIEW mv AS SELECT 1
  20. # Test: Materialized view can be replaced.
  21. statement ok
  22. CREATE OR REPLACE MATERIALIZED VIEW mv AS SELECT 2
  23. query I
  24. SELECT * FROM mv
  25. ----
  26. 2
  27. # Test: Materialized view creation can be skipped if a materialized view already exists.
  28. statement error materialized view "materialize.public.mv" already exists
  29. CREATE MATERIALIZED VIEW mv AS SELECT 1
  30. statement ok
  31. CREATE MATERIALIZED VIEW IF NOT EXISTS mv AS SELECT 1
  32. query I
  33. SELECT * FROM mv
  34. ----
  35. 2
  36. # Test: Materialized view can have explicit column names.
  37. statement ok
  38. CREATE OR REPLACE MATERIALIZED VIEW mv (name, age) AS SELECT 'jon', 12
  39. query TI colnames
  40. SELECT * FROM mv
  41. ----
  42. name age
  43. jon 12
  44. # Test: Explicit column names must have the right cardinality.
  45. statement error materialized view .+ definition names 2 columns, but materialized view .+ has 1 column
  46. CREATE MATERIALIZED VIEW error (name, age) AS SELECT 'jon'
  47. # Test: Materialized view can be created in another cluster.
  48. statement ok
  49. CREATE MATERIALIZED VIEW other_mv IN CLUSTER other AS SELECT 1
  50. query TTT colnames,rowsort
  51. SHOW MATERIALIZED VIEWS
  52. ----
  53. name cluster comment
  54. mv quickstart (empty)
  55. other_mv other (empty)
  56. statement ok
  57. DROP MATERIALIZED VIEW other_mv
  58. # Test: Materialized view can not be created in a non-existing cluster.
  59. statement error unknown cluster 'doesnotexist'
  60. CREATE MATERIALIZED VIEW error IN CLUSTER doesnotexist AS SELECT 1
  61. # Test: Materialized view data is accessible from the same cluster.
  62. statement ok
  63. CREATE OR REPLACE MATERIALIZED VIEW mv AS SELECT a + b FROM t
  64. query I rowsort
  65. SELECT * FROM mv
  66. ----
  67. 3
  68. 7
  69. 11
  70. # Test: Materialized view data is accessible from other clusters.
  71. statement ok
  72. SET cluster = other
  73. query I rowsort
  74. SELECT * FROM mv
  75. ----
  76. 3
  77. 7
  78. 11
  79. statement ok
  80. RESET cluster
  81. # Test: Materialized view reflects input data changes.
  82. statement ok
  83. INSERT INTO t VALUES (7, 8)
  84. query I rowsort
  85. SELECT * FROM mv
  86. ----
  87. 3
  88. 7
  89. 11
  90. 15
  91. statement ok
  92. DELETE FROM t WHERE a = 1
  93. query I rowsort
  94. SELECT * FROM mv
  95. ----
  96. 7
  97. 11
  98. 15
  99. # Test: Query errors are propagated through materialized views.
  100. statement ok
  101. CREATE OR REPLACE MATERIALIZED VIEW mv AS SELECT 100 / a FROM t
  102. query I rowsort
  103. SELECT * FROM mv
  104. ----
  105. 14
  106. 20
  107. 33
  108. statement ok
  109. INSERT INTO t VALUES (0, 0)
  110. query error Evaluation error: division by zero
  111. SELECT * FROM mv
  112. statement ok
  113. DELETE FROM t WHERE a = 0
  114. query I rowsort
  115. SELECT * FROM mv
  116. ----
  117. 14
  118. 20
  119. 33
  120. # Test: Materialized views can be nested.
  121. statement ok
  122. CREATE MATERIALIZED VIEW mv2 AS SELECT count(*) FROM mv
  123. query I
  124. SELECT * FROM mv2
  125. ----
  126. 3
  127. statement ok
  128. DROP MATERIALIZED VIEW mv2
  129. # Test: Materialized views can have indexes on top.
  130. statement ok
  131. CREATE DEFAULT INDEX ON mv;
  132. # Test: Materialized views can be dropped.
  133. statement ok
  134. CREATE OR REPLACE MATERIALIZED VIEW mv AS SELECT 1
  135. statement ok
  136. DROP MATERIALIZED VIEW mv
  137. # Test: Materialized views can not be dropped if they have dependants.
  138. statement ok
  139. CREATE MATERIALIZED VIEW mv AS SELECT 1
  140. statement ok
  141. CREATE VIEW v AS SELECT * FROM mv
  142. statement error cannot drop materialized view "mv": still depended upon by view "v"
  143. DROP MATERIALIZED VIEW mv
  144. # Test: Materialized views with dependants can be dropped with CASCADE.
  145. statement ok
  146. DROP MATERIALIZED VIEW mv CASCADE
  147. query error unknown catalog item 'v'
  148. SELECT * FROM v
  149. # Test: a view on a materialized view that optimizes to the empty set
  150. # still prevents the underlying view from being dropped.
  151. # See: https://github.com/MaterializeInc/database-issues/issues/6101
  152. statement ok
  153. CREATE VIEW v AS SELECT 1 AS c
  154. statement ok
  155. CREATE MATERIALIZED VIEW mv AS SELECT * FROM v WHERE c IS NULL
  156. statement error cannot drop view "v": still depended upon by materialized view "mv"
  157. DROP VIEW v
  158. statement ok
  159. DROP VIEW v CASCADE
  160. query I
  161. SELECT count(*) FROM mz_materialized_views WHERE name = 'mv'
  162. ----
  163. 0
  164. # mz_scheduling_elapsed_raw, a log source, is optimized away, but should still count as a dependency
  165. query error db error: ERROR: materialized view objects cannot depend on log sources
  166. CREATE MATERIALIZED VIEW mv AS SELECT (SELECT 1 FROM mz_introspection.mz_scheduling_elapsed_raw WHERE FALSE);
  167. simple conn=mz_system,user=mz_system
  168. ALTER SYSTEM SET unsafe_enable_table_keys = true
  169. ----
  170. COMPLETE 0
  171. statement ok
  172. CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY);
  173. statement ok
  174. CREATE TABLE t2 (f1 INTEGER NOT NULL PRIMARY KEY);
  175. # Folds to Constant, t1 is optimized away but must still be counted as a dependency
  176. statement ok
  177. CREATE MATERIALIZED VIEW mv AS SELECT * FROM t1 WHERE FALSE;
  178. statement error db error: ERROR: cannot drop table "t1": still depended upon by materialized view "mv"
  179. DROP TABLE t1
  180. statement ok
  181. DROP MATERIALIZED VIEW mv
  182. # In the cases below, t2 is optimized away but should still be present as a dependency
  183. statement ok
  184. CREATE MATERIALIZED VIEW mv AS SELECT t1.* FROM t1 LEFT JOIN t2 ON (t1.f1 = t2.f1);
  185. statement error db error: ERROR: cannot drop table "t2": still depended upon by materialized view "mv"
  186. DROP TABLE t2
  187. statement ok
  188. DROP MATERIALIZED VIEW mv
  189. statement ok
  190. CREATE MATERIALIZED VIEW mv AS SELECT * FROM t1 WHERE FALSE AND EXISTS (SELECT * FROM t2);
  191. statement error db error: ERROR: cannot drop table "t2": still depended upon by materialized view "mv"
  192. DROP TABLE t2
  193. statement ok
  194. DROP MATERIALIZED VIEW mv
  195. statement ok
  196. CREATE MATERIALIZED VIEW mv AS SELECT * FROM t1 WHERE TRUE OR EXISTS (SELECT * FROM t2);
  197. statement error db error: ERROR: cannot drop table "t2": still depended upon by materialized view "mv"
  198. DROP TABLE t2
  199. statement ok
  200. DROP MATERIALIZED VIEW mv
  201. statement ok
  202. CREATE MATERIALIZED VIEW mv AS SELECT (SELECT f1 FROM t2 WHERE FALSE) FROM t1;
  203. statement error db error: ERROR: cannot drop table "t2": still depended upon by materialized view "mv"
  204. DROP TABLE t2
  205. statement ok
  206. DROP MATERIALIZED VIEW mv
  207. # No need to evaluate second argument of COALESCE if first is non-null
  208. statement ok
  209. CREATE MATERIALIZED VIEW mv AS SELECT COALESCE(1, (SELECT * FROM t2 LIMIT 1)) FROM t1;
  210. statement error db error: ERROR: cannot drop table "t2": still depended upon by materialized view "mv"
  211. DROP TABLE t2
  212. statement ok
  213. DROP MATERIALIZED VIEW mv
  214. statement ok
  215. CREATE TYPE int4_list AS LIST (ELEMENT TYPE = int4);
  216. # Mention of int4_list is optimized away
  217. statement ok
  218. CREATE MATERIALIZED VIEW mv AS SELECT * FROM t1 WHERE NULL::int4_list IS NOT NULL;
  219. statement error db error: ERROR: cannot drop type "int4_list": still depended upon by materialized view "mv"
  220. DROP TYPE int4_list
  221. statement ok
  222. DROP MATERIALIZED VIEW mv
  223. statement ok
  224. DROP TYPE int4_list
  225. statement ok
  226. DROP TABLE t1
  227. statement ok
  228. DROP TABLE t2
  229. # Test: Materialized view prevents dropping its cluster.
  230. statement ok
  231. CREATE CLUSTER to_drop REPLICAS ()
  232. statement ok
  233. CREATE MATERIALIZED VIEW to_drop_mv IN CLUSTER to_drop AS SELECT 1
  234. statement error cannot drop cluster "to_drop" because other objects depend on it
  235. DROP CLUSTER to_drop
  236. # Test: Cluster with dependent materialized view can be dropped with CASCADE.
  237. statement ok
  238. DROP CLUSTER to_drop CASCADE
  239. query error unknown catalog item 'to_drop_mv'
  240. SELECT * FROM to_drop_mv
  241. # Test: SHOW CREATE MATERIALIZED VIEW
  242. statement ok
  243. CREATE MATERIALIZED VIEW mv AS SELECT 1
  244. query TT colnames
  245. SHOW CREATE MATERIALIZED VIEW mv
  246. ----
  247. name create_sql
  248. materialize.public.mv CREATE␠MATERIALIZED␠VIEW␠materialize.public.mv⏎␠␠␠␠IN␠CLUSTER␠quickstart⏎␠␠␠␠WITH␠(REFRESH␠=␠ON␠COMMIT)⏎␠␠␠␠AS␠SELECT␠1;
  249. # Test: SHOW CREATE MATERIALIZED VIEW as mz_support
  250. simple multiline,conn=mz_catalog_server,user=mz_support
  251. SELECT create_sql FROM (SHOW CREATE MATERIALIZED VIEW mv);
  252. ----
  253. CREATE MATERIALIZED VIEW materialize.public.mv
  254. IN CLUSTER quickstart
  255. WITH (REFRESH = ON COMMIT)
  256. AS SELECT 1;
  257. EOF
  258. COMPLETE 1
  259. # Test: SHOW MATERIALIZED VIEWS
  260. statement ok
  261. CREATE MATERIALIZED VIEW other_mv IN CLUSTER other AS SELECT 1
  262. query TTT colnames,rowsort
  263. SHOW MATERIALIZED VIEWS
  264. ----
  265. name cluster comment
  266. mv quickstart (empty)
  267. other_mv other (empty)
  268. query TTT colnames,rowsort
  269. SHOW MATERIALIZED VIEWS IN CLUSTER other
  270. ----
  271. name cluster comment
  272. other_mv other (empty)
  273. statement ok
  274. DROP MATERIALIZED VIEW other_mv
  275. # Test: Materialized view can be renamed.
  276. statement ok
  277. ALTER MATERIALIZED VIEW mv RENAME TO mv2
  278. query I
  279. SELECT * FROM mv2
  280. ----
  281. 1
  282. statement ok
  283. DROP MATERIALIZED VIEW mv2
  284. # Test: Materialized views show up in mz_materialized_views.
  285. statement ok
  286. CREATE MATERIALIZED VIEW mv AS SELECT 1
  287. query TT colnames
  288. SELECT name, definition FROM mz_materialized_views
  289. ----
  290. name definition
  291. mv SELECT␠1;
  292. statement ok
  293. DROP MATERIALIZED VIEW mv
  294. query I
  295. SELECT count(*) FROM mz_materialized_views
  296. ----
  297. 0
  298. # Test: Materialized views show in `SHOW OBJECTS`.
  299. statement ok
  300. CREATE MATERIALIZED VIEW mv AS SELECT 1
  301. mode standard
  302. query TTT colnames,rowsort
  303. SHOW OBJECTS
  304. ----
  305. name type comment
  306. mv
  307. materialized-view
  308. (empty)
  309. t
  310. table
  311. (empty)
  312. mode cockroach
  313. # Test: Indexes on materialized views show in `SHOW INDEXES`.
  314. statement ok
  315. CREATE DEFAULT INDEX ON mv
  316. query TTTTT colnames
  317. SHOW INDEXES ON mv
  318. ----
  319. name on cluster key comment
  320. mv_primary_idx mv quickstart {?column?} (empty)
  321. # Test: Creating materialized views that depend on log sources is forbidden.
  322. statement error materialized view objects cannot depend on log sources
  323. CREATE OR REPLACE MATERIALIZED VIEW mv AS SELECT id, name FROM mz_introspection.mz_dataflow_operators;
  324. # Test: Attempting to use view commands on materialized views gives helpful errors.
  325. statement error mv is not a view\nHINT: Use DROP MATERIALIZED VIEW to remove a materialized view\.
  326. DROP VIEW mv
  327. statement error mv is not a view\nHINT: Use SHOW CREATE MATERIALIZED VIEW to show a materialized view\.
  328. SHOW CREATE VIEW mv
  329. statement error mv is not a view\nHINT: Use ALTER MATERIALIZED VIEW to rename a materialized view\.
  330. ALTER VIEW mv RENAME TO mv2
  331. # We should not be able to create materialized views on top of 'SHOW' commands.
  332. statement error SHOW commands are not allowed in views
  333. CREATE MATERIALIZED VIEW mat_clusters AS SELECT name FROM (SHOW CLUSTERS);
  334. statement error SHOW commands are not allowed in views
  335. CREATE MATERIALIZED VIEW mat_cluster_replicas AS SELECT cluster, replica, size, ready FROM (SHOW CLUSTER REPLICAS);
  336. statement error SHOW commands are not allowed in views
  337. CREATE MATERIALIZED VIEW mat_columns AS SELECT name, nullable, type FROM (SHOW COLUMNS FROM mz_tables);
  338. statement error SHOW commands are not allowed in views
  339. CREATE MATERIALIZED VIEW mat_connections AS SELECT name, type FROM (SHOW CONNECTIONS);
  340. statement error SHOW commands are not allowed in views
  341. CREATE MATERIALIZED VIEW mat_databases AS SELECT name FROM (SHOW DATABASES);
  342. statement error SHOW commands are not allowed in views
  343. CREATE MATERIALIZED VIEW mat_indexes AS SELECT name, on, cluster, key FROM (SHOW INDEXES);
  344. statement error SHOW commands are not allowed in views
  345. CREATE MATERIALIZED VIEW mat_mat_views AS SELECT name, cluster FROM (SHOW MATERIALIZED VIEWS);
  346. statement error SHOW commands are not allowed in views
  347. CREATE MATERIALIZED VIEW mat_objects AS SELECT name FROM (SHOW OBJECTS);
  348. statement error SHOW commands are not allowed in views
  349. CREATE MATERIALIZED VIEW mat_schemas AS SELECT name FROM (SHOW SCHEMAS);
  350. statement error SHOW commands are not allowed in views
  351. CREATE MATERIALIZED VIEW mat_secrets AS SELECT name FROM (SHOW SECRETS);
  352. statement error SHOW commands are not allowed in views
  353. CREATE MATERIALIZED VIEW mat_sinks AS SELECT name, type FROM (SHOW SINKS);
  354. statement error SHOW commands are not allowed in views
  355. CREATE MATERIALIZED VIEW mat_sources AS SELECT name, type FROM (SHOW SOURCES);
  356. statement error SHOW commands are not allowed in views
  357. CREATE MATERIALIZED VIEW mat_tables AS SELECT name FROM (SHOW TABLES);
  358. statement error SHOW commands are not allowed in views
  359. CREATE MATERIALIZED VIEW mat_views AS SELECT name FROM (SHOW VIEWS);
  360. # LIMIT in materialized view
  361. statement ok
  362. CREATE MATERIALIZED VIEW mv_limited AS
  363. SELECT a
  364. FROM t
  365. ORDER BY a DESC, a+b
  366. LIMIT 3;
  367. query I
  368. SELECT * FROM mv_limited;
  369. ----
  370. 3
  371. 5
  372. 7
  373. statement ok
  374. DELETE FROM t WHERE a = 5;
  375. query I
  376. SELECT * FROM mv_limited;
  377. ----
  378. 3
  379. 7
  380. query I
  381. SELECT * FROM mv_limited
  382. ORDER BY a
  383. LIMIT 1;
  384. ----
  385. 3
  386. # Cleanup
  387. statement ok
  388. DROP TABLE t CASCADE
  389. statement ok
  390. DROP CLUSTER other CASCADE
  391. statement ok
  392. CREATE TABLE t2 (x int, y int, z int);
  393. statement ok
  394. INSERT INTO t2 VALUES (NULL, 2, 3), (4, NULL, 6), (7, 8, NULL);
  395. statement ok
  396. CREATE MATERIALIZED VIEW mv_no_assertions AS SELECT * FROM t2;
  397. query III
  398. SELECT * FROM mv_no_assertions ORDER BY x;
  399. ----
  400. 4 NULL 6
  401. 7 8 NULL
  402. NULL 2 3
  403. statement ok
  404. CREATE MATERIALIZED VIEW mv_assertion_at_begin WITH (ASSERT NOT NULL x) AS SELECT * FROM t2;
  405. statement error column "x" must not be null
  406. SELECT * FROM mv_assertion_at_begin;
  407. statement ok
  408. CREATE MATERIALIZED VIEW mv_assertion_at_end WITH (ASSERT NOT NULL z) AS SELECT * FROM t2;
  409. statement error column "z" must not be null
  410. SELECT * FROM mv_assertion_at_end;
  411. statement ok
  412. CREATE MATERIALIZED VIEW mv_two_assertions WITH (ASSERT NOT NULL x, ASSERT NOT NULL z) AS SELECT * FROM t2;
  413. statement error column "x" must not be null
  414. SELECT * FROM mv_two_assertions;
  415. statement ok
  416. CREATE MATERIALIZED VIEW mv_misordered_assertions WITH (ASSERT NOT NULL z, ASSERT NOT NULL y) AS SELECT * FROM t2;
  417. statement error must not be null
  418. SELECT * FROM mv_misordered_assertions
  419. statement error duplicate column "y" in non-null assertions
  420. CREATE MATERIALIZED VIEW mv_duplicate_assertions WITH (ASSERT NOT NULL y, ASSERT NOT NULL y) AS SELECT * FROM t2;
  421. statement error column "x" in ASSERT NOT NULL option not found
  422. CREATE MATERIALIZED VIEW mv_bad_assertion_on_renamed_column (a, b, c) WITH (ASSERT NOT NULL x) AS SELECT * FROM t2;
  423. statement ok
  424. CREATE MATERIALIZED VIEW mv_good_assertion_on_renamed_column (a, b, c) WITH (ASSERT NOT NULL b) AS SELECT * FROM t2;
  425. statement error column "b" must not be null
  426. SELECT * FROM mv_good_assertion_on_renamed_column;
  427. statement ok
  428. UPDATE t2 SET x=1 WHERE x IS NULL;
  429. query III
  430. SELECT * FROM mv_assertion_at_begin ORDER BY x;
  431. ----
  432. 1 2 3
  433. 4 NULL 6
  434. 7 8 NULL
  435. # ------------------------------------------------------------------
  436. # REFRESH options (see also in materialized-view-refresh-options.td)
  437. # ------------------------------------------------------------------
  438. # Planning/parsing errors
  439. simple conn=mz_system,user=mz_system
  440. ALTER SYSTEM SET enable_refresh_every_mvs = false
  441. ----
  442. COMPLETE 0
  443. # Should be disabled
  444. query error db error: ERROR: REFRESH EVERY and REFRESH AT materialized views is not available
  445. CREATE MATERIALIZED VIEW mv_bad WITH (ASSERT NOT NULL x, REFRESH EVERY '8 seconds') AS SELECT * FROM t2;
  446. simple conn=mz_system,user=mz_system
  447. ALTER SYSTEM SET enable_refresh_every_mvs = true
  448. ----
  449. COMPLETE 0
  450. query error Expected one of ON or AT or EVERY, found number "5"
  451. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH 5) AS SELECT 1;
  452. query error db error: ERROR: REFRESH ON COMMIT cannot be specified multiple times
  453. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH ON COMMIT, REFRESH ON COMMIT) AS SELECT 1;
  454. query error db error: ERROR: REFRESH ON COMMIT is not compatible with any of the other REFRESH options
  455. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH ON COMMIT, REFRESH EVERY '1 day') AS SELECT 1;
  456. query error db error: ERROR: REFRESH AT does not support casting from record\(f1: integer,f2: integer\) to mz_timestamp
  457. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT row(1,2)) AS SELECT 1;
  458. query error db error: ERROR: REFRESH AT argument must be an expression that can be simplified and/or cast to a constant whose type is mz_timestamp
  459. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT 'aaaa') AS SELECT 1;
  460. query error db error: ERROR: column "ccc" does not exist
  461. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT ccc) AS SELECT 1 as ccc;
  462. query error db error: ERROR: REFRESH AT argument must be an expression that can be simplified and/or cast to a constant whose type is mz_timestamp
  463. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT now()) AS SELECT 1;
  464. query error db error: ERROR: REFRESH AT argument must be an expression that can be simplified and/or cast to a constant whose type is mz_timestamp
  465. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT now()::mz_timestamp) AS SELECT 1;
  466. query error db error: ERROR: greatest types mz_timestamp and timestamp with time zone cannot be matched
  467. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT greatest(mz_now(), now())) AS SELECT 1;
  468. query error db error: ERROR: REFRESH AT argument must be an expression that can be simplified and/or cast to a constant whose type is mz_timestamp
  469. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT greatest(mz_now(), now()::mz_timestamp)) AS SELECT 1;
  470. query error db error: ERROR: aggregate functions are not allowed in REFRESH AT \(function pg_catalog\.sum\)
  471. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT sum(5)) AS SELECT 1;
  472. query error db error: ERROR: REFRESH AT does not allow subqueries
  473. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT (SELECT 1)) AS SELECT 1;
  474. query error db error: ERROR: window functions are not allowed in REFRESH AT \(function pg_catalog\.lag\)
  475. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH AT lag(7) OVER ()) AS SELECT 1;
  476. query error Expected literal string, found number "42"
  477. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY 42) AS SELECT 1;
  478. query error db error: ERROR: invalid input syntax for type interval: unknown units dayy: "1 dayy"
  479. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 dayy') AS SELECT 1;
  480. query error Expected literal string, found INTERVAL
  481. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY INTERVAL '1 day') AS SELECT 1;
  482. query error db error: ERROR: REFRESH interval must be positive; got: \-00:01:00
  483. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '-1 minutes') AS SELECT 1;
  484. query error db error: ERROR: REFRESH interval must not involve units larger than days
  485. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 month') AS SELECT 1;
  486. query error db error: ERROR: REFRESH interval must not involve units larger than days
  487. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 year') AS SELECT 1;
  488. query error db error: ERROR: REFRESH EVERY \.\.\. ALIGNED TO argument must be an expression that can be simplified and/or cast to a constant whose type is mz_timestamp
  489. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 day' ALIGNED TO now()) AS SELECT 1;
  490. query error db error: ERROR: REFRESH EVERY \.\.\. ALIGNED TO argument must be an expression that can be simplified and/or cast to a constant whose type is mz_timestamp
  491. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 day' ALIGNED TO now()::mz_timestamp) AS SELECT 1;
  492. query error db error: ERROR: greatest types mz_timestamp and timestamp with time zone cannot be matched
  493. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 day' ALIGNED TO greatest(mz_now(), now())) AS SELECT 1;
  494. query error db error: ERROR: REFRESH EVERY \.\.\. ALIGNED TO argument must be an expression that can be simplified and/or cast to a constant whose type is mz_timestamp
  495. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 day' ALIGNED TO greatest(mz_now(), now()::mz_timestamp)) AS SELECT 1;
  496. query error db error: ERROR: aggregate functions are not allowed in REFRESH EVERY \.\.\. ALIGNED TO \(function pg_catalog\.sum\)
  497. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 day' ALIGNED TO sum(5)) AS SELECT 1;
  498. query error db error: ERROR: REFRESH EVERY \.\.\. ALIGNED TO does not allow subqueries
  499. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 day' ALIGNED TO (SELECT 1)) AS SELECT 1;
  500. query error db error: ERROR: window functions are not allowed in REFRESH EVERY \.\.\. ALIGNED TO \(function pg_catalog\.lag\)
  501. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '1 day' ALIGNED TO lag(7) OVER ()) AS SELECT 1;
  502. query error Expected literal string, found right parenthesis
  503. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY) AS SELECT * FROM t2;
  504. query error Expected literal string, found comma
  505. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY, ASSERT NOT NULL x) AS SELECT * FROM t2;
  506. query error Expected right parenthesis, found REFRESH
  507. CREATE MATERIALIZED VIEW mv_bad WITH (ASSERT NOT NULL x REFRESH EVERY '8 seconds') AS SELECT * FROM t2;
  508. query error Expected literal string, found ASSERT
  509. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY ASSERT NOT NULL x) AS SELECT * FROM t2;
  510. query error db error: ERROR: invalid input syntax for type interval: Overflows maximum days; cannot exceed 2147483647/\-2147483648 days: "213503982001"
  511. CREATE MATERIALIZED VIEW mv_bad WITH (REFRESH EVERY '213503982001' days) AS SELECT * FROM t2;
  512. # This tests that we don't forget to purify EXPLAIN CREATE MATERIALIZED VIEW
  513. statement ok
  514. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR CREATE MATERIALIZED VIEW mv_explain WITH (REFRESH EVERY '2 seconds') AS SELECT * FROM t2;
  515. statement ok
  516. CREATE MATERIALIZED VIEW mv_on_commit WITH (REFRESH ON COMMIT) AS SELECT * FROM t2;
  517. query III rowsort
  518. SELECT 1000*x, 1000*y, 1000*z
  519. FROM mv_on_commit;
  520. ----
  521. 7000 8000 NULL
  522. 4000 NULL 6000
  523. 1000 2000 3000
  524. # Test that we call `transform_ast::transform`. (This has an `Expr::Nested`, which needs to be desugared, or we panic.)
  525. statement ok
  526. CREATE MATERIALIZED VIEW mv_desugar1 WITH (REFRESH AT (mz_now())) AS SELECT * FROM t2;
  527. # Same with ALIGNED TO
  528. statement ok
  529. CREATE MATERIALIZED VIEW mv_desugar2 WITH (REFRESH EVERY '1 day' ALIGNED TO (mz_now())) AS SELECT * FROM t2;
  530. ## REFRESH options together with ASSERT NOT NULL options
  531. statement ok
  532. INSERT INTO t2 VALUES (10, 11, 12);
  533. statement ok
  534. CREATE MATERIALIZED VIEW mv_assertion_plus_refresh_every WITH (ASSERT NOT NULL x, REFRESH EVERY '8 seconds') AS SELECT * FROM t2;
  535. # There should be a refresh immediately when creating the MV. This refresh should already see what we just inserted.
  536. query III
  537. SELECT * FROM mv_assertion_plus_refresh_every ORDER BY x;
  538. ----
  539. 1 2 3
  540. 4 NULL 6
  541. 7 8 NULL
  542. 10 11 12
  543. statement ok
  544. INSERT INTO t2 VALUES (NULL, -1, -2);
  545. # This insert shouldn't be visible yet.
  546. query III
  547. SELECT * FROM mv_assertion_plus_refresh_every ORDER BY x;
  548. ----
  549. 1 2 3
  550. 4 NULL 6
  551. 7 8 NULL
  552. 10 11 12
  553. # Sleep for the refresh interval, so that we get a refresh.
  554. # Actually, we sleep a bit more than the refresh interval, because we don't have real-time recency guarantees:
  555. # When we query the MV at a particular wall clock time `t`, there is no guarantee that we see a refresh that
  556. # happened at, say, `t - 1ms`. Note that the test was actually failing sometimes when it was sleeping for only 8s or 9s.
  557. # A proper solution might be to add `AS OF now()` to the following SELECT, but calling `now()` seems to not be currently
  558. # allowed in `AS OF`.
  559. statement ok
  560. SELECT mz_unsafe.mz_sleep(8+2);
  561. # Now we should see the NULL that should error out the MV.
  562. query error db error: ERROR: Evaluation error: column "x" must not be null
  563. SELECT * FROM mv_assertion_plus_refresh_every ORDER BY x;
  564. ## Check `REFRESH AT greatest(<past time>, mz_now())`, because this is an idiom that we are recommending to users.
  565. # Insert something into the underlying table.
  566. statement ok
  567. INSERT INTO t2 VALUES (30, 30, 30);
  568. statement ok
  569. CREATE MATERIALIZED VIEW mv_greatest
  570. WITH (REFRESH AT greatest('1990-01-04 11:00', mz_now()))
  571. AS SELECT * FROM t2;
  572. query III rowsort
  573. SELECT * FROM mv_greatest;
  574. ----
  575. NULL -1 -2
  576. 4 NULL 6
  577. 7 8 NULL
  578. 1 2 3
  579. 10 11 12
  580. 30 30 30
  581. ## If there is no creation refresh, then a query should block until the first refresh.
  582. # Save the current time.
  583. statement ok
  584. CREATE TABLE start_time(t timestamp);
  585. statement ok
  586. INSERT INTO start_time VALUES (now());
  587. # Create an MV whose first refresh is 5 sec after its creation.
  588. statement ok
  589. CREATE MATERIALIZED VIEW mv_no_creation_refresh
  590. WITH (REFRESH EVERY '100000 sec' ALIGNED TO mz_now()::string::int8 + 5000)
  591. AS SELECT * FROM t2;
  592. # Insert something into the underlying table.
  593. statement ok
  594. INSERT INTO t2 VALUES (100, 100, 100);
  595. # Query it.
  596. # - The query should block until the first refresh.
  597. # - The newly inserted stuff should be visible.
  598. query III rowsort
  599. SELECT * FROM mv_no_creation_refresh;
  600. ----
  601. NULL -1 -2
  602. 4 NULL 6
  603. 7 8 NULL
  604. 1 2 3
  605. 10 11 12
  606. 30 30 30
  607. 100 100 100
  608. # Verify that at least 5 seconds have passed.
  609. query B
  610. SELECT now() - (SELECT * from start_time) >= INTERVAL '5 sec';
  611. ----
  612. true
  613. ## Check ALIGNED TO in the far past
  614. # Save the current time.
  615. statement ok
  616. DELETE FROM start_time;
  617. statement ok
  618. INSERT INTO start_time VALUES (now());
  619. statement ok
  620. CREATE MATERIALIZED VIEW mv_aligned_to_past
  621. WITH (REFRESH EVERY '10000 ms' ALIGNED TO mz_now()::text::int8 - 10*10000 + 3000)
  622. AS SELECT * FROM t2;
  623. query III rowsort
  624. SELECT * FROM mv_aligned_to_past;
  625. ----
  626. NULL -1 -2
  627. 4 NULL 6
  628. 7 8 NULL
  629. 1 2 3
  630. 10 11 12
  631. 30 30 30
  632. 100 100 100
  633. # Verify that at least 3 seconds have passed.
  634. query B
  635. SELECT now() - (SELECT * from start_time) >= INTERVAL '3 sec';
  636. ----
  637. true
  638. ## Check ALIGNED TO in the far future
  639. # Save the current time.
  640. statement ok
  641. DELETE FROM start_time;
  642. statement ok
  643. INSERT INTO start_time VALUES (now());
  644. statement ok
  645. CREATE MATERIALIZED VIEW mv_aligned_to_future
  646. WITH (REFRESH EVERY '10000 ms' ALIGNED TO mz_now()::text::int8 + 10*10000 + 3000)
  647. AS SELECT * FROM t2;
  648. query III rowsort
  649. SELECT * FROM mv_aligned_to_future;
  650. ----
  651. NULL -1 -2
  652. 4 NULL 6
  653. 7 8 NULL
  654. 1 2 3
  655. 10 11 12
  656. 30 30 30
  657. 100 100 100
  658. # Verify that at least 3 seconds have passed.
  659. query B
  660. SELECT now() - (SELECT * from start_time) >= INTERVAL '3 sec';
  661. ----
  662. true
  663. ## Constant query in an MV with REFRESH options
  664. statement ok
  665. CREATE MATERIALIZED VIEW const_mv
  666. WITH (REFRESH EVERY '1 day')
  667. AS SELECT 1;
  668. query I
  669. SELECT * FROM const_mv
  670. ----
  671. 1
  672. ## We should be able to immediately query a constant MV under serializable isolation even if the
  673. ## first refresh is in the future. The since will be advanced to [3000-01-01 23:59] and the upper
  674. ## will be advanced to [].
  675. statement ok
  676. CREATE MATERIALIZED VIEW const_mv2
  677. WITH (REFRESH AT '3000-01-01 23:59')
  678. AS SELECT 2;
  679. statement ok
  680. SET transaction_isolation = 'serializable'
  681. query I
  682. SELECT * FROM const_mv2
  683. ----
  684. 2
  685. statement ok
  686. SET transaction_isolation = 'strict serializable'
  687. ## MV that has refreshes only in the past
  688. query error db error: ERROR: REFRESH AT requested for a time where not all the inputs are readable
  689. CREATE MATERIALIZED VIEW mv_no_refresh
  690. WITH (REFRESH AT '2000-01-01 10:00')
  691. AS SELECT * FROM t2;
  692. ## Query MV after the last refresh
  693. statement ok
  694. CREATE MATERIALIZED VIEW mv3
  695. WITH (REFRESH AT mz_now()::text::int8 + 2000, REFRESH AT mz_now()::text::int8 + 4000)
  696. AS SELECT * FROM t2;
  697. # Wait until the first refresh
  698. query III rowsort
  699. SELECT * FROM mv3;
  700. ----
  701. NULL -1 -2
  702. 4 NULL 6
  703. 7 8 NULL
  704. 1 2 3
  705. 10 11 12
  706. 30 30 30
  707. 100 100 100
  708. # Wait until we are past the second refresh, which is the last one.
  709. # (See the explanation for the `+2` above at a similar `mz_sleep`.)
  710. statement ok
  711. SELECT mz_unsafe.mz_sleep(2+2);
  712. # This insert will happen after the last refresh.
  713. statement ok
  714. INSERT INTO t2 VALUES (70, 70, 70);
  715. # We should be able to query the MV after the last refresh, and the newly inserted data shouldn't be visible.
  716. query III rowsort
  717. SELECT * FROM mv3;
  718. ----
  719. NULL -1 -2
  720. 4 NULL 6
  721. 7 8 NULL
  722. 1 2 3
  723. 10 11 12
  724. 30 30 30
  725. 100 100 100
  726. # Regression test for https://github.com/MaterializeInc/database-issues/issues/7265
  727. # The sleep makes _optimization_ take a few seconds, so we need to grab read holds in purification right away after
  728. # choosing a timestamp for mz_now.
  729. simple conn=mz_system,user=mz_system
  730. ALTER SYSTEM SET unsafe_enable_unstable_dependencies = true
  731. ----
  732. COMPLETE 0
  733. statement ok
  734. create materialized view mv4 with (refresh at creation) as
  735. select * from
  736. (select mz_unsafe.mz_sleep(3)),
  737. (select * from t2);
  738. # EXPLAIN and EXPLAIN TIMESTAMP on an MV that hasn't had its first refresh yet shouldn't block
  739. # See also `test_explain_timestamp_blocking`
  740. statement ok
  741. CREATE MATERIALIZED VIEW mv5 WITH (REFRESH AT mz_now()::text::int8 + 1000000) AS
  742. SELECT x+y+z from t2;
  743. statement ok
  744. EXPLAIN OPTIMIZED PLAN WITH (humanized expressions) AS VERBOSE TEXT FOR SELECT * FROM mv5;
  745. statement ok
  746. EXPLAIN TIMESTAMP FOR SELECT * FROM mv5;
  747. ## Stacked REFRESH MVs -- both have their first and only refresh in the future, at similar times
  748. statement ok
  749. CREATE MATERIALIZED VIEW mv6 WITH (REFRESH AT mz_now()::text::int8 + 3000) AS
  750. SELECT x-y+z from t2;
  751. statement ok
  752. CREATE MATERIALIZED VIEW mv7 WITH (REFRESH AT mz_now()::text::int8 + 3000) AS
  753. SELECT * from mv6;
  754. query I rowsort
  755. SELECT * FROM mv7
  756. ----
  757. NULL
  758. NULL
  759. NULL
  760. 2
  761. 11
  762. 30
  763. 70
  764. 100
  765. # We now insert something into the underlying table. This shouldn't be visible in mv6, because mv6's refresh shouldn't
  766. # be later than mv7's refresh.
  767. statement ok
  768. INSERT INTO t2 VALUES (0, 0, 0);
  769. query I rowsort
  770. SELECT * FROM mv6
  771. ----
  772. NULL
  773. NULL
  774. NULL
  775. 2
  776. 11
  777. 30
  778. 70
  779. 100
  780. ## REFRESH AT CREATION + REFRESH EVERY ALIGNED TO
  781. ## We create an MV that would be first refreshed only much later, if it were not for the REFRESH AT CREATION.
  782. statement ok
  783. CREATE MATERIALIZED VIEW mv_multiple_refresh_options WITH (
  784. REFRESH AT CREATION,
  785. REFRESH EVERY '1 day' ALIGNED TO mz_now()::text::int8 + 1000000
  786. ) AS
  787. SELECT DISTINCT 5*x FROM t2;
  788. # Should return quickly due to the creation refresh.
  789. query I rowsort
  790. SELECT * FROM mv_multiple_refresh_options;
  791. ----
  792. NULL
  793. 0
  794. 5
  795. 20
  796. 35
  797. 50
  798. 150
  799. 350
  800. 500
  801. ## EXPLAIN shouldn't try to grab read holds in `create_materialized_view_validate`
  802. statement ok
  803. CREATE TABLE t3(x int);
  804. statement ok
  805. INSERT INTO t3 VALUES (5), (6);
  806. statement ok
  807. CREATE MATERIALIZED VIEW mv8 WITH (REFRESH AT CREATION) AS
  808. SELECT DISTINCT x-x FROM t3;
  809. # Sleep until we could no longer grab read holds at the original creation time.
  810. statement ok
  811. SELECT mz_unsafe.mz_sleep(2);
  812. # This would fail to get read holds if it attempted to do so.
  813. statement ok
  814. EXPLAIN REPLAN MATERIALIZED VIEW mv8;
  815. ## Indexes on REFRESH MVs
  816. statement ok
  817. CREATE MATERIALIZED VIEW mvi1 WITH (REFRESH EVERY '8s' ALIGNED TO mz_now()::string::int8 + 2000) AS
  818. SELECT 5*x FROM t3;
  819. statement ok
  820. CREATE DEFAULT INDEX on mvi1;
  821. query I
  822. SELECT * FROM mvi1;
  823. ----
  824. 25
  825. 30
  826. query I
  827. (SELECT * FROM mvi1)
  828. UNION ALL
  829. (SELECT * FROM t3);
  830. ----
  831. 5
  832. 6
  833. 25
  834. 30
  835. statement ok
  836. INSERT INTO t3 values (7);
  837. # Not visible yet.
  838. query I
  839. SELECT * FROM mvi1;
  840. ----
  841. 25
  842. 30
  843. query I
  844. (SELECT * FROM mvi1)
  845. UNION ALL
  846. (SELECT * FROM t3);
  847. ----
  848. 5
  849. 6
  850. 7
  851. 25
  852. 30
  853. statement ok
  854. SELECT mz_unsafe.mz_sleep(8+2);
  855. # Visible now.
  856. query I rowsort
  857. SELECT * FROM mvi1;
  858. ----
  859. 25
  860. 30
  861. 35
  862. query I
  863. (SELECT * FROM mvi1)
  864. UNION ALL
  865. (SELECT * FROM t3);
  866. ----
  867. 5
  868. 6
  869. 7
  870. 25
  871. 30
  872. 35
  873. # First refresh immediately, next one much later.
  874. statement ok
  875. CREATE MATERIALIZED VIEW mvi2 WITH (REFRESH EVERY '10 hours') AS
  876. SELECT DISTINCT x+x+x FROM t3;
  877. statement ok
  878. CREATE DEFAULT INDEX on mvi2;
  879. query I rowsort
  880. SELECT * FROM mvi2;
  881. ----
  882. 15
  883. 18
  884. 21
  885. query I
  886. (SELECT * FROM mvi2)
  887. UNION ALL
  888. (SELECT * FROM t3);
  889. ----
  890. 5
  891. 6
  892. 7
  893. 15
  894. 18
  895. 21
  896. # There is a last refresh.
  897. statement ok
  898. CREATE MATERIALIZED VIEW mvi3 WITH (REFRESH AT CREATION, REFRESH AT mz_now()::string::int8 + 2000) AS
  899. SELECT DISTINCT 5*x FROM t3;
  900. statement ok
  901. CREATE DEFAULT INDEX ON mvi3;
  902. query I rowsort
  903. SELECT * FROM mvi3
  904. ----
  905. 25
  906. 30
  907. 35
  908. query I
  909. (SELECT * FROM mvi3)
  910. UNION ALL
  911. (SELECT * FROM t3);
  912. ----
  913. 5
  914. 6
  915. 7
  916. 25
  917. 30
  918. 35
  919. # Check that it's still queryable after the last refresh, but new input changes are not taken into account.
  920. statement ok
  921. SELECT mz_unsafe.mz_sleep(2+2);
  922. statement ok
  923. INSERT INTO t3 VALUES (-1);
  924. query I rowsort
  925. SELECT * FROM mvi3
  926. ----
  927. 25
  928. 30
  929. 35
  930. query I
  931. (SELECT * FROM mvi3)
  932. UNION ALL
  933. (SELECT * FROM t3);
  934. ----
  935. -1
  936. 5
  937. 6
  938. 7
  939. 25
  940. 30
  941. 35
  942. # ----------------------------------------
  943. # Automated cluster scheduling for REFRESH
  944. # ----------------------------------------
  945. simple conn=mz_system,user=mz_system
  946. ALTER SYSTEM SET enable_cluster_schedule_refresh = false
  947. ----
  948. COMPLETE 0
  949. # Should be disabled
  950. query error db error: ERROR: `SCHEDULE = ON REFRESH` cluster option is not available
  951. CREATE CLUSTER c_schedule_0 (SIZE = '1', SCHEDULE = ON REFRESH);
  952. simple conn=mz_system,user=mz_system
  953. ALTER SYSTEM SET enable_cluster_schedule_refresh = true
  954. ----
  955. COMPLETE 0
  956. # Let's not complicate things with `cluster_refresh_mv_compaction_estimate` at first.
  957. simple conn=mz_system,user=mz_system
  958. ALTER SYSTEM SET cluster_refresh_mv_compaction_estimate = 0
  959. ----
  960. COMPLETE 0
  961. statement error db error: ERROR: Expected one of MANUAL or ON, found identifier "aaaaaaaa"
  962. CREATE CLUSTER c_schedule_0 (SIZE = '1', SCHEDULE = AAAAAAAA);
  963. statement error db error: ERROR: Expected one of MANUAL or ON, found number "42"
  964. CREATE CLUSTER c_schedule_0 (SIZE = '1', SCHEDULE = 42);
  965. statement error db error: ERROR: Expected one of MANUAL or ON, found REFRESH
  966. CREATE CLUSTER c_schedule_0 (SIZE = '1', SCHEDULE = REFRESH);
  967. statement error db error: ERROR: REPLICATION FACTOR cannot be given together with any SCHEDULE other than MANUAL
  968. CREATE CLUSTER c_schedule_0 (SIZE = '1', SCHEDULE = ON REFRESH, REPLICATION FACTOR = 1);
  969. statement ok
  970. CREATE CLUSTER c_schedule_1 (SIZE = '1', SCHEDULE = MANUAL);
  971. statement ok
  972. CREATE CLUSTER c_schedule_2 (SIZE = '1', SCHEDULE MANUAL);
  973. statement ok
  974. CREATE CLUSTER c_schedule_3 (SIZE = '1', SCHEDULE = ON REFRESH);
  975. statement error db error: ERROR: REPLICATION FACTOR cannot be set if the cluster SCHEDULE is anything other than MANUAL
  976. ALTER CLUSTER c_schedule_3 SET (REPLICATION FACTOR = 1);
  977. statement ok
  978. ALTER CLUSTER c_schedule_1 RESET (SCHEDULE);
  979. statement error db error: ERROR: REPLICATION FACTOR cannot be given together with any SCHEDULE other than MANUAL
  980. ALTER CLUSTER c_schedule_1 SET (REPLICATION FACTOR = 1, SCHEDULE = ON REFRESH);
  981. statement ok
  982. ALTER CLUSTER c_schedule_1 SET (SCHEDULE = MANUAL);
  983. statement ok
  984. ALTER CLUSTER c_schedule_1 SET (SCHEDULE = ON REFRESH);
  985. statement ok
  986. SELECT mz_unsafe.mz_sleep(3+2);
  987. # Should turn off.
  988. query I
  989. SELECT replication_factor FROM mz_catalog.mz_clusters WHERE name = 'c_schedule_1';
  990. ----
  991. 0
  992. statement error db error: ERROR: cluster schedules other than MANUAL are not supported for unmanaged clusters
  993. ALTER CLUSTER c_schedule_1 SET (MANAGED = false, SCHEDULE = ON REFRESH);
  994. # The SCHEDULE shouldn't simply "fall off" when switching to unmanaged,
  995. statement error db error: ERROR: when switching a cluster to unmanaged, if the managed cluster's SCHEDULE is anything other than MANUAL, you have to explicitly set the SCHEDULE to MANUAL
  996. ALTER CLUSTER c_schedule_1 SET (MANAGED = false);
  997. # ... but can be explicitly set to MANUAL in the same command.
  998. statement ok
  999. ALTER CLUSTER c_schedule_1 SET (MANAGED = false, SCHEDULE = MANUAL);
  1000. statement ok
  1001. ALTER CLUSTER c_schedule_1 SET (MANAGED = true, SIZE = '1');
  1002. statement ok
  1003. ALTER CLUSTER c_schedule_1 SET (SCHEDULE = ON REFRESH (HYDRATION TIME ESTIMATE = '0 seconds'));
  1004. # Setting some other cluster option in ALTER CLUSTER shouldn't change the SCHEDULE.
  1005. # (The sleep is needed so that if the following ALTER erroneously sets the SCHEDULE to MANUAL, then we should be in a
  1006. # turned off state at that moment to trigger errors in later tests.)
  1007. statement ok
  1008. SELECT mz_unsafe.mz_sleep(3);
  1009. statement ok
  1010. ALTER CLUSTER c_schedule_1 SET (INTROSPECTION DEBUGGING = TRUE);
  1011. statement ok
  1012. ALTER CLUSTER c_schedule_1 RESET (INTROSPECTION DEBUGGING);
  1013. statement ok
  1014. CREATE CLUSTER unmanaged1 (SCHEDULE = MANUAL, REPLICAS (r1 (SIZE '1')))
  1015. statement ok
  1016. ALTER cluster unmanaged1 SET (SCHEDULE = MANUAL);
  1017. statement error db error: ERROR: cluster schedules other than MANUAL are not supported for unmanaged clusters
  1018. ALTER cluster unmanaged1 SET (SCHEDULE = ON REFRESH);
  1019. statement error db error: ERROR: REPLICATION FACTOR cannot be given together with any SCHEDULE other than MANUAL
  1020. ALTER cluster unmanaged1 SET (managed = true, SCHEDULE = ON REFRESH, REPLICATION FACTOR = 1, SIZE = '1');
  1021. statement error db error: ERROR: cluster schedules other than MANUAL are not supported for unmanaged clusters
  1022. CREATE CLUSTER unmanaged2 (SCHEDULE = ON REFRESH, REPLICAS (r1 (SIZE '1')))
  1023. statement ok
  1024. CREATE CLUSTER c_schedule_5 (SIZE = '1');
  1025. statement error db error: ERROR: Expected one of OWNER or RENAME or RESET or SET or SWAP, found left parenthesis
  1026. ALTER CLUSTER c_schedule_5 (MANAGED = false, SCHEDULE = REFRESH);
  1027. statement ok
  1028. CREATE MATERIALIZED VIEW mv9
  1029. IN CLUSTER c_schedule_1
  1030. WITH (REFRESH = EVERY '8 sec')
  1031. AS SELECT sum(x*y*z) + count(*) FROM t2;
  1032. query I
  1033. SELECT * FROM mv9;
  1034. ----
  1035. 1371335
  1036. statement ok
  1037. INSERT INTO t2 VALUES (1, 0, 1);
  1038. statement ok
  1039. SELECT mz_unsafe.mz_sleep(8+2);
  1040. query I
  1041. SELECT * FROM mv9;
  1042. ----
  1043. 1371336
  1044. statement ok
  1045. CREATE MATERIALIZED VIEW mv10
  1046. IN CLUSTER c_schedule_1
  1047. WITH (REFRESH AT CREATION)
  1048. AS SELECT count(*) FROM t2;
  1049. query I
  1050. SELECT * FROM mv10
  1051. ----
  1052. 10
  1053. # The other refresh cluster should be off, because there is no refresh MV on it yet.
  1054. query I
  1055. SELECT replication_factor FROM mz_catalog.mz_clusters WHERE name = 'c_schedule_3';
  1056. ----
  1057. 0
  1058. # A `REFRESH AT CREATION` MV alone on a cluster should make the cluster turn on.
  1059. statement ok
  1060. CREATE MATERIALIZED VIEW mv11
  1061. IN CLUSTER c_schedule_3
  1062. WITH (REFRESH AT CREATION)
  1063. AS SELECT count(*) FROM t2;
  1064. query I
  1065. SELECT * FROM mv11
  1066. ----
  1067. 10
  1068. ## Very short refresh interval.
  1069. statement ok
  1070. CREATE CLUSTER c_schedule_4 (SIZE = '1', SCHEDULE = ON REFRESH);
  1071. statement ok
  1072. CREATE MATERIALIZED VIEW mv12
  1073. IN CLUSTER c_schedule_4
  1074. WITH (REFRESH EVERY '1 millisecond')
  1075. AS SELECT count(*) FROM t2;
  1076. query I
  1077. SELECT * FROM mv12
  1078. ----
  1079. 10
  1080. statement ok
  1081. INSERT INTO t2 VALUES (1, 1, 10);
  1082. query I
  1083. SELECT * FROM mv12
  1084. ----
  1085. 11
  1086. # This should set the schedule back to manual.
  1087. statement ok
  1088. ALTER CLUSTER c_schedule_4 RESET (SCHEDULE);
  1089. statement ok
  1090. ALTER CLUSTER c_schedule_4 SET (REPLICATION FACTOR = 0);
  1091. statement ok
  1092. SELECT mz_unsafe.mz_sleep(3);
  1093. # Should stay off, because it was reset to manual.
  1094. query I
  1095. SELECT replication_factor FROM mz_catalog.mz_clusters WHERE name = 'c_schedule_4';
  1096. ----
  1097. 0
  1098. ## HYDRATION TIME ESTIMATE
  1099. statement error db error: ERROR: Expected literal string, found number "0"
  1100. CREATE CLUSTER c_bad (SIZE = '1', SCHEDULE = ON REFRESH (HYDRATION TIME ESTIMATE = 0));
  1101. statement error db error: ERROR: HYDRATION TIME ESTIMATE must be non\-negative; got: \-01:00:00
  1102. CREATE CLUSTER c_bad (SIZE = '1', SCHEDULE = ON REFRESH (HYDRATION TIME ESTIMATE = '-1 hour'));
  1103. statement error db error: ERROR: invalid input syntax for type interval: unknown units aaaa: "1 aaaa"
  1104. CREATE CLUSTER c_bad (SIZE = '1', SCHEDULE = ON REFRESH (HYDRATION TIME ESTIMATE = '1 aaaa'));
  1105. statement error db error: ERROR: HYDRATION TIME ESTIMATE must not involve units larger than days
  1106. CREATE CLUSTER c_bad (SIZE = '1', SCHEDULE = ON REFRESH (HYDRATION TIME ESTIMATE = '1 month'));
  1107. statement error db error: ERROR: invalid input syntax for type interval: Overflows maximum days; cannot exceed 2147483647/\-2147483648 days: "1000000000000 days"
  1108. CREATE CLUSTER c_bad (SIZE = '1', SCHEDULE = ON REFRESH (HYDRATION TIME ESTIMATE = '1000000000000 days'));
  1109. # ----------------------------------------
  1110. # Introspection
  1111. # ----------------------------------------
  1112. query TTTBB
  1113. SELECT
  1114. name,
  1115. type,
  1116. interval,
  1117. now() - aligned_to < INTERVAL '30 minutes',
  1118. now() - at < INTERVAL '30 minutes'
  1119. FROM mz_internal.mz_materialized_view_refresh_strategies mvrs, mz_catalog.mz_materialized_views mv
  1120. WHERE mv.id = mvrs.materialized_view_id
  1121. ORDER BY name;
  1122. ----
  1123. const_mv every 24:00:00 true NULL
  1124. const_mv2 at NULL NULL true
  1125. mv on-commit NULL NULL NULL
  1126. mv10 at NULL NULL true
  1127. mv11 at NULL NULL true
  1128. mv12 every 00:00:00.001 true NULL
  1129. mv3 at NULL NULL true
  1130. mv3 at NULL NULL true
  1131. mv4 at NULL NULL true
  1132. mv5 at NULL NULL true
  1133. mv6 at NULL NULL true
  1134. mv7 at NULL NULL true
  1135. mv8 at NULL NULL true
  1136. mv9 every 00:00:08 true NULL
  1137. mv_aligned_to_future every 00:00:10 true NULL
  1138. mv_aligned_to_past every 00:00:10 true NULL
  1139. mv_assertion_at_begin on-commit NULL NULL NULL
  1140. mv_assertion_at_end on-commit NULL NULL NULL
  1141. mv_assertion_plus_refresh_every every 00:00:08 true NULL
  1142. mv_desugar1 at NULL NULL true
  1143. mv_desugar2 every 24:00:00 true NULL
  1144. mv_good_assertion_on_renamed_column on-commit NULL NULL NULL
  1145. mv_greatest at NULL NULL true
  1146. mv_misordered_assertions on-commit NULL NULL NULL
  1147. mv_multiple_refresh_options at NULL NULL true
  1148. mv_multiple_refresh_options every 24:00:00 true NULL
  1149. mv_no_assertions on-commit NULL NULL NULL
  1150. mv_no_creation_refresh every 27:46:40 true NULL
  1151. mv_on_commit on-commit NULL NULL NULL
  1152. mv_two_assertions on-commit NULL NULL NULL
  1153. mvi1 every 00:00:08 true NULL
  1154. mvi2 every 10:00:00 true NULL
  1155. mvi3 at NULL NULL true
  1156. mvi3 at NULL NULL true
  1157. statement ok
  1158. CREATE CLUSTER c_schedule_hydration_time_estimate (SIZE = '1', SCHEDULE = ON REFRESH (HYDRATION TIME ESTIMATE = '995 seconds'));
  1159. # Make the above cluster turn on, so that we can test how the HYDRATION TIME ESTIMATE looks in `mz_audit_events`.
  1160. statement ok
  1161. CREATE MATERIALIZED VIEW mv_rte
  1162. IN CLUSTER c_schedule_hydration_time_estimate
  1163. WITH (REFRESH EVERY '1 sec') AS SELECT * FROM t2;
  1164. query TTT
  1165. SELECT name, cs.type, cs.refresh_hydration_time_estimate
  1166. FROM mz_internal.mz_cluster_schedules cs, mz_catalog.mz_clusters c
  1167. WHERE c.id = cs.cluster_id
  1168. AND name LIKE 'c_schedule_%'
  1169. ORDER BY name;
  1170. ----
  1171. c_schedule_1 on-refresh 00:00:00
  1172. c_schedule_2 manual NULL
  1173. c_schedule_3 on-refresh 00:00:00
  1174. c_schedule_4 manual NULL
  1175. c_schedule_5 manual NULL
  1176. c_schedule_hydration_time_estimate on-refresh 00:16:35
  1177. statement ok
  1178. SELECT mz_unsafe.mz_sleep(4);
  1179. query TTTTBT rowsort
  1180. SELECT DISTINCT
  1181. event_type,
  1182. object_type,
  1183. (details->'cluster_name')::text,
  1184. (details->'reason')::text,
  1185. (details->'scheduling_policies') IS NULL,
  1186. regexp_replace((details->'scheduling_policies'->'on_refresh')::text, '\["u.*"\]', '["uXXX"]')
  1187. FROM mz_audit_events
  1188. WHERE
  1189. event_type IN ('create', 'drop') AND
  1190. object_type = 'cluster-replica' AND
  1191. ((details->'cluster_name')::text LIKE '"c_schedule_%"' OR (details->'cluster_name')::text = '"other"');
  1192. ----
  1193. drop cluster-replica "other" "manual" true NULL
  1194. create cluster-replica "other" "manual" true NULL
  1195. drop cluster-replica "c_schedule_4" "manual" true NULL
  1196. create cluster-replica "c_schedule_1" "manual" true NULL
  1197. create cluster-replica "c_schedule_2" "manual" true NULL
  1198. create cluster-replica "c_schedule_5" "manual" true NULL
  1199. drop cluster-replica "c_schedule_1" "schedule" false {"decision":"off","hydration_time_estimate":"00:00:00","objects_needing_compaction":[],"objects_needing_refresh":[]}
  1200. drop cluster-replica "c_schedule_3" "schedule" false {"decision":"off","hydration_time_estimate":"00:00:00","objects_needing_compaction":[],"objects_needing_refresh":[]}
  1201. create cluster-replica "c_schedule_1" "schedule" false {"decision":"on","hydration_time_estimate":"00:00:00","objects_needing_compaction":[],"objects_needing_refresh":["uXXX"]}
  1202. create cluster-replica "c_schedule_3" "schedule" false {"decision":"on","hydration_time_estimate":"00:00:00","objects_needing_compaction":[],"objects_needing_refresh":["uXXX"]}
  1203. create cluster-replica "c_schedule_4" "schedule" false {"decision":"on","hydration_time_estimate":"00:00:00","objects_needing_compaction":[],"objects_needing_refresh":["uXXX"]}
  1204. create cluster-replica "c_schedule_hydration_time_estimate" "schedule" false {"decision":"on","hydration_time_estimate":"00:16:35","objects_needing_compaction":[],"objects_needing_refresh":["uXXX"]}
  1205. ## Now test `cluster_refresh_mv_compaction_estimate`.
  1206. ## (This would make the above audit test flaky, so it should be after that.)
  1207. simple conn=mz_system,user=mz_system
  1208. ALTER SYSTEM SET cluster_refresh_mv_compaction_estimate = 1200000
  1209. ----
  1210. COMPLETE 0
  1211. statement ok
  1212. CREATE CLUSTER c_schedule_6 (SIZE = '1', SCHEDULE = ON REFRESH);
  1213. query I
  1214. SELECT replication_factor FROM mz_catalog.mz_clusters WHERE name = 'c_schedule_6';
  1215. ----
  1216. 0
  1217. statement ok
  1218. CREATE MATERIALIZED VIEW mv13
  1219. IN CLUSTER c_schedule_6
  1220. WITH (REFRESH AT CREATION)
  1221. AS SELECT sum(x*y) - count(*) AS r FROM t2;
  1222. # Wait until the first refresh is complete.
  1223. query I
  1224. SELECT r+r FROM mv13;
  1225. ----
  1226. 31916
  1227. # We'd turn it off at the next scheduling decision if it were not for `cluster_refresh_mv_compaction_estimate`
  1228. statement ok
  1229. SELECT mz_unsafe.mz_sleep(3+1+1);
  1230. query I
  1231. SELECT replication_factor FROM mz_catalog.mz_clusters WHERE name = 'c_schedule_6';
  1232. ----
  1233. 1
  1234. simple conn=mz_system,user=mz_system
  1235. ALTER SYSTEM SET cluster_refresh_mv_compaction_estimate = 0
  1236. ----
  1237. COMPLETE 0
  1238. # Should turn off at the next scheduling decision.
  1239. statement ok
  1240. SELECT mz_unsafe.mz_sleep(3+1+1);
  1241. query I
  1242. SELECT replication_factor FROM mz_catalog.mz_clusters WHERE name = 'c_schedule_6';
  1243. ----
  1244. 0
  1245. simple conn=mz_system,user=mz_system
  1246. ALTER SYSTEM SET cluster_refresh_mv_compaction_estimate = 120000
  1247. ----
  1248. COMPLETE 0
  1249. # Should turn on at the next scheduling decision.
  1250. statement ok
  1251. SELECT mz_unsafe.mz_sleep(3+1+1);
  1252. query I
  1253. SELECT replication_factor FROM mz_catalog.mz_clusters WHERE name = 'c_schedule_6';
  1254. ----
  1255. 1
  1256. # The audit events should now have a row that has a non-empty `objects_needing_compaction`.
  1257. query TTTTBT rowsort
  1258. SELECT DISTINCT
  1259. event_type,
  1260. object_type,
  1261. (details->'cluster_name')::text,
  1262. (details->'reason')::text,
  1263. (details->'scheduling_policies') IS NULL,
  1264. regexp_replace((details->'scheduling_policies'->'on_refresh')::text, '\["u.*"\]', '["uXXX"]')
  1265. FROM mz_audit_events
  1266. WHERE
  1267. event_type IN ('create', 'drop') AND
  1268. object_type = 'cluster-replica' AND
  1269. (details->'cluster_name')::text = '"c_schedule_6"';
  1270. ----
  1271. drop cluster-replica "c_schedule_6" "schedule" false {"decision":"off","hydration_time_estimate":"00:00:00","objects_needing_compaction":[],"objects_needing_refresh":[]}
  1272. create cluster-replica "c_schedule_6" "schedule" false {"decision":"on","hydration_time_estimate":"00:00:00","objects_needing_compaction":["uXXX"],"objects_needing_refresh":[]}
  1273. create cluster-replica "c_schedule_6" "schedule" false {"decision":"on","hydration_time_estimate":"00:00:00","objects_needing_compaction":[],"objects_needing_refresh":["uXXX"]}
  1274. simple conn=mz_system,user=mz_system
  1275. ALTER SYSTEM SET cluster_refresh_mv_compaction_estimate = 0
  1276. ----
  1277. COMPLETE 0
  1278. ## EXPLAIN FILTER PUSHDOWN can be run on materialized views in this file
  1279. simple conn=mz_system,user=mz_system
  1280. ALTER SYSTEM SET enable_explain_pushdown = true
  1281. ----
  1282. COMPLETE 0
  1283. # Pulling stats for refresh-every and similar MVs can time out,
  1284. # since data may not yet be available...
  1285. statement ok
  1286. SET statement_timeout = '1s'
  1287. statement ok
  1288. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW const_mv;
  1289. statement ok
  1290. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW const_mv2;
  1291. statement ok
  1292. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv;
  1293. statement ok
  1294. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv3;
  1295. statement ok
  1296. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv5;
  1297. statement ok
  1298. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv8;
  1299. statement ok
  1300. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv9;
  1301. statement ok
  1302. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv12;
  1303. statement ok
  1304. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_aligned_to_future;
  1305. statement ok
  1306. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_aligned_to_past;
  1307. statement ok
  1308. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_assertion_at_begin;
  1309. statement ok
  1310. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_assertion_at_end;
  1311. statement ok
  1312. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_assertion_plus_refresh_every;
  1313. statement ok
  1314. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_desugar1;
  1315. statement ok
  1316. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_desugar2;
  1317. statement ok
  1318. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_good_assertion_on_renamed_column;
  1319. statement ok
  1320. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_greatest;
  1321. statement ok
  1322. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_misordered_assertions;
  1323. statement ok
  1324. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_multiple_refresh_options;
  1325. statement ok
  1326. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_multiple_refresh_options;
  1327. statement ok
  1328. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_no_assertions;
  1329. statement ok
  1330. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_no_creation_refresh;
  1331. statement ok
  1332. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_on_commit;
  1333. statement ok
  1334. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv_two_assertions;
  1335. statement ok
  1336. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mvi1;
  1337. statement ok
  1338. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mvi2;
  1339. statement ok
  1340. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mvi3;
  1341. statement ok
  1342. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mvi3;
  1343. # Attempting to explain MVs which are not readable at the current time can block
  1344. statement error db error: ERROR: canceling statement due to statement timeout
  1345. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv4;
  1346. statement error db error: ERROR: canceling statement due to statement timeout
  1347. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv10;
  1348. statement error db error: ERROR: canceling statement due to statement timeout
  1349. EXPLAIN FILTER PUSHDOWN FOR MATERIALIZED VIEW mv11;
  1350. simple conn=mz_system,user=mz_system
  1351. ALTER SYSTEM SET enable_explain_pushdown = false
  1352. ----
  1353. COMPLETE 0
  1354. query T multiline
  1355. SELECT regexp_replace(create_sql, 'AT \d+', 'XXX', 'g') FROM (SHOW CREATE MATERIALIZED VIEW mvi3);
  1356. ----
  1357. CREATE MATERIALIZED VIEW materialize.public.mvi3
  1358. IN CLUSTER quickstart
  1359. WITH (
  1360. REFRESH = XXX::mz_catalog.mz_timestamp,
  1361. REFRESH = XXX::mz_catalog.mz_timestamp::pg_catalog.text::pg_catalog.int8 + 2000
  1362. )
  1363. AS SELECT DISTINCT 5 * x FROM materialize.public.t3;
  1364. EOF