resolve most issues in the matview test suite
authorTomas Vondra <[email protected]>
Sun, 29 Jan 2017 17:45:55 +0000 (18:45 +0100)
committerTomas Vondra <[email protected]>
Sun, 29 Jan 2017 17:45:55 +0000 (18:45 +0100)
Those were fairly trivial issues - change of relation names to include
'mvtest_' prefix, ordering of SELECT results etc. There are a few
remaining differences in query plans - those may easily be correct,
but more detailed verification is needed.

Note: There seems to be quite a few differences when compared to
the matview.sql from commit b5bce6c. Not sure why, but we probably
need to compare the tests tu upstream and minimize the difference.

src/test/regress/expected/matview.out
src/test/regress/sql/matview.sql

index ddcf57a5b1e1f64808fd9743eac364ddb5d47f5d..c1c1739c96f37b0e68427eefd5bfc5ba365b8468 100644 (file)
@@ -18,7 +18,7 @@ SELECT * FROM mvtest_tv ORDER BY type;
 
 -- create a materialized view with no data, and confirm correct behavior
 EXPLAIN (costs off)
-  CREATE MATERIALIZED VIEW tm AS SELECT type, sum(amt) AS totamt FROM t GROUP BY type WITH NO DATA;
+  CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA;
                         QUERY PLAN                         
 -----------------------------------------------------------
  HashAggregate
@@ -28,6 +28,7 @@ EXPLAIN (costs off)
                Group Key: type
                ->  Seq Scan on t
 (6 rows)
+
 CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA;
 SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
  relispopulated 
@@ -35,7 +36,7 @@ SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
  f
 (1 row)
 
-SELECT * FROM mvtest_tm;
+SELECT * FROM mvtest_tm ORDER BY 1;
 ERROR:  materialized view "mvtest_tm" has not been populated
 HINT:  Use the REFRESH MATERIALIZED VIEW command.
 REFRESH MATERIALIZED VIEW mvtest_tm;
@@ -46,17 +47,17 @@ SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
 (1 row)
 
 CREATE UNIQUE INDEX mvtest_tm_type ON mvtest_tm (type);
-SELECT * FROM mvtest_tm;
+SELECT * FROM mvtest_tm ORDER BY 1;
  type | totamt 
 ------+--------
+ x    |      5
  y    |     12
  z    |     11
- x    |      5
 (3 rows)
 
 -- create various views
 EXPLAIN (costs off)
-  CREATE MATERIALIZED VIEW tvm AS SELECT * FROM tv ORDER BY type;
+  CREATE MATERIALIZED VIEW mvtest_tvm AS SELECT * FROM mvtest_tv ORDER BY type;
                            QUERY PLAN                            
 -----------------------------------------------------------------
  Sort
@@ -84,7 +85,7 @@ CREATE UNIQUE INDEX mvtest_tvmm_expr ON mvtest_tvmm ((grandtot > 0));
 CREATE UNIQUE INDEX mvtest_tvmm_pred ON mvtest_tvmm (grandtot) WHERE grandtot < 0;
 CREATE VIEW mvtest_tvv AS SELECT sum(totamt) AS grandtot FROM mvtest_tv;
 EXPLAIN (costs off)
-  CREATE MATERIALIZED VIEW tvvm AS SELECT * FROM tvv;
+  CREATE MATERIALIZED VIEW mvtest_tvvm AS SELECT * FROM mvtest_tvv;
                            QUERY PLAN                            
 -----------------------------------------------------------------
  Aggregate
@@ -193,8 +194,8 @@ SELECT * FROM mvtest_tvm ORDER BY type;
  z    |     11
 (3 rows)
 
-REFRESH MATERIALIZED VIEW tvm;
-SELECT * FROM tm ORDER BY type;
+REFRESH MATERIALIZED VIEW mvtest_tvm;
+SELECT * FROM mvtest_tm ORDER BY type;
  type | totamt 
 ------+--------
  x    |      5
@@ -390,21 +391,21 @@ DETAIL:  drop cascades to view mvtest_vt2
 drop cascades to materialized view mv_test2
 drop cascades to materialized view mv_test3
 -- test that vacuum does not make empty matview look unpopulated
-CREATE TABLE hoge (i int);
-INSERT INTO hoge VALUES (generate_series(1,100000));
+CREATE TABLE mvtest_huge (i int);
+INSERT INTO mvtest_huge VALUES (generate_series(1,100000));
 ERROR:  set-valued function called in context that cannot accept a set
-CREATE MATERIALIZED VIEW hogeview AS SELECT * FROM hoge WHERE i % 2 = 0;
-CREATE INDEX hogeviewidx ON hogeview (i);
-DELETE FROM hoge;
-REFRESH MATERIALIZED VIEW hogeview;
-SELECT * FROM hogeview WHERE i < 10;
+CREATE MATERIALIZED VIEW mvtest_hugeview AS SELECT * FROM mvtest_huge WHERE i % 2 = 0;
+CREATE INDEX mvtest_hugeviewidx ON mvtest_hugeview (i);
+DELETE FROM mvtest_huge;
+REFRESH MATERIALIZED VIEW mvtest_hugeview;
+SELECT * FROM mvtest_hugeview WHERE i < 10;
  i 
 ---
 (0 rows)
 
-VACUUM ANALYZE hogeview;
-ERROR:  relation "hogeview" does not exist
-SELECT * FROM hogeview WHERE i < 10;
+VACUUM ANALYZE mvtest_hugeview;
+ERROR:  relation "mvtest_hugeview" does not exist
+SELECT * FROM mvtest_hugeview WHERE i < 10;
  i 
 ---
 (0 rows)
@@ -419,19 +420,22 @@ INSERT INTO mvtest_foo SELECT * FROM mvtest_foo;
 REFRESH MATERIALIZED VIEW mvtest_mv;
 ERROR:  could not create unique index "mvtest_mv_a_idx"
 DETAIL:  Key (a)=(1) is duplicated.
-DROP TABLE foo CASCADE;
-NOTICE:  drop cascades to materialized view mv
+REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv;
+ERROR:  new data for materialized view "mvtest_mv" contains duplicate rows without any null columns
+DETAIL:  Row: (1,10)
+DROP TABLE mvtest_foo CASCADE;
+NOTICE:  drop cascades to materialized view mvtest_mv
 -- make sure that all columns covered by unique indexes works
-CREATE TABLE foo(a, b, c) AS VALUES(1, 2, 3);
-CREATE MATERIALIZED VIEW mv AS SELECT * FROM foo;
-CREATE UNIQUE INDEX ON mv (a);
-CREATE UNIQUE INDEX ON mv (b);
-CREATE UNIQUE INDEX on mv (c);
-INSERT INTO foo VALUES(2, 3, 4);
-INSERT INTO foo VALUES(3, 4, 5);
-REFRESH MATERIALIZED VIEW mv;
-DROP TABLE foo CASCADE;
-NOTICE:  drop cascades to materialized view mv
+CREATE TABLE mvtest_foo(a, b, c) AS VALUES(1, 2, 3);
+CREATE MATERIALIZED VIEW mvtest_mv AS SELECT * FROM mvtest_foo;
+CREATE UNIQUE INDEX ON mvtest_mv (a);
+CREATE UNIQUE INDEX ON mvtest_mv (b);
+CREATE UNIQUE INDEX on mvtest_mv (c);
+INSERT INTO mvtest_foo VALUES(2, 3, 4);
+INSERT INTO mvtest_foo VALUES(3, 4, 5);
+REFRESH MATERIALIZED VIEW mvtest_mv;
+DROP TABLE mvtest_foo CASCADE;
+NOTICE:  drop cascades to materialized view mvtest_mv
 -- allow subquery to reference unpopulated matview if WITH NO DATA is specified
 CREATE MATERIALIZED VIEW mvtest_mv1 AS SELECT 1 AS col1 WITH NO DATA;
 CREATE MATERIALIZED VIEW mvtest_mv2 AS SELECT * FROM mvtest_mv1
@@ -444,10 +448,10 @@ INSERT INTO mvtest_boxes (b) VALUES
   ('(32,32),(31,31)'),
   ('(2.0000004,2.0000004),(1,1)'),
   ('(1.9999996,1.9999996),(1,1)');
-CREATE MATERIALIZED VIEW boxmv AS SELECT * FROM boxes;
-CREATE UNIQUE INDEX boxmv_id ON boxmv (id);
-UPDATE boxes SET b = '(2,2),(1,1)' WHERE id = 2;
-SELECT * FROM boxmv ORDER BY id;
+CREATE MATERIALIZED VIEW mvtest_boxmv AS SELECT * FROM mvtest_boxes;
+CREATE UNIQUE INDEX mvtest_boxmv_id ON mvtest_boxmv (id);
+UPDATE mvtest_boxes SET b = '(2,2),(1,1)' WHERE id = 2;
+SELECT * FROM mvtest_boxmv ORDER BY id;
  id |              b              
 ----+-----------------------------
   1 | (32,32),(31,31)
@@ -458,14 +462,24 @@ SELECT * FROM boxmv ORDER BY id;
 DROP TABLE mvtest_boxes CASCADE;
 NOTICE:  drop cascades to materialized view mvtest_boxmv
 -- make sure that column names are handled correctly
-CREATE TABLE v (i int, j int);
-CREATE MATERIALIZED VIEW mv_v (ii) AS SELECT i, j AS jj FROM v;
-ALTER TABLE v RENAME COLUMN i TO x;
-INSERT INTO v values (1, 2);
-CREATE UNIQUE INDEX mv_v_ii ON mv_v (ii);
-REFRESH MATERIALIZED VIEW mv_v;
-UPDATE v SET j = 3 WHERE x = 1;
-SELECT * FROM v;
+CREATE TABLE mvtest_v (i int, j int);
+CREATE MATERIALIZED VIEW mvtest_mv_v (ii, jj, kk) AS SELECT i, j FROM mvtest_v; -- error
+ERROR:  too many column names were specified
+CREATE MATERIALIZED VIEW mvtest_mv_v (ii, jj) AS SELECT i, j FROM mvtest_v; -- ok
+CREATE MATERIALIZED VIEW mvtest_mv_v_2 (ii) AS SELECT i, j FROM mvtest_v; -- ok
+CREATE MATERIALIZED VIEW mvtest_mv_v_3 (ii, jj, kk) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- error
+ERROR:  too many column names were specified
+CREATE MATERIALIZED VIEW mvtest_mv_v_3 (ii, jj) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- ok
+CREATE MATERIALIZED VIEW mvtest_mv_v_4 (ii) AS SELECT i, j FROM mvtest_v WITH NO DATA; -- ok
+ALTER TABLE mvtest_v RENAME COLUMN i TO x;
+INSERT INTO mvtest_v values (1, 2);
+CREATE UNIQUE INDEX mvtest_mv_v_ii ON mvtest_mv_v (ii);
+REFRESH MATERIALIZED VIEW mvtest_mv_v;
+UPDATE mvtest_v SET j = 3 WHERE x = 1;
+REFRESH MATERIALIZED VIEW mvtest_mv_v_2;
+REFRESH MATERIALIZED VIEW mvtest_mv_v_3;
+REFRESH MATERIALIZED VIEW mvtest_mv_v_4;
+SELECT * FROM mvtest_v;
  x | j 
 ---+---
  1 | 3
@@ -509,12 +523,12 @@ refresh materialized view mvtest_error;  -- fail here
 ERROR:  division by zero
 drop materialized view mvtest_error;
 -- make sure that matview rows can be referenced as source rows (bug #9398)
-CREATE TABLE v AS SELECT generate_series(1,10) AS a;
-CREATE MATERIALIZED VIEW mv_v AS SELECT a FROM v WHERE a <= 5;
-DELETE FROM v WHERE EXISTS ( SELECT * FROM mv_v WHERE mv_v.a = v.a );
+CREATE TABLE mvtest_v AS SELECT generate_series(1,10) AS a;
+CREATE MATERIALIZED VIEW mvtest_mv_v AS SELECT a FROM mvtest_v WHERE a <= 5;
+DELETE FROM mvtest_v WHERE EXISTS ( SELECT * FROM mvtest_mv_v WHERE mvtest_mv_v.a = mvtest_v.a );
 ERROR:  could not plan this distributed delete
 DETAIL:  correlated or complex DELETE is currently not supported in Postgres-XL.
-SELECT * FROM v;
+SELECT * FROM mvtest_v;
  a  
 ----
   1
@@ -553,6 +567,31 @@ CREATE MATERIALIZED VIEW IF NOT EXISTS mvtest_mv_foo AS SELECT * FROM mvtest_foo
 NOTICE:  relation "mvtest_mv_foo" already exists, skipping
 CREATE UNIQUE INDEX ON mvtest_mv_foo (i);
 RESET ROLE;
-REFRESH MATERIALIZED VIEW mv_foo;
-DROP OWNED BY user_dw CASCADE;
-DROP ROLE user_dw;
+REFRESH MATERIALIZED VIEW mvtest_mv_foo;
+DROP OWNED BY regress_user_mvtest CASCADE;
+DROP ROLE regress_user_mvtest;
+-- make sure that create WITH NO DATA works via SPI
+BEGIN;
+CREATE FUNCTION mvtest_func()
+  RETURNS void AS $$
+BEGIN
+  CREATE MATERIALIZED VIEW mvtest1 AS SELECT 1 AS x;
+  CREATE MATERIALIZED VIEW mvtest2 AS SELECT 1 AS x WITH NO DATA;
+END;
+$$ LANGUAGE plpgsql;
+SELECT mvtest_func();
+ mvtest_func 
+-------------
+(1 row)
+
+SELECT * FROM mvtest1;
+ x 
+---
+ 1
+(1 row)
+
+SELECT * FROM mvtest2;
+ERROR:  materialized view "mvtest2" has not been populated
+HINT:  Use the REFRESH MATERIALIZED VIEW command.
+ROLLBACK;
index 1b1d3be97dbc36609c3fa76ae74ea8534c1ae719..ad1fa49665d0484cd6128a4e209a954dd4dae5ab 100644 (file)
@@ -16,11 +16,11 @@ EXPLAIN (costs off)
   CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA;
 CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA;
 SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
-SELECT * FROM mvtest_tm;
+SELECT * FROM mvtest_tm ORDER BY 1;
 REFRESH MATERIALIZED VIEW mvtest_tm;
 SELECT relispopulated FROM pg_class WHERE oid = 'mvtest_tm'::regclass;
 CREATE UNIQUE INDEX mvtest_tm_type ON mvtest_tm (type);
-SELECT * FROM mvtest_tm;
+SELECT * FROM mvtest_tm ORDER BY 1;
 
 -- create various views
 EXPLAIN (costs off)