Add recreate_all_immvs function.

Recreate change prevent triggers during refresh_immv in addition to base
table triggers.
This commit is contained in:
Adam Guo 2025-03-26 22:44:45 +00:00
parent 0a5bd500e6
commit 7bc34dfa90
2 changed files with 27 additions and 2 deletions

View file

@ -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

View file

@ -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
$$;