pg_ivm/sql/refresh_immv.sql
Jason Petersen fe6a09e5f7 WIP: Allow partitioned tables in IMMVs
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
2024-09-26 10:22:45 -06:00

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;