2020import io .trino .spi .connector .SchemaTableName ;
2121import io .trino .sql .tree .ExplainType ;
2222import io .trino .testing .AbstractTestQueryFramework ;
23- import io .trino .testing .MaterializedResult ;
2423import io .trino .testing .MaterializedRow ;
2524import io .trino .transaction .TransactionId ;
2625import io .trino .transaction .TransactionManager ;
@@ -298,58 +297,42 @@ public void testCreateRefreshSelect()
298297 // 4. Select the data from refreshed materialized view, verify the number of rows in the result
299298 // 5. Ensure that the plan uses the storage table
300299 // 6. In some cases validate the result data
301- MaterializedResult baseResult = computeActual ("SELECT * from materialized_view_no_part" );
302- assertEquals (baseResult .getRowCount (), 6 );
303- String plan = getExplainPlan ("SELECT * from materialized_view_no_part" , ExplainType .Type .IO );
304- assertThat (plan ).contains ("base_table1" );
300+ assertEquals (computeActual ("SELECT * FROM materialized_view_no_part" ).getRowCount (), 6 );
301+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_no_part" , ExplainType .Type .IO ))
302+ .contains ("base_table1" );
305303 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_no_part" , 6 );
306- MaterializedResult viewResult = computeActual ("SELECT * from materialized_view_no_part" );
307- assertEquals (viewResult .getRowCount (), 6 );
308- plan = getExplainPlan ("SELECT * from materialized_view_no_part" , ExplainType .Type .IO );
309- assertThat (plan ).doesNotContain ("base_table1" );
310-
311- baseResult = computeActual ("SELECT * from materialized_view_agg" );
312- assertEquals (baseResult .getRowCount (), 3 );
313- plan = getExplainPlan ("SELECT * from materialized_view_agg" , ExplainType .Type .IO );
314- assertThat (plan ).contains ("base_table1" );
304+ assertEquals (computeActual ("SELECT * FROM materialized_view_no_part" ).getRowCount (), 6 );
305+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_no_part" , ExplainType .Type .IO )).doesNotContain ("base_table1" );
306+
307+ assertEquals (computeActual ("SELECT * FROM materialized_view_agg" ).getRowCount (), 3 );
308+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_agg" , ExplainType .Type .IO ))
309+ .contains ("base_table1" );
315310 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_agg" , 3 );
316- viewResult = computeActual ("SELECT * from materialized_view_agg" );
317- assertEquals (viewResult .getRowCount (), 3 );
318- plan = getExplainPlan ("SELECT * from materialized_view_agg" , ExplainType .Type .IO );
319- assertThat (plan ).doesNotContain ("base_table1" );
320- assertQuery (session , "SELECT * from materialized_view_agg" , "VALUES (DATE '2019-09-10', 2)," +
311+ assertEquals (computeActual ("SELECT * FROM materialized_view_agg" ).getRowCount (), 3 );
312+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_agg" , ExplainType .Type .IO ))
313+ .doesNotContain ("base_table1" );
314+ assertQuery (session , "SELECT * FROM materialized_view_agg" , "VALUES (DATE '2019-09-10', 2)," +
321315 "(DATE '2019-09-08', 1), (DATE '2019-09-09', 3)" );
322316
323- baseResult = computeActual ("SELECT * from materialized_view_part" );
324- assertEquals (baseResult .getRowCount (), 3 );
325- plan = getExplainPlan ("SELECT * from materialized_view_part" , ExplainType .Type .IO );
326- assertThat (plan ).contains ("base_table1" );
317+ assertEquals (computeActual ("SELECT * FROM materialized_view_part" ).getRowCount (), 3 );
318+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_part" , ExplainType .Type .IO ))
319+ .contains ("base_table1" );
327320 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_part" , 3 );
328- viewResult = computeActual ("SELECT * from materialized_view_part" );
329- assertEquals (viewResult .getRowCount (), 3 );
330- plan = getExplainPlan ("SELECT * from materialized_view_part" , ExplainType .Type .IO );
331- assertThat (plan ).doesNotContain ("base_table1" );
332-
333- baseResult = computeActual ("SELECT * from materialized_view_join" );
334- assertEquals (baseResult .getRowCount (), 5 );
335- plan = getExplainPlan ("SELECT * from materialized_view_join" , ExplainType .Type .IO );
336- assertThat (plan ).contains ("base_table1" , "base_table2" );
321+ assertEquals (computeActual ("SELECT * FROM materialized_view_part" ).getRowCount (), 3 );
322+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_part" , ExplainType .Type .IO )).doesNotContain ("base_table1" );
323+
324+ assertEquals (computeActual ("SELECT * FROM materialized_view_join" ).getRowCount (), 5 );
325+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_join" , ExplainType .Type .IO )).contains ("base_table1" , "base_table2" );
337326 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_join" , 5 );
338- viewResult = computeActual ("SELECT * from materialized_view_join" );
339- assertEquals (viewResult .getRowCount (), 5 );
340- plan = getExplainPlan ("SELECT * from materialized_view_join" , ExplainType .Type .IO );
341- assertThat (plan ).doesNotContain ("base_table1" , "base_table2" );
342-
343- baseResult = computeActual ("SELECT * from materialized_view_join_part" );
344- assertEquals (baseResult .getRowCount (), 4 );
345- plan = getExplainPlan ("SELECT * from materialized_view_join_part" , ExplainType .Type .IO );
346- assertThat (plan ).contains ("base_table1" , "base_table2" );
327+ assertEquals (computeActual ("SELECT * FROM materialized_view_join" ).getRowCount (), 5 );
328+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_join" , ExplainType .Type .IO )).doesNotContain ("base_table1" , "base_table2" );
329+
330+ assertEquals (computeActual ("SELECT * FROM materialized_view_join_part" ).getRowCount (), 4 );
331+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_join_part" , ExplainType .Type .IO )).contains ("base_table1" , "base_table2" );
347332 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_join_part" , 4 );
348- viewResult = computeActual ("SELECT * from materialized_view_join_part" );
349- assertEquals (viewResult .getRowCount (), 4 );
350- plan = getExplainPlan ("SELECT * from materialized_view_join_part" , ExplainType .Type .IO );
351- assertThat (plan ).doesNotContain ("base_table1" , "base_table2" );
352- assertQuery (session , "SELECT * from materialized_view_join_part" , "VALUES (2, 'a', DATE '2019-09-09', 1), " +
333+ assertEquals (computeActual ("SELECT * FROM materialized_view_join_part" ).getRowCount (), 4 );
334+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_join_part" , ExplainType .Type .IO )).doesNotContain ("base_table1" , "base_table2" );
335+ assertQuery (session , "SELECT * FROM materialized_view_join_part" , "VALUES (2, 'a', DATE '2019-09-09', 1), " +
353336 "(0, 'a', DATE '2019-09-08', 2), (3, 'a', DATE '2019-09-09', 1), (1, 'a', DATE '2019-09-09', 1)" );
354337
355338 assertUpdate ("DROP MATERIALIZED VIEW materialized_view_no_part" );
@@ -370,43 +353,43 @@ public void testDetectStaleness()
370353 assertUpdate ("INSERT INTO base_table4 VALUES ('a', 0, DATE '2019-09-08'), ('a', 1, DATE '2019-09-08'), ('a', 0, DATE '2019-09-09')" , 3 );
371354
372355 // A partitioned materialized view with grouping and aggregation
373- assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_part_stale WITH (partitioning = ARRAY['_date']) as select _date, count(_date) as num_dates from base_table3 group by 1" );
356+ assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_part_stale WITH (partitioning = ARRAY['_date']) AS SELECT _date, count(_date) AS num_dates FROM base_table3 GROUP BY 1" );
374357 // A non-partitioned join materialized view
375358 assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_join_stale as " +
376- "select t2._bigint, _varchar, t1._date from base_table3 t1, base_table4 t2 where t1._date = t2._date" );
359+ "SELECT t2._bigint, _varchar, t1._date FROM base_table3 t1, base_table4 t2 WHERE t1._date = t2._date" );
377360 // A partitioned join materialized view
378361 assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_join_part_stale WITH (partitioning = ARRAY['_date', '_bigint']) as " +
379- "select t1._bigint, _varchar, t2._date, sum(1) as my_sum from base_table3 t1, base_table4 t2 where t1._date = t2._date group by 1, 2, 3 order by 1, 2" );
362+ "SELECT t1._bigint, _varchar, t2._date, sum(1) AS my_sum FROM base_table3 t1, base_table4 t2 WHERE t1._date = t2._date GROUP BY 1, 2, 3 ORDER BY 1, 2" );
380363
381364 // Ensure that when data is inserted into base table, materialized view is rendered stale. Note that, currently updates and deletes to/from iceberg tables is not supported.
382365 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_part_stale" , 2 );
383366 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_join_stale" , 4 );
384367 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_join_part_stale" , 3 );
385368
386369 assertUpdate ("INSERT INTO base_table3 VALUES (3, DATE '2019-09-09'), (4, DATE '2019-09-10'), (5, DATE '2019-09-10')" , 3 );
387- String plan = getExplainPlan ("SELECT * from materialized_view_part_stale" , ExplainType .Type .IO );
388- assertThat ( plan ) .contains ("base_table3" );
370+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_part_stale" , ExplainType .Type .IO ))
371+ .contains ("base_table3" );
389372
390- plan = getExplainPlan ("SELECT * from materialized_view_join_stale" , ExplainType .Type .IO );
391373 Condition <String > containsTable3 = new Condition <>(p -> p .contains ("base_table3" ), "base_table3" );
392374 Condition <String > containsTable4 = new Condition <>(p -> p .contains ("base_table4" ), "base_table4" );
393- assertThat (plan ).is (anyOf (containsTable3 , containsTable4 ));
375+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_join_stale" , ExplainType .Type .IO ))
376+ .is (anyOf (containsTable3 , containsTable4 ));
394377
395- plan = getExplainPlan ("SELECT * from materialized_view_join_part_stale" , ExplainType .Type .IO );
396- assertThat ( plan ) .is (anyOf (containsTable3 , containsTable4 ));
378+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_join_part_stale" , ExplainType .Type .IO ))
379+ .is (anyOf (containsTable3 , containsTable4 ));
397380
398381 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_part_stale" , 3 );
399382 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_join_stale" , 5 );
400383 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_join_part_stale" , 4 );
401384
402- plan = getExplainPlan ("SELECT * from materialized_view_part_stale" , ExplainType .Type .IO );
403- assertThat ( plan ) .doesNotContain ("base_table3" );
385+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_part_stale" , ExplainType .Type .IO ))
386+ .doesNotContain ("base_table3" );
404387
405- plan = getExplainPlan ("SELECT * from materialized_view_join_stale" , ExplainType .Type .IO );
406- assertThat ( plan ) .doesNotContain ("base_table3" , "base_table4" );
388+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_join_stale" , ExplainType .Type .IO ))
389+ .doesNotContain ("base_table3" , "base_table4" );
407390
408- plan = getExplainPlan ("SELECT * from materialized_view_join_part_stale" , ExplainType .Type .IO );
409- assertThat ( plan ) .doesNotContain ("base_table3" , "base_table4" );
391+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_join_part_stale" , ExplainType .Type .IO ))
392+ .doesNotContain ("base_table3" , "base_table4" );
410393
411394 assertUpdate ("DROP TABLE IF EXISTS base_table3" );
412395 assertUpdate ("DROP TABLE IF EXISTS base_table4" );
@@ -421,30 +404,30 @@ public void testSqlFeatures()
421404 String schema = getSession ().getSchema ().orElseThrow ();
422405
423406 // Materialized views to test SQL features
424- assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_window WITH (partitioning = ARRAY['_date']) as select _date, " +
425- "sum(_bigint) OVER (partition by _date order by _date) as sum_ints from base_table1" );
407+ assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_window WITH (partitioning = ARRAY['_date']) AS SELECT _date, " +
408+ "sum(_bigint) OVER (PARTITION BY _date ORDER BY _date) as sum_ints from base_table1" );
426409 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_window" , 6 );
427- assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_union WITH (partitioning = ARRAY['_date']) as " +
428- "select _date, count(_date) as num_dates from base_table1 group by 1 union " +
410+ assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_union WITH (partitioning = ARRAY['_date']) AS " +
411+ "select _date, count(_date) as num_dates from base_table1 group by 1 UNION " +
429412 "select _date, count(_date) as num_dates from base_table2 group by 1" );
430413 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_union" , 5 );
431- assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_subquery WITH (partitioning = ARRAY['_date']) as " +
432- "select _date, count(_date) as num_dates from base_table1 where _date = (select max(_date) from base_table2) group by 1" );
414+ assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_subquery WITH (partitioning = ARRAY['_date']) AS " +
415+ "SELECT _date, count(_date) AS num_dates FROM base_table1 WHERE _date = (select max(_date) FROM base_table2) GROUP BY 1" );
433416 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_subquery" , 1 );
434417
435418 // This set of tests intend to test various SQL features in the context of materialized views. It also tests commands pertaining to materialized views.
436- String plan = getExplainPlan ("SELECT * from materialized_view_window" , ExplainType .Type .IO );
437- assertThat ( plan ) .doesNotContain ("base_table1" );
438- plan = getExplainPlan ("SELECT * from materialized_view_union" , ExplainType .Type .IO );
439- assertThat ( plan ) .doesNotContain ("base_table1" );
440- plan = getExplainPlan ("SELECT * from materialized_view_subquery" , ExplainType .Type .IO );
441- assertThat ( plan ) .doesNotContain ("base_table1" );
419+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_window" , ExplainType .Type .IO ))
420+ .doesNotContain ("base_table1" );
421+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_union" , ExplainType .Type .IO ))
422+ .doesNotContain ("base_table1" );
423+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_subquery" , ExplainType .Type .IO ))
424+ .doesNotContain ("base_table1" );
442425
443426 String qualifiedMaterializedViewName = "iceberg." + schema + ".materialized_view_window" ;
444- assertQueryFails ("show create view materialized_view_window" ,
427+ assertQueryFails ("SHOW CREATE VIEW materialized_view_window" ,
445428 "line 1:1: Relation '" + qualifiedMaterializedViewName + "' is a materialized view, not a view" );
446429
447- assertThat ((String ) computeScalar ("show create materialized view materialized_view_window" ))
430+ assertThat ((String ) computeScalar ("SHOW CREATE MATERIALIZED VIEW materialized_view_window" ))
448431 .matches ("\\ QCREATE MATERIALIZED VIEW " + qualifiedMaterializedViewName + "\n " +
449432 "WITH (\n " +
450433 " format = 'ORC',\n " +
@@ -462,16 +445,11 @@ public void testSqlFeatures()
462445 assertQueryFails ("INSERT INTO materialized_view_window VALUES (0, '2019-09-08'), (1, DATE '2019-09-09'), (2, DATE '2019-09-09')" ,
463446 "Inserting into materialized views is not supported" );
464447
465- MaterializedResult result = computeActual ("explain (type logical) refresh materialized view materialized_view_window" );
466- assertEquals (result .getRowCount (), 1 );
467- result = computeActual ("explain (type distributed) refresh materialized view materialized_view_window" );
468- assertEquals (result .getRowCount (), 1 );
469- result = computeActual ("explain (type validate) refresh materialized view materialized_view_window" );
470- assertEquals (result .getRowCount (), 1 );
471- result = computeActual ("explain (type io) refresh materialized view materialized_view_window" );
472- assertEquals (result .getRowCount (), 1 );
473- result = computeActual ("explain analyze refresh materialized view materialized_view_window" );
474- assertEquals (result .getRowCount (), 1 );
448+ computeScalar ("EXPLAIN (TYPE LOGICAL) REFRESH MATERIALIZED VIEW materialized_view_window" );
449+ computeScalar ("EXPLAIN (TYPE DISTRIBUTED) REFRESH MATERIALIZED VIEW materialized_view_window" );
450+ computeScalar ("EXPLAIN (TYPE VALIDATE) REFRESH MATERIALIZED VIEW materialized_view_window" );
451+ computeScalar ("EXPLAIN (TYPE IO) REFRESH MATERIALIZED VIEW materialized_view_window" );
452+ computeScalar ("EXPLAIN ANALYZE REFRESH MATERIALIZED VIEW materialized_view_window" );
475453
476454 assertUpdate ("DROP MATERIALIZED VIEW materialized_view_window" );
477455 assertUpdate ("DROP MATERIALIZED VIEW materialized_view_union" );
@@ -486,11 +464,12 @@ public void testReplace()
486464 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_replace" , 3 );
487465
488466 assertUpdate ("CREATE OR REPLACE MATERIALIZED VIEW materialized_view_replace as select sum(1) as num_rows from base_table2" );
489- String plan = getExplainPlan ("SELECT * from materialized_view_replace" , ExplainType .Type .IO );
490- assertThat ( plan ) .contains ("base_table2" );
467+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_replace" , ExplainType .Type .IO ))
468+ .contains ("base_table2" );
491469 assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_replace" , 1 );
492- MaterializedResult viewResult = computeActual ("SELECT * from materialized_view_replace" );
493- assertEquals (viewResult .getRowCount (), 1 );
470+ computeScalar ("SELECT * FROM materialized_view_replace" );
471+ assertThat (query ("SELECT * FROM materialized_view_replace" ))
472+ .matches ("VALUES BIGINT '3'" );
494473
495474 assertUpdate ("DROP MATERIALIZED VIEW materialized_view_replace" );
496475 }
@@ -537,24 +516,24 @@ public void testNestedMaterializedViews()
537516 assertUpdate ("CREATE MATERIALIZED VIEW materialized_view_level2 WITH (partitioning = ARRAY['_date']) as select _date, num_dates from materialized_view_level1" );
538517
539518 // Unrefreshed 2nd level materialized view .. resolves to base table
540- String plan = getExplainPlan ("select * from materialized_view_level2" , ExplainType .Type .IO );
541- assertThat (plan ).contains ("base_table5" );
542- assertUpdate ("refresh materialized view materialized_view_level2" , 2 );
543- plan = getExplainPlan ("select * from materialized_view_level2" , ExplainType .Type .IO );
519+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_level2" , ExplainType .Type .IO ))
520+ .contains ("base_table5" );
521+ assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_level2" , 2 );
544522
545523 // Refreshed 2nd level materialized view .. resolves to storage table
546- assertThat (plan ).doesNotContain ("base_table5" );
524+ assertThat (getExplainPlan ("SELECT * FROM materialized_view_level2" , ExplainType .Type .IO ))
525+ .doesNotContain ("base_table5" );
547526
548527 // Re-refreshing 2nd level materialized view is a no-op
549- assertUpdate ("refresh materialized view materialized_view_level2" , 0 );
528+ assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_level2" , 0 );
550529
551530 // Insert into the base table
552531 assertUpdate ("INSERT INTO base_table5 VALUES (3, DATE '2019-09-09'), (4, DATE '2019-09-10'), (5, DATE '2019-09-10')" , 3 );
553- assertUpdate ("refresh materialized view materialized_view_level2" , 3 );
532+ assertUpdate ("REFRESH MATERIALIZED VIEW materialized_view_level2" , 3 );
554533
555534 // Refreshing the 2nd level (outer-most) materialized view does not refresh the 1st level (inner) materialized view.
556- plan = getExplainPlan ("select * from materialized_view_level1" , ExplainType .Type .IO );
557- assertThat ( plan ) .contains ("base_table5" );
535+ assertThat ( getExplainPlan ("SELECT * FROM materialized_view_level1" , ExplainType .Type .IO ))
536+ .contains ("base_table5" );
558537
559538 assertUpdate ("DROP TABLE IF EXISTS base_table5" );
560539 assertUpdate ("DROP MATERIALIZED VIEW materialized_view_level1" );
0 commit comments