~vcs-imports/mammoth-replicator/trunk

« back to all changes in this revision

Viewing changes to src/include/commands/trigger.h

  • Committer: alvherre
  • Date: 2005-12-16 21:24:52 UTC
  • Revision ID: svn-v4:db760fc0-0f08-0410-9d63-cc6633f64896:trunk:1
Initial import of the REL8_0_3 sources from the Pgsql CVS repository.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*-------------------------------------------------------------------------
 
2
 *
 
3
 * trigger.h
 
4
 *        Declarations for trigger handling.
 
5
 *
 
6
 * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
 
7
 * Portions Copyright (c) 1994, Regents of the University of California
 
8
 *
 
9
 * $PostgreSQL: pgsql/src/include/commands/trigger.h,v 1.51.4.1 2005-04-11 19:51:32 tgl Exp $
 
10
 *
 
11
 *-------------------------------------------------------------------------
 
12
 */
 
13
#ifndef TRIGGER_H
 
14
#define TRIGGER_H
 
15
 
 
16
#include "nodes/execnodes.h"
 
17
#include "nodes/parsenodes.h"
 
18
 
 
19
/*
 
20
 * TriggerData is the node type that is passed as fmgr "context" info
 
21
 * when a function is called by the trigger manager.
 
22
 */
 
23
 
 
24
#define CALLED_AS_TRIGGER(fcinfo) \
 
25
        ((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))
 
26
 
 
27
typedef uint32 TriggerEvent;
 
28
 
 
29
typedef struct TriggerData
 
30
{
 
31
        NodeTag         type;
 
32
        TriggerEvent tg_event;
 
33
        Relation        tg_relation;
 
34
        HeapTuple       tg_trigtuple;
 
35
        HeapTuple       tg_newtuple;
 
36
        Trigger    *tg_trigger;
 
37
        Buffer          tg_trigtuplebuf;
 
38
        Buffer          tg_newtuplebuf;
 
39
} TriggerData;
 
40
 
 
41
/* TriggerEvent bit flags */
 
42
 
 
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
 
49
 
 
50
/* More TriggerEvent flags, used only within trigger.c */
 
51
 
 
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
 
56
 
 
57
#define TRIGGER_FIRED_BY_INSERT(event)  \
 
58
                (((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
 
59
                                                                                                TRIGGER_EVENT_INSERT)
 
60
 
 
61
#define TRIGGER_FIRED_BY_DELETE(event)  \
 
62
                (((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
 
63
                                                                                                TRIGGER_EVENT_DELETE)
 
64
 
 
65
#define TRIGGER_FIRED_BY_UPDATE(event)  \
 
66
                (((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
 
67
                                                                                                TRIGGER_EVENT_UPDATE)
 
68
 
 
69
#define TRIGGER_FIRED_FOR_ROW(event)                    \
 
70
                ((TriggerEvent) (event) & TRIGGER_EVENT_ROW)
 
71
 
 
72
#define TRIGGER_FIRED_FOR_STATEMENT(event)              \
 
73
                (!TRIGGER_FIRED_FOR_ROW (event))
 
74
 
 
75
#define TRIGGER_FIRED_BEFORE(event)                             \
 
76
                ((TriggerEvent) (event) & TRIGGER_EVENT_BEFORE)
 
77
 
 
78
#define TRIGGER_FIRED_AFTER(event)                              \
 
79
                (!TRIGGER_FIRED_BEFORE (event))
 
80
 
 
81
/*
 
82
 * RI trigger function arguments are stored in pg_trigger.tgargs bytea
 
83
 *
 
84
 *       constrname\0fkrel\0pkrel\0matchtype\0fkatt\0pkatt\0fkatt\0pkatt\0...
 
85
 *
 
86
 * There are one or more pairs of fkatt/pkatt names.
 
87
 *
 
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!)
 
93
 */
 
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
 
99
                                                                                                 * starts here */
 
100
 
 
101
#define RI_KEYPAIR_FK_IDX                               0
 
102
#define RI_KEYPAIR_PK_IDX                               1
 
103
 
 
104
#define RI_MAX_NUMKEYS                                  INDEX_MAX_KEYS
 
105
#define RI_MAX_ARGUMENTS                (RI_FIRST_ATTNAME_ARGNO + (RI_MAX_NUMKEYS * 2))
 
106
 
 
107
 
 
108
extern Oid      CreateTrigger(CreateTrigStmt *stmt, bool forConstraint);
 
109
 
 
110
extern void DropTrigger(Oid relid, const char *trigname,
 
111
                        DropBehavior behavior);
 
112
extern void RemoveTriggerById(Oid trigOid);
 
113
 
 
114
extern void renametrig(Oid relid, const char *oldname, const char *newname);
 
115
 
 
116
extern void RelationBuildTriggers(Relation relation);
 
117
 
 
118
extern TriggerDesc *CopyTriggerDesc(TriggerDesc *trigdesc);
 
119
 
 
120
extern void FreeTriggerDesc(TriggerDesc *trigdesc);
 
121
 
 
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,
 
138
                                         ItemPointer tupleid,
 
139
                                         CommandId cid);
 
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,
 
149
                                         ItemPointer tupleid,
 
150
                                         HeapTuple newtuple,
 
151
                                         CommandId cid);
 
152
extern void ExecARUpdateTriggers(EState *estate,
 
153
                                         ResultRelInfo *relinfo,
 
154
                                         ItemPointer tupleid,
 
155
                                         HeapTuple newtuple);
 
156
 
 
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);
 
164
 
 
165
extern void AfterTriggerSetState(ConstraintsSetStmt *stmt);
 
166
 
 
167
 
 
168
/*
 
169
 * in utils/adt/ri_triggers.c
 
170
 */
 
171
extern bool RI_FKey_keyequal_upd(TriggerData *trigdata);
 
172
extern bool RI_Initial_Check(FkConstraint *fkconstraint,
 
173
                                 Relation rel,
 
174
                                 Relation pkrel);
 
175
 
 
176
#endif   /* TRIGGER_H */