From: Tomas Vondra Date: Sun, 29 Jan 2017 17:45:55 +0000 (+0100) Subject: resolve most issues in the matview test suite X-Git-Tag: XL_10_R1BETA1~388 X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=5e13292c11990ae35f13cabdcc3588a90cd3fac5;p=postgres-xl.git resolve most issues in the matview test suite 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. --- diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out index ddcf57a5b1..c1c1739c96 100644 --- a/src/test/regress/expected/matview.out +++ b/src/test/regress/expected/matview.out @@ -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; diff --git a/src/test/regress/sql/matview.sql b/src/test/regress/sql/matview.sql index 1b1d3be97d..ad1fa49665 100644 --- a/src/test/regress/sql/matview.sql +++ b/src/test/regress/sql/matview.sql @@ -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)