This isn't feature-complete yet, but opening as a place to start a con- versation around how to fully implement this feature. At the moment, the prohibition on partitioned tables is removed, and hooks are added to handle ATTACH PARTITION and DETACH PARTITION. To do: * Add check to prohibit multiple partitioned tables (causes crash) * Change ATTACH/DETACH to be incremental (presently does a REFRESH) * Figure out issue with multiple tables and correct it
54 lines
1.5 KiB
SQL
54 lines
1.5 KiB
SQL
CREATE TABLE t (i int PRIMARY KEY);
|
|
INSERT INTO t SELECT generate_series(1, 5);
|
|
|
|
SELECT create_immv('mv', 'SELECT * FROM t');
|
|
SELECT immvrelid, ispopulated FROM pg_ivm_immv ORDER BY 1;
|
|
|
|
-- Refresh IMMV with data
|
|
SELECT refresh_immv('mv', true);
|
|
SELECT immvrelid, ispopulated FROM pg_ivm_immv ORDER BY 1;
|
|
|
|
INSERT INTO t VALUES(6);
|
|
SELECT i FROM mv ORDER BY 1;
|
|
|
|
-- Make IMMV unpopulated
|
|
SELECT refresh_immv('mv', false);
|
|
SELECT immvrelid, ispopulated FROM pg_ivm_immv ORDER BY 1;
|
|
SELECT i FROM mv ORDER BY 1;
|
|
|
|
-- Immediate maintenance is disabled. IMMV can be scannable and is empty.
|
|
INSERT INTO t VALUES(7);
|
|
SELECT i FROM mv ORDER BY 1;
|
|
|
|
-- Refresh the IMMV and make it populated.
|
|
SELECT refresh_immv('mv', true);
|
|
SELECT immvrelid, ispopulated FROM pg_ivm_immv ORDER BY 1;
|
|
SELECT i FROM mv ORDER BY 1;
|
|
|
|
-- Immediate maintenance is enabled.
|
|
INSERT INTO t VALUES(8);
|
|
SELECT i FROM mv ORDER BY 1;
|
|
|
|
-- Use qualified name
|
|
SELECT refresh_immv('public.mv', true);
|
|
|
|
-- Use not existing IMMV
|
|
SELECT refresh_immv('mv_not_existing', true);
|
|
|
|
-- Try to refresh a normal table -- error
|
|
SELECT refresh_immv('t', true);
|
|
|
|
-- Create partitioned table
|
|
CREATE TABLE foo (id integer) PARTITION BY RANGE(id);
|
|
CREATE TABLE foo_default PARTITION OF foo DEFAULT;
|
|
|
|
INSERT INTO foo VALUES (1), (2), (3);
|
|
|
|
SELECT create_immv('foo_mv', 'SELECT COUNT(*) as count FROM foo');
|
|
SELECT count FROM foo_mv;
|
|
|
|
ALTER TABLE foo DETACH PARTITION foo_default;
|
|
SELECT count FROM foo_mv;
|
|
|
|
ALTER TABLE foo ATTACH PARTITION foo_default DEFAULT;
|
|
SELECT count FROM foo_mv;
|