refresh_immv(immv_name, with_data) is a function to refresh IMMV like REFRESH MATERIALIZED VIEW command. It has two argument. immv_name is incrementally maintainable materialized view's name, and with_data is an option that is corresponding to the WITH [NO] DATA option. When with_data is set false, the IMMV gets unpopulated. One of differences between IMMVs unpopulated by this function and normal materialized views unpopulated by REFRESH ... WITH NO DATA is that such IMMVs can be referenced by SELECT but return no rows, while unpopulated materialized views are not scanable. The behaviour may be changed in future to raise an error when unpopulated an IMMV is scanned.
73 lines
1.6 KiB
PL/PgSQL
73 lines
1.6 KiB
PL/PgSQL
-- catalog
|
|
|
|
CREATE SCHEMA __pg_ivm__;
|
|
|
|
CREATE TABLE __pg_ivm__.pg_ivm_immv(
|
|
immvrelid regclass NOT NULL,
|
|
ispopulated bool NOT NULL,
|
|
viewdef text NOT NULL,
|
|
|
|
CONSTRAINT pg_ivm_immv_pkey PRIMARY KEY (immvrelid)
|
|
);
|
|
|
|
ALTER TABLE __pg_ivm__.pg_ivm_immv SET SCHEMA pg_catalog;
|
|
|
|
--CREATE UNIQUE INDEX ON pg_catalog.pg_ivm_immv USING btree (immvrelid);
|
|
|
|
SELECT pg_catalog.pg_extension_config_dump('pg_catalog.pg_ivm_immv', '');
|
|
|
|
-- functions
|
|
|
|
CREATE FUNCTION create_immv(text, text)
|
|
RETURNS bigint
|
|
STRICT
|
|
AS 'MODULE_PATHNAME', 'create_immv'
|
|
LANGUAGE C;
|
|
|
|
CREATE FUNCTION refresh_immv(text, bool)
|
|
RETURNS bigint
|
|
STRICT
|
|
AS 'MODULE_PATHNAME', 'refresh_immv'
|
|
LANGUAGE C;
|
|
|
|
-- trigger functions
|
|
|
|
CREATE FUNCTION "IVM_immediate_before"()
|
|
RETURNS trigger
|
|
AS 'MODULE_PATHNAME', 'IVM_immediate_before'
|
|
LANGUAGE C;
|
|
|
|
CREATE FUNCTION "IVM_immediate_maintenance"()
|
|
RETURNS trigger
|
|
AS 'MODULE_PATHNAME', 'IVM_immediate_maintenance'
|
|
LANGUAGE C;
|
|
|
|
CREATE FUNCTION "IVM_prevent_immv_change"()
|
|
RETURNS trigger
|
|
AS 'MODULE_PATHNAME', 'IVM_prevent_immv_change'
|
|
LANGUAGE C;
|
|
|
|
|
|
/*
|
|
* DDL trigger that removes entry from pg_ivm_immv
|
|
*/
|
|
CREATE FUNCTION pg_ivm_sql_drop_trigger_func()
|
|
RETURNS event_trigger AS $$
|
|
DECLARE
|
|
pg_class_oid OID;
|
|
relids REGCLASS[];
|
|
|
|
BEGIN
|
|
pg_class_oid = 'pg_catalog.pg_class'::regclass;
|
|
|
|
/* Find relids to remove */
|
|
DELETE FROM pg_catalog.pg_ivm_immv
|
|
USING pg_catalog.pg_event_trigger_dropped_objects() AS events
|
|
WHERE immvrelid = events.objid AND
|
|
events.classid = pg_class_oid AND events.objsubid = 0;
|
|
END
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE EVENT TRIGGER pg_ivm_sql_drop_trigger
|
|
ON sql_drop
|
|
EXECUTE PROCEDURE pg_catalog.pg_ivm_sql_drop_trigger_func();
|