diff --git a/src/test/regress/columnar_am_schedule b/src/test/regress/columnar_am_schedule index 3a4a46270..2fddfd7cb 100644 --- a/src/test/regress/columnar_am_schedule +++ b/src/test/regress/columnar_am_schedule @@ -18,3 +18,4 @@ test: am_trigger test: am_tableoptions test: am_recursive test: am_transactions +test: am_matview diff --git a/src/test/regress/expected/am_matview.out b/src/test/regress/expected/am_matview.out new file mode 100644 index 000000000..79595b05d --- /dev/null +++ b/src/test/regress/expected/am_matview.out @@ -0,0 +1,77 @@ +-- +-- Testing we materialized views properly +-- +CREATE TABLE t(a int, b int) USING cstore_tableam; +INSERT INTO t SELECT floor(i / 4), 2 * i FROM generate_series(1, 10) i; +CREATE MATERIALIZED VIEW t_view(a, bsum, cnt) USING cstore_tableam AS + SELECT a, sum(b), count(*) FROM t GROUP BY a; +SELECT * FROM t_view a ORDER BY a; + a | bsum | cnt +--------------------------------------------------------------------- + 0 | 12 | 3 + 1 | 44 | 4 + 2 | 54 | 3 +(3 rows) + +INSERT INTO t SELECT floor(i / 4), 2 * i FROM generate_series(11, 20) i; +SELECT * FROM t_view a ORDER BY a; + a | bsum | cnt +--------------------------------------------------------------------- + 0 | 12 | 3 + 1 | 44 | 4 + 2 | 54 | 3 +(3 rows) + +REFRESH MATERIALIZED VIEW t_view; +SELECT * FROM t_view a ORDER BY a; + a | bsum | cnt +--------------------------------------------------------------------- + 0 | 12 | 3 + 1 | 44 | 4 + 2 | 76 | 4 + 3 | 108 | 4 + 4 | 140 | 4 + 5 | 40 | 1 +(6 rows) + +-- verify that we have created metadata entries for the materialized view +SELECT relfilenode FROM pg_class WHERE relname='t_view' \gset +SELECT count(*) FROM cstore.cstore_data_files WHERE relfilenode=:relfilenode; + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT count(*) FROM cstore.cstore_stripes WHERE relfilenode=:relfilenode; + count +--------------------------------------------------------------------- + 1 +(1 row) + +SELECT count(*) FROM cstore.cstore_skipnodes WHERE relfilenode=:relfilenode; + count +--------------------------------------------------------------------- + 3 +(1 row) + +DROP TABLE t CASCADE; +NOTICE: drop cascades to materialized view t_view +-- dropping must remove metadata +SELECT count(*) FROM cstore.cstore_data_files WHERE relfilenode=:relfilenode; + count +--------------------------------------------------------------------- + 0 +(1 row) + +SELECT count(*) FROM cstore.cstore_stripes WHERE relfilenode=:relfilenode; + count +--------------------------------------------------------------------- + 0 +(1 row) + +SELECT count(*) FROM cstore.cstore_skipnodes WHERE relfilenode=:relfilenode; + count +--------------------------------------------------------------------- + 0 +(1 row) + diff --git a/src/test/regress/expected/am_transactions.out b/src/test/regress/expected/am_transactions.out index 1410272dd..d2490ab7d 100644 --- a/src/test/regress/expected/am_transactions.out +++ b/src/test/regress/expected/am_transactions.out @@ -139,4 +139,106 @@ SELECT * FROM t ORDER BY a; 5 | 10 (5 rows) +-- +-- Prepared transactions +-- +BEGIN; +INSERT INTO t VALUES (6, 12); +INSERT INTO t VALUES (7, 14); +SELECT * FROM t ORDER BY a; + a | b +--------------------------------------------------------------------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 + 6 | 12 + 7 | 14 +(7 rows) + +PREPARE TRANSACTION 'tx01'; +SELECT * FROM t ORDER BY a; + a | b +--------------------------------------------------------------------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 +(5 rows) + +ROLLBACK PREPARED 'tx01'; +SELECT * FROM t ORDER BY a; + a | b +--------------------------------------------------------------------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 +(5 rows) + +BEGIN; +INSERT INTO t VALUES (6, 13); +INSERT INTO t VALUES (7, 15); +PREPARE TRANSACTION 'tx02'; +SELECT * FROM t ORDER BY a; + a | b +--------------------------------------------------------------------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 +(5 rows) + +COMMIT PREPARED 'tx02'; +SELECT * FROM t ORDER BY a; + a | b +--------------------------------------------------------------------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 + 6 | 13 + 7 | 15 +(7 rows) + +-- +-- Prepared statements +-- +PREPARE p1(int) AS INSERT INTO t VALUES (8, $1), (9, $1+2); +EXPLAIN (COSTS OFF) EXECUTE p1(16); + QUERY PLAN +--------------------------------------------------------------------- + Insert on t + -> Values Scan on "*VALUES*" +(2 rows) + +EXECUTE p1(16); +EXPLAIN (ANALYZE true, COSTS off, TIMING off, SUMMARY off) EXECUTE p1(20); + QUERY PLAN +--------------------------------------------------------------------- + Insert on t (actual rows=0 loops=1) + -> Values Scan on "*VALUES*" (actual rows=2 loops=1) +(2 rows) + +SELECT * FROM t ORDER BY a; + a | b +--------------------------------------------------------------------- + 1 | 2 + 2 | 4 + 3 | 6 + 4 | 8 + 5 | 10 + 6 | 13 + 7 | 15 + 8 | 16 + 8 | 20 + 9 | 18 + 9 | 22 +(11 rows) + DROP TABLE t; diff --git a/src/test/regress/sql/am_matview.sql b/src/test/regress/sql/am_matview.sql new file mode 100644 index 000000000..a87b68b43 --- /dev/null +++ b/src/test/regress/sql/am_matview.sql @@ -0,0 +1,34 @@ +-- +-- Testing we materialized views properly +-- + +CREATE TABLE t(a int, b int) USING cstore_tableam; + +INSERT INTO t SELECT floor(i / 4), 2 * i FROM generate_series(1, 10) i; + +CREATE MATERIALIZED VIEW t_view(a, bsum, cnt) USING cstore_tableam AS + SELECT a, sum(b), count(*) FROM t GROUP BY a; + +SELECT * FROM t_view a ORDER BY a; + +INSERT INTO t SELECT floor(i / 4), 2 * i FROM generate_series(11, 20) i; + +SELECT * FROM t_view a ORDER BY a; + +REFRESH MATERIALIZED VIEW t_view; + +SELECT * FROM t_view a ORDER BY a; + +-- verify that we have created metadata entries for the materialized view +SELECT relfilenode FROM pg_class WHERE relname='t_view' \gset + +SELECT count(*) FROM cstore.cstore_data_files WHERE relfilenode=:relfilenode; +SELECT count(*) FROM cstore.cstore_stripes WHERE relfilenode=:relfilenode; +SELECT count(*) FROM cstore.cstore_skipnodes WHERE relfilenode=:relfilenode; + +DROP TABLE t CASCADE; + +-- dropping must remove metadata +SELECT count(*) FROM cstore.cstore_data_files WHERE relfilenode=:relfilenode; +SELECT count(*) FROM cstore.cstore_stripes WHERE relfilenode=:relfilenode; +SELECT count(*) FROM cstore.cstore_skipnodes WHERE relfilenode=:relfilenode; diff --git a/src/test/regress/sql/am_transactions.sql b/src/test/regress/sql/am_transactions.sql index b84790fb5..b99da0313 100644 --- a/src/test/regress/sql/am_transactions.sql +++ b/src/test/regress/sql/am_transactions.sql @@ -67,4 +67,41 @@ SELECT * FROM t; ROLLBACK; SELECT * FROM t ORDER BY a; +-- +-- Prepared transactions +-- + +BEGIN; +INSERT INTO t VALUES (6, 12); +INSERT INTO t VALUES (7, 14); +SELECT * FROM t ORDER BY a; +PREPARE TRANSACTION 'tx01'; + +SELECT * FROM t ORDER BY a; + +ROLLBACK PREPARED 'tx01'; + +SELECT * FROM t ORDER BY a; + +BEGIN; +INSERT INTO t VALUES (6, 13); +INSERT INTO t VALUES (7, 15); +PREPARE TRANSACTION 'tx02'; + +SELECT * FROM t ORDER BY a; + +COMMIT PREPARED 'tx02'; + +SELECT * FROM t ORDER BY a; + +-- +-- Prepared statements +-- + +PREPARE p1(int) AS INSERT INTO t VALUES (8, $1), (9, $1+2); +EXPLAIN (COSTS OFF) EXECUTE p1(16); +EXECUTE p1(16); +EXPLAIN (ANALYZE true, COSTS off, TIMING off, SUMMARY off) EXECUTE p1(20); +SELECT * FROM t ORDER BY a; + DROP TABLE t;