]> granicus.if.org Git - postgresql/blob - src/include/catalog/pg_trigger.h
Reorganize our CRC source files again.
[postgresql] / src / include / catalog / pg_trigger.h
1 /*-------------------------------------------------------------------------
2  *
3  * pg_trigger.h
4  *        definition of the system "trigger" relation (pg_trigger)
5  *        along with the relation's initial contents.
6  *
7  *
8  * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
9  * Portions Copyright (c) 1994, Regents of the University of California
10  *
11  * src/include/catalog/pg_trigger.h
12  *
13  * NOTES
14  *        the genbki.pl script reads this file and generates .bki
15  *        information from the DATA() statements.
16  *
17  *-------------------------------------------------------------------------
18  */
19 #ifndef PG_TRIGGER_H
20 #define PG_TRIGGER_H
21
22 #include "catalog/genbki.h"
23
24 /* ----------------
25  *              pg_trigger definition.  cpp turns this into
26  *              typedef struct FormData_pg_trigger
27  *
28  * Note: when tgconstraint is nonzero, tgconstrrelid, tgconstrindid,
29  * tgdeferrable, and tginitdeferred are largely redundant with the referenced
30  * pg_constraint entry.  However, it is possible for a non-deferrable trigger
31  * to be associated with a deferrable constraint.
32  * ----------------
33  */
34 #define TriggerRelationId  2620
35
36 CATALOG(pg_trigger,2620)
37 {
38         Oid                     tgrelid;                /* relation trigger is attached to */
39         NameData        tgname;                 /* trigger's name */
40         Oid                     tgfoid;                 /* OID of function to be called */
41         int16           tgtype;                 /* BEFORE/AFTER/INSTEAD, UPDATE/DELETE/INSERT,
42                                                                  * ROW/STATEMENT; see below */
43         char            tgenabled;              /* trigger's firing configuration WRT
44                                                                  * session_replication_role */
45         bool            tgisinternal;   /* trigger is system-generated */
46         Oid                     tgconstrrelid;  /* constraint's FROM table, if any */
47         Oid                     tgconstrindid;  /* constraint's supporting index, if any */
48         Oid                     tgconstraint;   /* associated pg_constraint entry, if any */
49         bool            tgdeferrable;   /* constraint trigger is deferrable */
50         bool            tginitdeferred; /* constraint trigger is deferred initially */
51         int16           tgnargs;                /* # of extra arguments in tgargs */
52
53         /*
54          * Variable-length fields start here, but we allow direct access to
55          * tgattr. Note: tgattr and tgargs must not be null.
56          */
57         int2vector      tgattr;                 /* column numbers, if trigger is on columns */
58
59 #ifdef CATALOG_VARLEN
60         bytea           tgargs BKI_FORCE_NOT_NULL; /* first\000second\000tgnargs\000 */
61         pg_node_tree tgqual;            /* WHEN expression, or NULL if none */
62 #endif
63 } FormData_pg_trigger;
64
65 /* ----------------
66  *              Form_pg_trigger corresponds to a pointer to a tuple with
67  *              the format of pg_trigger relation.
68  * ----------------
69  */
70 typedef FormData_pg_trigger *Form_pg_trigger;
71
72 /* ----------------
73  *              compiler constants for pg_trigger
74  * ----------------
75  */
76 #define Natts_pg_trigger                                15
77 #define Anum_pg_trigger_tgrelid                 1
78 #define Anum_pg_trigger_tgname                  2
79 #define Anum_pg_trigger_tgfoid                  3
80 #define Anum_pg_trigger_tgtype                  4
81 #define Anum_pg_trigger_tgenabled               5
82 #define Anum_pg_trigger_tgisinternal    6
83 #define Anum_pg_trigger_tgconstrrelid   7
84 #define Anum_pg_trigger_tgconstrindid   8
85 #define Anum_pg_trigger_tgconstraint    9
86 #define Anum_pg_trigger_tgdeferrable    10
87 #define Anum_pg_trigger_tginitdeferred  11
88 #define Anum_pg_trigger_tgnargs                 12
89 #define Anum_pg_trigger_tgattr                  13
90 #define Anum_pg_trigger_tgargs                  14
91 #define Anum_pg_trigger_tgqual                  15
92
93 /* Bits within tgtype */
94 #define TRIGGER_TYPE_ROW                                (1 << 0)
95 #define TRIGGER_TYPE_BEFORE                             (1 << 1)
96 #define TRIGGER_TYPE_INSERT                             (1 << 2)
97 #define TRIGGER_TYPE_DELETE                             (1 << 3)
98 #define TRIGGER_TYPE_UPDATE                             (1 << 4)
99 #define TRIGGER_TYPE_TRUNCATE                   (1 << 5)
100 #define TRIGGER_TYPE_INSTEAD                    (1 << 6)
101
102 #define TRIGGER_TYPE_LEVEL_MASK                 (TRIGGER_TYPE_ROW)
103 #define TRIGGER_TYPE_STATEMENT                  0
104
105 /* Note bits within TRIGGER_TYPE_TIMING_MASK aren't adjacent */
106 #define TRIGGER_TYPE_TIMING_MASK \
107         (TRIGGER_TYPE_BEFORE | TRIGGER_TYPE_INSTEAD)
108 #define TRIGGER_TYPE_AFTER                              0
109
110 #define TRIGGER_TYPE_EVENT_MASK \
111         (TRIGGER_TYPE_INSERT | TRIGGER_TYPE_DELETE | TRIGGER_TYPE_UPDATE | TRIGGER_TYPE_TRUNCATE)
112
113 /* Macros for manipulating tgtype */
114 #define TRIGGER_CLEAR_TYPE(type)                ((type) = 0)
115
116 #define TRIGGER_SETT_ROW(type)                  ((type) |= TRIGGER_TYPE_ROW)
117 #define TRIGGER_SETT_STATEMENT(type)    ((type) |= TRIGGER_TYPE_STATEMENT)
118 #define TRIGGER_SETT_BEFORE(type)               ((type) |= TRIGGER_TYPE_BEFORE)
119 #define TRIGGER_SETT_AFTER(type)                ((type) |= TRIGGER_TYPE_AFTER)
120 #define TRIGGER_SETT_INSTEAD(type)              ((type) |= TRIGGER_TYPE_INSTEAD)
121 #define TRIGGER_SETT_INSERT(type)               ((type) |= TRIGGER_TYPE_INSERT)
122 #define TRIGGER_SETT_DELETE(type)               ((type) |= TRIGGER_TYPE_DELETE)
123 #define TRIGGER_SETT_UPDATE(type)               ((type) |= TRIGGER_TYPE_UPDATE)
124 #define TRIGGER_SETT_TRUNCATE(type)             ((type) |= TRIGGER_TYPE_TRUNCATE)
125
126 #define TRIGGER_FOR_ROW(type)                   ((type) & TRIGGER_TYPE_ROW)
127 #define TRIGGER_FOR_BEFORE(type)                (((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_BEFORE)
128 #define TRIGGER_FOR_AFTER(type)                 (((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_AFTER)
129 #define TRIGGER_FOR_INSTEAD(type)               (((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_INSTEAD)
130 #define TRIGGER_FOR_INSERT(type)                ((type) & TRIGGER_TYPE_INSERT)
131 #define TRIGGER_FOR_DELETE(type)                ((type) & TRIGGER_TYPE_DELETE)
132 #define TRIGGER_FOR_UPDATE(type)                ((type) & TRIGGER_TYPE_UPDATE)
133 #define TRIGGER_FOR_TRUNCATE(type)              ((type) & TRIGGER_TYPE_TRUNCATE)
134
135 /*
136  * Efficient macro for checking if tgtype matches a particular level
137  * (TRIGGER_TYPE_ROW or TRIGGER_TYPE_STATEMENT), timing (TRIGGER_TYPE_BEFORE,
138  * TRIGGER_TYPE_AFTER or TRIGGER_TYPE_INSTEAD), and event (TRIGGER_TYPE_INSERT,
139  * TRIGGER_TYPE_DELETE, TRIGGER_TYPE_UPDATE, or TRIGGER_TYPE_TRUNCATE).  Note
140  * that a tgtype can match more than one event, but only one level or timing.
141  */
142 #define TRIGGER_TYPE_MATCHES(type, level, timing, event) \
143         (((type) & (TRIGGER_TYPE_LEVEL_MASK | TRIGGER_TYPE_TIMING_MASK | (event))) == ((level) | (timing) | (event)))
144
145 #endif   /* PG_TRIGGER_H */