diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index e583989e1d..b79b9be687 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -882,8 +882,54 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner, static void refresh_by_heap_swap(Oid matviewOid, Oid OIDNewHeap, char relpersistence) { + Relation matviewRel; + EState *estate; + ResultRelInfo resultRelInfo; + TransitionCaptureState *transition_capture; + finish_heap_swap(matviewOid, OIDNewHeap, false, false, true, true, RecentXmin, ReadNextMultiXactId(), relpersistence); + + matviewRel = heap_open(matviewOid, NoLock); + + /* Prepare to catch AFTER triggers. */ + AfterTriggerBeginQuery(); + + /* + * To fire triggers, we'll need an EState as well as a ResultRelInfo. + */ + estate = CreateExecutorState(); + + InitResultRelInfo(&resultRelInfo, + matviewRel, + 0, /* dummy rangetable index */ + NULL, + 0); + estate->es_result_relations = &resultRelInfo; + estate->es_num_result_relations = 1; + estate->es_result_relation_info = &resultRelInfo; + + /* Execute AFTER STATEMENT truncate triggers */ + ExecASTruncateTriggers(estate, &resultRelInfo); + + transition_capture = + MakeTransitionCaptureState(matviewRel->trigdesc, + RelationGetRelid(matviewRel), + CMD_INSERT); + + /* Execute AFTER STATEMENT insertion triggers */ + ExecASInsertTriggers(estate, &resultRelInfo, transition_capture); + + /* Handle queued AFTER triggers */ + AfterTriggerEndQuery(estate); + + /* Close any trigger target relations */ + ExecCleanUpTriggerState(estate); + + /* We can clean up the EState now */ + FreeExecutorState(estate); + + heap_close(matviewRel, NoLock); } /*