diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 62e76e6cfb75646ac79b4e7692856d7f0665a832..6f0a7a2e1a445577b02d816c4988a6ebe7300123 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.20 1997/08/27 09:02:24 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.21 1997/09/01 08:01:46 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -51,6 +51,7 @@ #include "optimizer/var.h" #include "access/heapam.h" #include "catalog/heap.h" +#include "commands/trigger.h" @@ -917,7 +918,26 @@ ExecAppend(TupleTableSlot *slot, * cim -12/1/89 * ---------------- */ - + + /* BEFORE ROW INSERT Triggers */ + if ( resultRelationDesc->trigdesc && + resultRelationDesc->trigdesc->n_before_row[TRIGGER_ACTION_INSERT] > 0 ) + { + HeapTuple newtuple; + + newtuple = ExecBRInsertTriggers (resultRelationDesc, tuple); + + if ( newtuple == NULL ) /* "do nothing" */ + return; + + if ( newtuple != tuple ) /* modified by Trigger(s) */ + { + Assert ( slot->ttc_shouldFree ); + pfree (tuple); + slot->val = tuple = newtuple; + } + } + /* ---------------- * Check the constraints of a tuple * ---------------- @@ -959,6 +979,11 @@ ExecAppend(TupleTableSlot *slot, } (estate->es_processed)++; estate->es_lastoid = newId; + + /* AFTER ROW INSERT Triggers */ + if ( resultRelationDesc->trigdesc && + resultRelationDesc->trigdesc->n_after_row[TRIGGER_ACTION_INSERT] > 0 ) + ExecARInsertTriggers (resultRelationDesc, tuple); } /* ---------------------------------------------------------------- @@ -982,7 +1007,19 @@ ExecDelete(TupleTableSlot *slot, */ resultRelationInfo = estate->es_result_relation_info; resultRelationDesc = resultRelationInfo->ri_RelationDesc; - + + /* BEFORE ROW DELETE Triggers */ + if ( resultRelationDesc->trigdesc && + resultRelationDesc->trigdesc->n_before_row[TRIGGER_ACTION_DELETE] > 0 ) + { + bool dodelete; + + dodelete = ExecBRDeleteTriggers (resultRelationDesc, tupleid); + + if ( !dodelete ) /* "do nothing" */ + return; + } + /* ---------------- * delete the tuple * ---------------- @@ -1005,6 +1042,11 @@ ExecDelete(TupleTableSlot *slot, * when it finds deleted heap tuples. -cim 9/27/89 * ---------------- */ + + /* AFTER ROW DELETE Triggers */ + if ( resultRelationDesc->trigdesc && + resultRelationDesc->trigdesc->n_after_row[TRIGGER_ACTION_DELETE] > 0 ) + ExecARDeleteTriggers (resultRelationDesc, tupleid); } @@ -1059,6 +1101,25 @@ ExecReplace(TupleTableSlot *slot, * cim -12/1/89 * ---------------- */ + + /* BEFORE ROW UPDATE Triggers */ + if ( resultRelationDesc->trigdesc && + resultRelationDesc->trigdesc->n_before_row[TRIGGER_ACTION_UPDATE] > 0 ) + { + HeapTuple newtuple; + + newtuple = ExecBRUpdateTriggers (resultRelationDesc, tupleid, tuple); + + if ( newtuple == NULL ) /* "do nothing" */ + return; + + if ( newtuple != tuple ) /* modified by Trigger(s) */ + { + Assert ( slot->ttc_shouldFree ); + pfree (tuple); + slot->val = tuple = newtuple; + } + } /* ---------------- * Check the constraints of a tuple @@ -1122,6 +1183,11 @@ ExecReplace(TupleTableSlot *slot, if (numIndices > 0) { ExecInsertIndexTuples(slot, &(tuple->t_ctid), estate, true); } + + /* AFTER ROW UPDATE Triggers */ + if ( resultRelationDesc->trigdesc && + resultRelationDesc->trigdesc->n_after_row[TRIGGER_ACTION_UPDATE] > 0 ) + ExecARUpdateTriggers (resultRelationDesc, tupleid, tuple); } static HeapTuple