1
/*-------------------------------------------------------------------------
4
* Declarations for trigger handling.
6
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
7
* Portions Copyright (c) 1994, Regents of the University of California
9
* $PostgreSQL: pgsql/src/include/commands/trigger.h,v 1.51.4.1 2005-04-11 19:51:32 tgl Exp $
11
*-------------------------------------------------------------------------
16
#include "nodes/execnodes.h"
17
#include "nodes/parsenodes.h"
20
* TriggerData is the node type that is passed as fmgr "context" info
21
* when a function is called by the trigger manager.
24
#define CALLED_AS_TRIGGER(fcinfo) \
25
((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))
27
typedef uint32 TriggerEvent;
29
typedef struct TriggerData
32
TriggerEvent tg_event;
34
HeapTuple tg_trigtuple;
35
HeapTuple tg_newtuple;
37
Buffer tg_trigtuplebuf;
38
Buffer tg_newtuplebuf;
41
/* TriggerEvent bit flags */
43
#define TRIGGER_EVENT_INSERT 0x00000000
44
#define TRIGGER_EVENT_DELETE 0x00000001
45
#define TRIGGER_EVENT_UPDATE 0x00000002
46
#define TRIGGER_EVENT_OPMASK 0x00000003
47
#define TRIGGER_EVENT_ROW 0x00000004
48
#define TRIGGER_EVENT_BEFORE 0x00000008
50
/* More TriggerEvent flags, used only within trigger.c */
52
#define AFTER_TRIGGER_DONE 0x00000010
53
#define AFTER_TRIGGER_IN_PROGRESS 0x00000020
54
#define AFTER_TRIGGER_DEFERRABLE 0x00000040
55
#define AFTER_TRIGGER_INITDEFERRED 0x00000080
57
#define TRIGGER_FIRED_BY_INSERT(event) \
58
(((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
61
#define TRIGGER_FIRED_BY_DELETE(event) \
62
(((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
65
#define TRIGGER_FIRED_BY_UPDATE(event) \
66
(((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
69
#define TRIGGER_FIRED_FOR_ROW(event) \
70
((TriggerEvent) (event) & TRIGGER_EVENT_ROW)
72
#define TRIGGER_FIRED_FOR_STATEMENT(event) \
73
(!TRIGGER_FIRED_FOR_ROW (event))
75
#define TRIGGER_FIRED_BEFORE(event) \
76
((TriggerEvent) (event) & TRIGGER_EVENT_BEFORE)
78
#define TRIGGER_FIRED_AFTER(event) \
79
(!TRIGGER_FIRED_BEFORE (event))
82
* RI trigger function arguments are stored in pg_trigger.tgargs bytea
84
* constrname\0fkrel\0pkrel\0matchtype\0fkatt\0pkatt\0fkatt\0pkatt\0...
86
* There are one or more pairs of fkatt/pkatt names.
88
* The relation names are no longer of much use since they are not
89
* guaranteed unique; they are present only for backwards compatibility.
90
* Use the tgrelid and tgconstrrelid fields to identify the referenced
91
* relations, instead. (But note that which is which will depend on which
92
* trigger you are looking at!)
94
#define RI_CONSTRAINT_NAME_ARGNO 0
95
#define RI_FK_RELNAME_ARGNO 1
96
#define RI_PK_RELNAME_ARGNO 2
97
#define RI_MATCH_TYPE_ARGNO 3
98
#define RI_FIRST_ATTNAME_ARGNO 4 /* first attname pair
101
#define RI_KEYPAIR_FK_IDX 0
102
#define RI_KEYPAIR_PK_IDX 1
104
#define RI_MAX_NUMKEYS INDEX_MAX_KEYS
105
#define RI_MAX_ARGUMENTS (RI_FIRST_ATTNAME_ARGNO + (RI_MAX_NUMKEYS * 2))
108
extern Oid CreateTrigger(CreateTrigStmt *stmt, bool forConstraint);
110
extern void DropTrigger(Oid relid, const char *trigname,
111
DropBehavior behavior);
112
extern void RemoveTriggerById(Oid trigOid);
114
extern void renametrig(Oid relid, const char *oldname, const char *newname);
116
extern void RelationBuildTriggers(Relation relation);
118
extern TriggerDesc *CopyTriggerDesc(TriggerDesc *trigdesc);
120
extern void FreeTriggerDesc(TriggerDesc *trigdesc);
122
extern void ExecBSInsertTriggers(EState *estate,
123
ResultRelInfo *relinfo);
124
extern void ExecASInsertTriggers(EState *estate,
125
ResultRelInfo *relinfo);
126
extern HeapTuple ExecBRInsertTriggers(EState *estate,
127
ResultRelInfo *relinfo,
128
HeapTuple trigtuple);
129
extern void ExecARInsertTriggers(EState *estate,
130
ResultRelInfo *relinfo,
131
HeapTuple trigtuple);
132
extern void ExecBSDeleteTriggers(EState *estate,
133
ResultRelInfo *relinfo);
134
extern void ExecASDeleteTriggers(EState *estate,
135
ResultRelInfo *relinfo);
136
extern bool ExecBRDeleteTriggers(EState *estate,
137
ResultRelInfo *relinfo,
140
extern void ExecARDeleteTriggers(EState *estate,
141
ResultRelInfo *relinfo,
142
ItemPointer tupleid);
143
extern void ExecBSUpdateTriggers(EState *estate,
144
ResultRelInfo *relinfo);
145
extern void ExecASUpdateTriggers(EState *estate,
146
ResultRelInfo *relinfo);
147
extern HeapTuple ExecBRUpdateTriggers(EState *estate,
148
ResultRelInfo *relinfo,
152
extern void ExecARUpdateTriggers(EState *estate,
153
ResultRelInfo *relinfo,
157
extern void AfterTriggerBeginXact(void);
158
extern void AfterTriggerBeginQuery(void);
159
extern void AfterTriggerEndQuery(void);
160
extern void AfterTriggerFireDeferred(void);
161
extern void AfterTriggerEndXact(bool isCommit);
162
extern void AfterTriggerBeginSubXact(void);
163
extern void AfterTriggerEndSubXact(bool isCommit);
165
extern void AfterTriggerSetState(ConstraintsSetStmt *stmt);
169
* in utils/adt/ri_triggers.c
171
extern bool RI_FKey_keyequal_upd(TriggerData *trigdata);
172
extern bool RI_Initial_Check(FkConstraint *fkconstraint,
176
#endif /* TRIGGER_H */