blob: 9ba86e9fed38ff937c39429d7e16230fe244b177 [file] [log] [blame]
-- create a table to use as a basis for views and materialized views in various combinations
CREATE TABLE mv_base_a (i int, j int) DISTRIBUTED BY (i);
INSERT INTO mv_base_a VALUES
(1,10),
(2,20),
(3,30),
(4,40),
(5,50);
CREATE TABLE mv_base_b (i int, k int) DISTRIBUTED BY (i);
INSERT INTO mv_base_b VALUES
(1,101),
(2,102),
(3,103),
(4,104);
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_1 AS SELECT i,j,k FROM mv_base_a a INNER JOIN mv_base_b b USING(i) WITH NO DATA;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv_ivm_1 ORDER BY 1,2,3;
ERROR: materialized view "mv_ivm_1" has not been populated
HINT: Use the REFRESH MATERIALIZED VIEW command.
REFRESH MATERIALIZED VIEW mv_ivm_1;
SELECT * FROM mv_ivm_1 ORDER BY 1,2,3;
i | j | k
---+----+-----
1 | 10 | 101
2 | 20 | 102
3 | 30 | 103
4 | 40 | 104
(4 rows)
-- REFRESH WITH NO DATA
BEGIN;
CREATE FUNCTION dummy_ivm_trigger_func() RETURNS TRIGGER AS $$
BEGIN
RETURN NULL;
END
$$ language plpgsql;
CREATE CONSTRAINT TRIGGER dummy_ivm_trigger AFTER INSERT
ON mv_base_a FROM mv_ivm_1 FOR EACH ROW
EXECUTE PROCEDURE dummy_ivm_trigger_func();
SELECT COUNT(*)
FROM pg_depend pd INNER JOIN pg_trigger pt ON pd.objid = pt.oid
WHERE pd.classid = 'pg_trigger'::regclass AND pd.refobjid = 'mv_ivm_1'::regclass;
count
-------
17
(1 row)
REFRESH MATERIALIZED VIEW mv_ivm_1 WITH NO DATA;
SELECT COUNT(*)
FROM pg_depend pd INNER JOIN pg_trigger pt ON pd.objid = pt.oid
WHERE pd.classid = 'pg_trigger'::regclass AND pd.refobjid = 'mv_ivm_1'::regclass;
count
-------
1
(1 row)
ROLLBACK;
-- immediate maintenance
BEGIN;
INSERT INTO mv_base_b VALUES(5,105);
SELECT * FROM mv_ivm_1 ORDER BY 1,2,3;
i | j | k
---+----+-----
1 | 10 | 101
2 | 20 | 102
3 | 30 | 103
4 | 40 | 104
5 | 50 | 105
(5 rows)
UPDATE mv_base_a SET j = 0 WHERE i = 1;
SELECT * FROM mv_ivm_1 ORDER BY 1,2,3;
i | j | k
---+----+-----
1 | 0 | 101
2 | 20 | 102
3 | 30 | 103
4 | 40 | 104
5 | 50 | 105
(5 rows)
DELETE FROM mv_base_b WHERE (i,k) = (5,105);
SELECT * FROM mv_ivm_1 ORDER BY 1,2,3;
i | j | k
---+----+-----
1 | 0 | 101
2 | 20 | 102
3 | 30 | 103
4 | 40 | 104
(4 rows)
ROLLBACK;
SELECT * FROM mv_ivm_1 ORDER BY 1,2,3;
i | j | k
---+----+-----
1 | 10 | 101
2 | 20 | 102
3 | 30 | 103
4 | 40 | 104
(4 rows)
-- rename of IVM columns
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_rename AS SELECT DISTINCT * FROM mv_base_a;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
ALTER MATERIALIZED VIEW mv_ivm_rename RENAME COLUMN __ivm_count__ TO xxx;
ERROR: IVM column can not be renamed
DROP MATERIALIZED VIEW mv_ivm_rename;
-- unique index on IVM columns
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_unique AS SELECT DISTINCT * FROM mv_base_a;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE UNIQUE INDEX ON mv_ivm_unique(__ivm_count__);
ERROR: unique index creation on IVM columns is not supported
CREATE UNIQUE INDEX ON mv_ivm_unique((__ivm_count__));
ERROR: unique index creation on IVM columns is not supported
CREATE UNIQUE INDEX ON mv_ivm_unique((__ivm_count__ + 1));
ERROR: unique index creation on IVM columns is not supported
DROP MATERIALIZED VIEW mv_ivm_unique;
-- TRUNCATE a base table in join views
BEGIN;
TRUNCATE mv_base_a;
SELECT * FROM mv_ivm_1;
i | j | k
---+---+---
(0 rows)
ROLLBACK;
BEGIN;
TRUNCATE mv_base_b;
SELECT * FROM mv_ivm_1;
i | j | k
---+---+---
(0 rows)
ROLLBACK;
-- some query syntax
BEGIN;
CREATE FUNCTION ivm_func() RETURNS int LANGUAGE 'sql'
AS 'SELECT 1' IMMUTABLE;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_func AS SELECT * FROM ivm_func();
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'ivm_func' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_no_tbl AS SELECT 1;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named '?column?' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
ROLLBACK;
-- result of materialized view have DISTINCT clause or the duplicate result.
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_duplicate AS SELECT j FROM mv_base_a;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'j' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_distinct AS SELECT DISTINCT j FROM mv_base_a;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'j' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
INSERT INTO mv_base_a VALUES(6,20);
SELECT * FROM mv_ivm_duplicate ORDER BY 1;
j
----
10
20
20
30
40
50
(6 rows)
SELECT * FROM mv_ivm_distinct ORDER BY 1;
j
----
10
20
30
40
50
(5 rows)
DELETE FROM mv_base_a WHERE (i,j) = (2,20);
SELECT * FROM mv_ivm_duplicate ORDER BY 1;
j
----
10
20
30
40
50
(5 rows)
SELECT * FROM mv_ivm_distinct ORDER BY 1;
j
----
10
20
30
40
50
(5 rows)
ROLLBACK;
-- support SUM(), COUNT() and AVG() aggregate functions
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_agg AS SELECT i, SUM(j), COUNT(i), AVG(j) FROM mv_base_a GROUP BY i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv_ivm_agg ORDER BY 1,2,3,4;
i | sum | count | avg
---+-----+-------+---------------------
1 | 10 | 1 | 10.0000000000000000
2 | 20 | 1 | 20.0000000000000000
3 | 30 | 1 | 30.0000000000000000
4 | 40 | 1 | 40.0000000000000000
5 | 50 | 1 | 50.0000000000000000
(5 rows)
INSERT INTO mv_base_a VALUES(2,100);
SELECT * FROM mv_ivm_agg ORDER BY 1,2,3,4;
i | sum | count | avg
---+-----+-------+---------------------
1 | 10 | 1 | 10.0000000000000000
2 | 120 | 2 | 60.0000000000000000
3 | 30 | 1 | 30.0000000000000000
4 | 40 | 1 | 40.0000000000000000
5 | 50 | 1 | 50.0000000000000000
(5 rows)
UPDATE mv_base_a SET j = 200 WHERE (i,j) = (2,100);
SELECT * FROM mv_ivm_agg ORDER BY 1,2,3,4;
i | sum | count | avg
---+-----+-------+----------------------
1 | 10 | 1 | 10.0000000000000000
2 | 220 | 2 | 110.0000000000000000
3 | 30 | 1 | 30.0000000000000000
4 | 40 | 1 | 40.0000000000000000
5 | 50 | 1 | 50.0000000000000000
(5 rows)
DELETE FROM mv_base_a WHERE (i,j) = (2,200);
SELECT * FROM mv_ivm_agg ORDER BY 1,2,3,4;
i | sum | count | avg
---+-----+-------+---------------------
1 | 10 | 1 | 10.0000000000000000
2 | 20 | 1 | 20.0000000000000000
3 | 30 | 1 | 30.0000000000000000
4 | 40 | 1 | 40.0000000000000000
5 | 50 | 1 | 50.0000000000000000
(5 rows)
ROLLBACK;
-- support COUNT(*) aggregate function
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_agg AS SELECT i, SUM(j), COUNT(*) FROM mv_base_a GROUP BY i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv_ivm_agg ORDER BY 1,2,3;
i | sum | count
---+-----+-------
1 | 10 | 1
2 | 20 | 1
3 | 30 | 1
4 | 40 | 1
5 | 50 | 1
(5 rows)
INSERT INTO mv_base_a VALUES(2,100);
SELECT * FROM mv_ivm_agg ORDER BY 1,2,3;
i | sum | count
---+-----+-------
1 | 10 | 1
2 | 120 | 2
3 | 30 | 1
4 | 40 | 1
5 | 50 | 1
(5 rows)
ROLLBACK;
-- TRUNCATE a base table in aggregate views
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_agg AS SELECT i, SUM(j), COUNT(*) FROM mv_base_a GROUP BY i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
TRUNCATE mv_base_a;
SELECT sum, count FROM mv_ivm_agg;
sum | count
-----+-------
(0 rows)
SELECT i, SUM(j), COUNT(*) FROM mv_base_a GROUP BY i;
i | sum | count
---+-----+-------
(0 rows)
ROLLBACK;
-- support aggregate functions without GROUP clause
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_group AS SELECT SUM(j), COUNT(j), AVG(j) FROM mv_base_a;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'sum' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv_ivm_group ORDER BY 1;
sum | count | avg
-----+-------+---------------------
150 | 5 | 30.0000000000000000
(1 row)
INSERT INTO mv_base_a VALUES(6,60);
SELECT * FROM mv_ivm_group ORDER BY 1;
sum | count | avg
-----+-------+---------------------
210 | 6 | 35.0000000000000000
(1 row)
DELETE FROM mv_base_a;
SELECT * FROM mv_ivm_group ORDER BY 1;
sum | count | avg
-----+-------+-----
| 0 |
(1 row)
ROLLBACK;
-- TRUNCATE a base table in aggregate views without GROUP clause
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_group AS SELECT SUM(j), COUNT(j), AVG(j) FROM mv_base_a;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'sum' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
TRUNCATE mv_base_a;
SELECT sum, count, avg FROM mv_ivm_group;
sum | count | avg
-----+-------+-----
| 0 |
(1 row)
SELECT SUM(j), COUNT(j), AVG(j) FROM mv_base_a;
sum | count | avg
-----+-------+-----
| 0 |
(1 row)
ROLLBACK;
-- TRUNCATE a base table without transaction block.
CREATE TABLE mv_base_simple(i int);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_simple AS SELECT * FROM mv_base_simple;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
TRUNCATE mv_base_simple;
DROP TABLE mv_base_simple CASCADE;
NOTICE: drop cascades to materialized view mv_ivm_simple
-- resolved issue: When use AVG() function and values is indivisible, result of AVG() is incorrect.
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_avg_bug AS SELECT i, SUM(j), COUNT(j), AVG(j) FROM mv_base_A GROUP BY i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv_ivm_avg_bug ORDER BY 1,2,3;
i | sum | count | avg
---+-----+-------+---------------------
1 | 10 | 1 | 10.0000000000000000
2 | 20 | 1 | 20.0000000000000000
3 | 30 | 1 | 30.0000000000000000
4 | 40 | 1 | 40.0000000000000000
5 | 50 | 1 | 50.0000000000000000
(5 rows)
INSERT INTO mv_base_a VALUES
(1,0),
(1,0),
(2,30),
(2,30);
SELECT * FROM mv_ivm_avg_bug ORDER BY 1,2,3;
i | sum | count | avg
---+-----+-------+---------------------
1 | 10 | 3 | 3.3333333333333333
2 | 80 | 3 | 26.6666666666666667
3 | 30 | 1 | 30.0000000000000000
4 | 40 | 1 | 40.0000000000000000
5 | 50 | 1 | 50.0000000000000000
(5 rows)
DELETE FROM mv_base_a WHERE (i,j) = (1,0);
DELETE FROM mv_base_a WHERE (i,j) = (2,30);
SELECT * FROM mv_ivm_avg_bug ORDER BY 1,2,3;
i | sum | count | avg
---+-----+-------+---------------------
1 | 10 | 1 | 10.0000000000000000
2 | 20 | 1 | 20.0000000000000000
3 | 30 | 1 | 30.0000000000000000
4 | 40 | 1 | 40.0000000000000000
5 | 50 | 1 | 50.0000000000000000
(5 rows)
ROLLBACK;
-- aggregate views with column names specified
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_agg(a) AS SELECT i, SUM(j) FROM mv_base_a GROUP BY i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
INSERT INTO mv_base_a VALUES (1,100), (2,200), (3,300);
UPDATE mv_base_a SET j = 2000 WHERE (i,j) = (2,20);
DELETE FROM mv_base_a WHERE (i,j) = (3,30);
SELECT * FROM mv_ivm_agg ORDER BY 1,2;
a | sum
---+------
1 | 110
2 | 2200
3 | 300
4 | 40
5 | 50
(5 rows)
ROLLBACK;
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_agg(a,b) AS SELECT i, SUM(j) FROM mv_base_a GROUP BY i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
INSERT INTO mv_base_a VALUES (1,100), (2,200), (3,300);
UPDATE mv_base_a SET j = 2000 WHERE (i,j) = (2,20);
DELETE FROM mv_base_a WHERE (i,j) = (3,30);
SELECT * FROM mv_ivm_agg ORDER BY 1,2;
a | b
---+------
1 | 110
2 | 2200
3 | 300
4 | 40
5 | 50
(5 rows)
ROLLBACK;
BEGIN;
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_agg(a,b,c) AS SELECT i, SUM(j) FROM mv_base_a GROUP BY i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
ERROR: too many column names were specified
ROLLBACK;
-- support self join view and multiple change on the same table
BEGIN;
CREATE TABLE base_t (i int, v int) DISTRIBUTED BY (i);
INSERT INTO base_t VALUES (1, 10), (2, 20), (3, 30);
CREATE INCREMENTAL MATERIALIZED VIEW mv_self(v1, v2) AS
SELECT t1.v, t2.v FROM base_t AS t1 JOIN base_t AS t2 ON t1.i = t2.i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'v' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv_self ORDER BY v1;
v1 | v2
----+----
10 | 10
20 | 20
30 | 30
(3 rows)
INSERT INTO base_t VALUES (4,40);
DELETE FROM base_t WHERE i = 1;
UPDATE base_t SET v = v*10 WHERE i=2;
SELECT * FROM mv_self ORDER BY v1;
v1 | v2
-----+-----
30 | 30
40 | 40
200 | 200
(3 rows)
--- with sub-transactions
SAVEPOINT p1;
INSERT INTO base_t VALUES (7,70);
RELEASE SAVEPOINT p1;
INSERT INTO base_t VALUES (7,77);
SELECT * FROM mv_self ORDER BY v1, v2;
v1 | v2
-----+-----
30 | 30
40 | 40
70 | 70
70 | 77
77 | 70
77 | 77
200 | 200
(7 rows)
ROLLBACK;
-- views including NULL
BEGIN;
CREATE TABLE base_t (i int, v int) DISTRIBUTED BY (i);
INSERT INTO base_t VALUES (1,10),(2, NULL);
CREATE INCREMENTAL MATERIALIZED VIEW mv AS SELECT * FROM base_t;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv ORDER BY i;
i | v
---+----
1 | 10
2 |
(2 rows)
UPDATE base_t SET v = 20 WHERE i = 2;
SELECT * FROM mv ORDER BY i;
i | v
---+----
1 | 10
2 | 20
(2 rows)
ROLLBACK;
BEGIN;
CREATE TABLE base_t (i int) DISTRIBUTED BY (i);
CREATE INCREMENTAL MATERIALIZED VIEW mv AS SELECT * FROM base_t;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv ORDER BY i;
i
---
(0 rows)
INSERT INTO base_t VALUES (1),(NULL);
SELECT * FROM mv ORDER BY i;
i
---
1
(2 rows)
ROLLBACK;
BEGIN;
CREATE TABLE base_t (i int, v int) DISTRIBUTED BY (i);
INSERT INTO base_t VALUES (NULL, 1), (NULL, 2), (1, 10), (1, 20);
CREATE INCREMENTAL MATERIALIZED VIEW mv AS SELECT i, sum(v) FROM base_t GROUP BY i;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
SELECT * FROM mv ORDER BY i;
i | sum
---+-----
1 | 30
| 3
(2 rows)
UPDATE base_t SET v = v * 10;
SELECT * FROM mv ORDER BY i;
i | sum
---+-----
1 | 300
| 30
(2 rows)
ROLLBACK;
-- support joins
BEGIN;
CREATE TABLE base_r(i int) DISTRIBUTED BY (i);
CREATE TABLE base_s (i int, j int) DISTRIBUTED BY (i);
CREATE TABLE base_t (j int) DISTRIBUTED BY (j);
INSERT INTO base_r VALUES (1), (2), (3), (3);
INSERT INTO base_s VALUES (2,1), (2,2), (3,1), (4,1), (4,2);
INSERT INTO base_t VALUES (2), (3), (3);
CREATE FUNCTION is_match() RETURNS text AS $$
DECLARE
x text;
BEGIN
EXECUTE
'SELECT CASE WHEN count(*) = 0 THEN ''OK'' ELSE ''NG'' END FROM (
SELECT * FROM (SELECT * FROM mv EXCEPT ALL SELECT * FROM v) v1
UNION ALL
SELECT * FROM (SELECT * FROM v EXCEPT ALL SELECT * FROM mv) v2
) v' INTO x;
RETURN x;
END;
$$ LANGUAGE plpgsql;
-- 3-way join
CREATE INCREMENTAL MATERIALIZED VIEW mv(r, si, sj, t) AS
SELECT r.i, s.i, s.j, t.j
FROM base_r AS r JOIN base_s AS s ON r.i=s.i JOIN base_t AS t ON s.j=t.j;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE VIEW v(r, si, sj, t) AS
SELECT r.i, s.i, s.j, t.j
FROM base_r AS r JOIN base_s AS s ON r.i=s.i JOIN base_t AS t ON s.j=t.j;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
2 | 2 | 2 | 2
(1 row)
SAVEPOINT p1;
INSERT INTO base_r VALUES (1),(2),(3);
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
2 | 2 | 2 | 2
2 | 2 | 2 | 2
(2 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
INSERT INTO base_r VALUES (4),(5);
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
2 | 2 | 2 | 2
2 | 2 | 2 | 2
4 | 4 | 2 | 2
(3 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
INSERT INTO base_s VALUES (1,3);
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
1 | 1 | 3 | 3
1 | 1 | 3 | 3
2 | 2 | 2 | 2
(3 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
INSERT INTO base_s VALUES (2,3);
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
1 | 1 | 3 | 3
1 | 1 | 3 | 3
2 | 2 | 2 | 2
2 | 2 | 3 | 3
2 | 2 | 3 | 3
(5 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
INSERT INTO base_t VALUES (1),(2);
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
2 | 2 | 1 | 1
2 | 2 | 2 | 2
2 | 2 | 2 | 2
3 | 3 | 1 | 1
3 | 3 | 1 | 1
(5 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
INSERT INTO base_t VALUES (3),(4);
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
2 | 2 | 1 | 1
2 | 2 | 2 | 2
2 | 2 | 2 | 2
3 | 3 | 1 | 1
3 | 3 | 1 | 1
(5 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
DELETE FROM base_r WHERE i=1;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
2 | 2 | 2 | 2
(1 row)
SELECT is_match();
is_match
----------
OK
(1 row)
DELETE FROM base_r WHERE i=2;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
(0 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
DELETE FROM base_r WHERE i=3;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
(0 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
DELETE FROM base_s WHERE i=2;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
(0 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
DELETE FROM base_s WHERE i=3;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
(0 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
DELETE FROM base_s WHERE i=4;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
(0 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
DELETE FROM base_t WHERE j=2;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
(0 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
DELETE FROM base_t WHERE j=3;
SELECT * FROM mv ORDER BY r, si, sj, t;
r | si | sj | t
---+----+----+---
(0 rows)
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
-- TRUNCATE a base table in views
TRUNCATE base_r;
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
TRUNCATE base_s;
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
TRUNCATE base_t;
SELECT is_match();
is_match
----------
OK
(1 row)
ROLLBACK TO p1;
DROP MATERIALIZED VIEW mv;
DROP VIEW v;
ROLLBACK;
-- IMMV containing user defined type
BEGIN;
CREATE TYPE mytype;
CREATE FUNCTION mytype_in(cstring)
RETURNS mytype AS 'int4in'
LANGUAGE INTERNAL STRICT IMMUTABLE;
NOTICE: return type mytype is only a shell
CREATE FUNCTION mytype_out(mytype)
RETURNS cstring AS 'int4out'
LANGUAGE INTERNAL STRICT IMMUTABLE;
NOTICE: argument type mytype is only a shell
CREATE TYPE mytype (
LIKE = int4,
INPUT = mytype_in,
OUTPUT = mytype_out
);
CREATE FUNCTION mytype_eq(mytype, mytype)
RETURNS bool AS 'int4eq'
LANGUAGE INTERNAL STRICT IMMUTABLE;
CREATE FUNCTION mytype_lt(mytype, mytype)
RETURNS bool AS 'int4lt'
LANGUAGE INTERNAL STRICT IMMUTABLE;
CREATE FUNCTION mytype_cmp(mytype, mytype)
RETURNS integer AS 'btint4cmp'
LANGUAGE INTERNAL STRICT IMMUTABLE;
CREATE OPERATOR = (
leftarg = mytype, rightarg = mytype,
procedure = mytype_eq);
CREATE OPERATOR < (
leftarg = mytype, rightarg = mytype,
procedure = mytype_lt);
CREATE OPERATOR CLASS mytype_ops
DEFAULT FOR TYPE mytype USING btree AS
OPERATOR 1 <,
OPERATOR 3 = ,
FUNCTION 1 mytype_cmp(mytype,mytype);
CREATE TABLE t_mytype (x mytype);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause, and no column type is suitable for a distribution key. Creating a NULL policy entry.
CREATE INCREMENTAL MATERIALIZED VIEW mv_mytype AS
SELECT * FROM t_mytype;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named '' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
INSERT INTO t_mytype VALUES ('1'::mytype);
SELECT * FROM mv_mytype;
x
---
1
(1 row)
ROLLBACK;
-- outer join is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv(a,b) AS SELECT a.i, b.i FROM mv_base_a a LEFT JOIN mv_base_b b ON a.i=b.i;
ERROR: OUTER JOIN is not supported on incrementally maintainable materialized view
-- CTE is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv AS
WITH b AS ( SELECT * FROM mv_base_b) SELECT a.i,a.j FROM mv_base_a a, b WHERE a.i = b.i;
ERROR: CTE is not supported on incrementally maintainable materialized view
-- contain system column
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm01 AS SELECT i,j,xmin FROM mv_base_a;
ERROR: system column is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm02 AS SELECT i,j FROM mv_base_a WHERE xmin = '610';
ERROR: system column is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm04 AS SELECT i,j,xmin::text AS x_min FROM mv_base_a;
ERROR: system column is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm06 AS SELECT i,j,xidsend(xmin) AS x_min FROM mv_base_a;
ERROR: system column is not supported on incrementally maintainable materialized view
-- contain subquery
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm03 AS SELECT i,j FROM mv_base_a WHERE i IN (SELECT i FROM mv_base_b WHERE k < 103 );
ERROR: subquery is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm04 AS SELECT a.i,a.j FROM mv_base_a a, (SELECT * FROM mv_base_b) b WHERE a.i = b.i;
ERROR: subquery is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm05 AS SELECT i,j, (SELECT k FROM mv_base_b b WHERE a.i = b.i) FROM mv_base_a a;
ERROR: subquery is not supported on incrementally maintainable materialized view
-- contain ORDER BY
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm07 AS SELECT i,j,k FROM mv_base_a a INNER JOIN mv_base_b b USING(i) ORDER BY i,j,k;
ERROR: ORDER BY clause is not supported on incrementally maintainable materialized view
-- contain HAVING
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm08 AS SELECT i,j,k FROM mv_base_a a INNER JOIN mv_base_b b USING(i) GROUP BY i,j,k HAVING SUM(i) > 5;
ERROR: HAVING clause is not supported on incrementally maintainable materialized view
-- contain view or materialized view
CREATE VIEW b_view AS SELECT i,k FROM mv_base_b;
CREATE MATERIALIZED VIEW b_mview AS SELECT i,k FROM mv_base_b;
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm07 AS SELECT a.i,a.j FROM mv_base_a a,b_view b WHERE a.i = b.i;
ERROR: VIEW or MATERIALIZED VIEW is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm08 AS SELECT a.i,a.j FROM mv_base_a a,b_mview b WHERE a.i = b.i;
ERROR: VIEW or MATERIALIZED VIEW is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm09 AS SELECT a.i,a.j FROM mv_base_a a, (SELECT i, COUNT(*) FROM mv_base_b GROUP BY i) b WHERE a.i = b.i;
ERROR: subquery is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm10 AS SELECT a.i,a.j FROM mv_base_a a WHERE EXISTS(SELECT 1 FROM mv_base_b b WHERE a.i = b.i) OR a.i > 5;
ERROR: subquery is not supported on incrementally maintainable materialized view
-- contain mutable functions
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm12 AS SELECT i,j FROM mv_base_a WHERE i = random()::int;
ERROR: mutable function is not supported on incrementally maintainable materialized view
HINT: functions must be marked IMMUTABLE
-- LIMIT/OFFSET is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm13 AS SELECT i,j FROM mv_base_a LIMIT 10 OFFSET 5;
ERROR: LIMIT/OFFSET clause is not supported on incrementally maintainable materialized view
-- DISTINCT ON is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm14 AS SELECT DISTINCT ON(i) i, j FROM mv_base_a;
ERROR: DISTINCT ON is not supported on incrementally maintainable materialized view
-- TABLESAMPLE clause is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm15 AS SELECT i, j FROM mv_base_a TABLESAMPLE SYSTEM(50);
ERROR: TABLESAMPLE clause is not supported on incrementally maintainable materialized view
-- window functions are not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm16 AS SELECT *, cume_dist() OVER (ORDER BY i) AS rank FROM mv_base_a;
ERROR: window functions are not supported on incrementally maintainable materialized view
-- aggregate function with some options is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm17 AS SELECT COUNT(*) FILTER(WHERE i < 3) FROM mv_base_a;
ERROR: aggregate function with FILTER clause is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm18 AS SELECT COUNT(DISTINCT i) FROM mv_base_a;
ERROR: aggregate function with DISTINCT arguments is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm19 AS SELECT array_agg(j ORDER BY i DESC) FROM mv_base_a;
ERROR: aggregate function with ORDER clause is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm20 AS SELECT i,SUM(j) FROM mv_base_a GROUP BY GROUPING SETS((i),());
ERROR: GROUPING SETS, ROLLUP, or CUBE clauses is not supported on incrementally maintainable materialized view
-- inheritance parent is not supported
BEGIN;
CREATE TABLE parent (i int, v int);
NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'i' as the Apache Cloudberry data distribution key for this table.
HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.
CREATE TABLE child_a(options text) INHERITS(parent);
NOTICE: table has parent, setting distribution columns to match parent table
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm21 AS SELECT * FROM parent;
ERROR: inheritance parent is not supported on incrementally maintainable materialized view
ROLLBACK;
-- UNION statement is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm22 AS SELECT i,j FROM mv_base_a UNION ALL SELECT i,k FROM mv_base_b;;
ERROR: UNION/INTERSECT/EXCEPT statements are not supported on incrementally maintainable materialized view
-- empty target list is not allowed with IVM
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm25 AS SELECT FROM mv_base_a;
ERROR: empty target list is not supported on incrementally maintainable materialized view
-- FOR UPDATE/SHARE is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm26 AS SELECT i,j FROM mv_base_a FOR UPDATE;
ERROR: FOR UPDATE/SHARE clause is not supported on incrementally maintainable materialized view
-- tartget list cannot contain ivm column that start with '__ivm'
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm28 AS SELECT i AS "__ivm_count__" FROM mv_base_a;
ERROR: column name __ivm_count__ is not supported on incrementally maintainable materialized view
-- expressions specified in GROUP BY must appear in the target list.
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm29 AS SELECT COUNT(i) FROM mv_base_a GROUP BY i;
ERROR: GROUP BY expression not appearing in select list is not supported on incrementally maintainable materialized view
-- experssions containing an aggregate is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm30 AS SELECT sum(i)*0.5 FROM mv_base_a;
ERROR: expression containing an aggregate in it is not supported on incrementally maintainable materialized view
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm31 AS SELECT sum(i)/sum(j) FROM mv_base_a;
ERROR: expression containing an aggregate in it is not supported on incrementally maintainable materialized view
-- VALUES is not supported
CREATE INCREMENTAL MATERIALIZED VIEW mv_ivm_only_values1 AS values(1);
ERROR: VALUES is not supported on incrementally maintainable materialized view
-- cleanup
DROP TABLE mv_base_b CASCADE;
NOTICE: drop cascades to 3 other objects
DETAIL: drop cascades to materialized view mv_ivm_1
drop cascades to view b_view
drop cascades to materialized view b_mview
DROP TABLE mv_base_a CASCADE;