BEFORE/AFTER ROW INSERT/DELETE/UPDATE triggers startup.
This commit is contained in:
parent
8c798538b8
commit
283e18ab0e
@ -26,7 +26,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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 "optimizer/var.h"
|
||||||
#include "access/heapam.h"
|
#include "access/heapam.h"
|
||||||
#include "catalog/heap.h"
|
#include "catalog/heap.h"
|
||||||
|
#include "commands/trigger.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -918,6 +919,25 @@ ExecAppend(TupleTableSlot *slot,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* 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
|
* Check the constraints of a tuple
|
||||||
* ----------------
|
* ----------------
|
||||||
@ -959,6 +979,11 @@ ExecAppend(TupleTableSlot *slot,
|
|||||||
}
|
}
|
||||||
(estate->es_processed)++;
|
(estate->es_processed)++;
|
||||||
estate->es_lastoid = newId;
|
estate->es_lastoid = newId;
|
||||||
|
|
||||||
|
/* AFTER ROW INSERT Triggers */
|
||||||
|
if ( resultRelationDesc->trigdesc &&
|
||||||
|
resultRelationDesc->trigdesc->n_after_row[TRIGGER_ACTION_INSERT] > 0 )
|
||||||
|
ExecARInsertTriggers (resultRelationDesc, tuple);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
@ -983,6 +1008,18 @@ ExecDelete(TupleTableSlot *slot,
|
|||||||
resultRelationInfo = estate->es_result_relation_info;
|
resultRelationInfo = estate->es_result_relation_info;
|
||||||
resultRelationDesc = resultRelationInfo->ri_RelationDesc;
|
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
|
* delete the tuple
|
||||||
* ----------------
|
* ----------------
|
||||||
@ -1006,6 +1043,11 @@ ExecDelete(TupleTableSlot *slot,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* AFTER ROW DELETE Triggers */
|
||||||
|
if ( resultRelationDesc->trigdesc &&
|
||||||
|
resultRelationDesc->trigdesc->n_after_row[TRIGGER_ACTION_DELETE] > 0 )
|
||||||
|
ExecARDeleteTriggers (resultRelationDesc, tupleid);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
@ -1060,6 +1102,25 @@ ExecReplace(TupleTableSlot *slot,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* 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
|
* Check the constraints of a tuple
|
||||||
* ----------------
|
* ----------------
|
||||||
@ -1122,6 +1183,11 @@ ExecReplace(TupleTableSlot *slot,
|
|||||||
if (numIndices > 0) {
|
if (numIndices > 0) {
|
||||||
ExecInsertIndexTuples(slot, &(tuple->t_ctid), estate, true);
|
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
|
static HeapTuple
|
||||||
|
Loading…
x
Reference in New Issue
Block a user