diff --git a/matview.c b/matview.c index aa95b58..8854124 100644 --- a/matview.c +++ b/matview.c @@ -444,7 +444,8 @@ RefreshImmvByOid(Oid matviewOid, bool is_create, bool skipData, tgform = (Form_pg_trigger) GETSTRUCT(tgtup); /* If trigger is created by IMMV, delete it. */ - if (strncmp(NameStr(tgform->tgname), "IVM_trigger_", 12) == 0) + if (strncmp(NameStr(tgform->tgname), "IVM_trigger_", 12) == 0 || + strncmp(NameStr(tgform->tgname), "IVM_prevent_", 12) == 0) { obj.classId = foundDep->classid; obj.objectId = foundDep->objid; @@ -474,7 +475,10 @@ RefreshImmvByOid(Oid matviewOid, bool is_create, bool skipData, * is created. */ if (!skipData && !oldPopulated) + { CreateIvmTriggersOnBaseTables(dataQuery, matviewOid); + CreateChangePreventTrigger(matviewOid); + } /* * Create the transient table that will receive the regenerated data. Lock diff --git a/pg_ivm--1.10--1.11.sql b/pg_ivm--1.10--1.11.sql index 745f3dc..4f99101 100644 --- a/pg_ivm--1.10--1.11.sql +++ b/pg_ivm--1.10--1.11.sql @@ -1,5 +1,24 @@ ALTER TABLE pgivm.pg_ivm_immv ADD COLUMN querystring text NOT NULL; +CREATE FUNCTION pgivm.recreate_all_immvs() RETURNS VOID LANGUAGE PLPGSQL AS +$$ +BEGIN + PERFORM pgivm.refresh_immv(n.nspname || '.' || c.relname, false) + FROM pgivm.pg_ivm_immv as ivm + JOIN pg_catalog.pg_class as c + ON c.oid = ivm.immvrelid + JOIN pg_catalog.pg_namespace as n + ON c.relnamespace = n.oid; + + PERFORM pgivm.refresh_immv(n.nspname || '.' || c.relname, true) + FROM pgivm.pg_ivm_immv as ivm + JOIN pg_catalog.pg_class as c + ON c.oid = ivm.immvrelid + JOIN pg_catalog.pg_namespace as n + ON c.relnamespace = n.oid; +END +$$; + CREATE FUNCTION pgivm.refresh_query_strings() RETURNS event_trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ @@ -14,7 +33,9 @@ BEGIN UPDATE pgivm.pg_ivm_immv SET querystring = pgivm.get_immv_def(immvrelid); -- Reset search path to the original value. - EXECUTE format('SET search_path = %s', old_search_path); + IF old_search_path != '' AND old_search_path != '""' THEN + EXECUTE format('SET search_path = %s', old_search_path); + END IF; END $$;