citus/src/test/regress/sql/cimv.sql

410 lines
8.2 KiB
SQL

--
-- CIMV
-- Tests for Citus Incremental Materialized Views
--
\set VERBOSITY terse
SET citus.next_shard_id TO 400000;
CREATE SCHEMA cimv;
SET search_path TO cimv, public;
SET citus.shard_count TO 4;
CREATE TABLE events (a int, b int, c double precision, d timestamp, e bigint);
INSERT INTO events
SELECT v % 10 AS a,
v % 100 AS b,
v / 3.0 AS c,
timestamp '2020-01-01 20:00:00' +
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
timestamp '2020-01-01 10:00:00')) AS d,
v AS e
FROM generate_series(1, 10000) v;
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
min(b) AS min_b,
max(b) AS max_b,
avg(b) AS avg_b,
min(c) AS min_c,
max(c) AS max_c,
avg(c) AS avg_c,
min(e) AS min_e,
max(e) AS max_e,
avg(e) AS avg_e
FROM events
WHERE b > 10
GROUP BY a, d_hour;
SELECT a,
d_hour,
min_b::numeric(12,2),
max_b::numeric(12,2),
avg_b::numeric(12,2),
min_c::numeric(12,2),
max_c::numeric(12,2),
avg_c::numeric(12,2),
min_e::numeric(12,2),
max_e::numeric(12,2),
avg_e::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
INSERT INTO events
SELECT v % 10 AS a,
v % 100 AS b,
v / 3.0 AS c,
timestamp '2020-01-01 20:00:00' +
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
timestamp '2020-01-01 10:00:00')) AS d,
v AS e
FROM generate_series(10000, 11000) v;
SELECT a,
d_hour,
min_b::numeric(12,2),
max_b::numeric(12,2),
avg_b::numeric(12,2),
min_c::numeric(12,2),
max_c::numeric(12,2),
avg_c::numeric(12,2),
min_e::numeric(12,2),
max_e::numeric(12,2),
avg_e::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DELETE FROM events WHERE b < 100;
DROP VIEW mv;
DROP MATERIALIZED VIEW mv;
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
avg(b) AS avg_b
FROM events
WHERE b > 10
GROUP BY a, d_hour;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DELETE FROM events WHERE b < 20;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
UPDATE events SET b = b + b;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DROP MATERIALIZED VIEW mv;
CREATE MATERIALIZED VIEW mv WITH (citus.cimv, citus.insertonlycapture) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
avg(b) AS avg_b
FROM events
WHERE b > 10
GROUP BY a, d_hour;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
INSERT INTO events
SELECT v % 10 AS a,
v % 100 AS b,
v / 3.0 AS c,
timestamp '2020-01-01 20:00:00' +
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
timestamp '2020-01-01 10:00:00')) AS d,
v AS e
FROM generate_series(11000, 12000) v;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DELETE FROM events WHERE b < 100;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
UPDATE events SET b = b + b;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
REFRESH MATERIALIZED VIEW mv WITH NO DATA;
SELECT * FROM mv;
REFRESH MATERIALIZED VIEW mv;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DROP MATERIALIZED VIEW mv;
CREATE MATERIALIZED VIEW mv WITH (citus.cimv, citus.insertonlycapture) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
avg(b) AS avg_b
FROM events
WHERE b > 10
GROUP BY a, d_hour WITH NO DATA;
SELECT * FROM mv;
DROP MATERIALIZED VIEW mv;
SELECT create_distributed_table('events', 'a');
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
min(b) AS min_b,
max(b) AS max_b,
avg(b) AS avg_b,
min(c) AS min_c,
max(c) AS max_c,
avg(c) AS avg_c,
min(e) AS min_e,
max(e) AS max_e,
avg(e) AS avg_e
FROM events
WHERE b > 10
GROUP BY a, d_hour;
SELECT a,
d_hour,
min_b::numeric(12,2),
max_b::numeric(12,2),
avg_b::numeric(12,2),
min_c::numeric(12,2),
max_c::numeric(12,2),
avg_c::numeric(12,2),
min_e::numeric(12,2),
max_e::numeric(12,2),
avg_e::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
INSERT INTO events
SELECT v % 10 AS a,
v % 100 AS b,
v / 3.0 AS c,
timestamp '2020-01-01 20:00:00' +
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
timestamp '2020-01-01 10:00:00')) AS d,
v AS e
FROM generate_series(12000, 13000) v;
SELECT a,
d_hour,
min_b::numeric(12,2),
max_b::numeric(12,2),
avg_b::numeric(12,2),
min_c::numeric(12,2),
max_c::numeric(12,2),
avg_c::numeric(12,2),
min_e::numeric(12,2),
max_e::numeric(12,2),
avg_e::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DELETE FROM events WHERE b < 100;
DROP VIEW mv;
DROP MATERIALIZED VIEW mv;
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
avg(b) AS avg_b
FROM events
WHERE b > 10
GROUP BY a, d_hour;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DELETE FROM events WHERE b < 20;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
UPDATE events SET b = b + b;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DROP MATERIALIZED VIEW mv;
CREATE MATERIALIZED VIEW mv WITH (citus.cimv, citus.insertonlycapture) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
avg(b) AS avg_b
FROM events
WHERE b > 10
GROUP BY a, d_hour;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
INSERT INTO events
SELECT v % 10 AS a,
v % 100 AS b,
v / 3.0 AS c,
timestamp '2020-01-01 20:00:00' +
((v / 10000.0) * (timestamp '2020-01-01 15:00:00' -
timestamp '2020-01-01 10:00:00')) AS d,
v AS e
FROM generate_series(13000, 14000) v;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DELETE FROM events WHERE b < 100;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
UPDATE events SET b = b + b;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
REFRESH MATERIALIZED VIEW mv WITH NO DATA;
SELECT * FROM mv;
REFRESH MATERIALIZED VIEW mv;
SELECT a,
d_hour,
avg_b::numeric(12,2)
FROM mv
ORDER BY a, d_hour;
DROP MATERIALIZED VIEW mv;
CREATE MATERIALIZED VIEW mv WITH (citus.cimv, citus.insertonlycapture) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
avg(b) AS avg_b
FROM events
WHERE b > 10
GROUP BY a, d_hour WITH NO DATA;
SELECT * FROM mv;
-- make sure same mv can be created in different schemas without overlap
CREATE SCHEMA another_schema;
SET search_path to another_schema;
SET citus.shard_count TO 4;
CREATE TABLE events (a int, b int, c double precision, d timestamp, e bigint);
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
min(b) AS min_b,
max(b) AS max_b,
avg(b) AS avg_b,
min(c) AS min_c,
max(c) AS max_c,
avg(c) AS avg_c,
min(e) AS min_e,
max(e) AS max_e,
avg(e) AS avg_e
FROM events
WHERE b > 10
GROUP BY a, d_hour;
DROP MATERIALIZED VIEW mv;
-- test that another user can create CIMV as well
CREATE USER new_user;
CREATE SCHEMA another_schema2;
SET search_path to another_schema2;
CREATE TABLE events (a int, b int, c double precision, d timestamp, e bigint);
CREATE MATERIALIZED VIEW mv WITH (citus.cimv) AS
SELECT a,
date_trunc('hour', d) AS d_hour,
min(b) AS min_b,
max(b) AS max_b,
avg(b) AS avg_b,
min(c) AS min_c,
max(c) AS max_c,
avg(c) AS avg_c,
min(e) AS min_e,
max(e) AS max_e,
avg(e) AS avg_e
FROM events
WHERE b > 10
GROUP BY a, d_hour;
REFRESH MATERIALIZED VIEW mv;
DROP MATERIALIZED VIEW mv CASCADE;
SET client_min_messages TO WARNING; -- suppress cascade messages
DROP SCHEMA cimv CASCADE;