trigger.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /*-------------------------------------------------------------------------
  2. *
  3. * trigger.h
  4. * Declarations for trigger handling.
  5. *
  6. * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
  7. * Portions Copyright (c) 1994, Regents of the University of California
  8. *
  9. * src/include/commands/trigger.h
  10. *
  11. *-------------------------------------------------------------------------
  12. */
  13. #ifndef TRIGGER_H
  14. #define TRIGGER_H
  15. #include "access/tableam.h"
  16. #include "catalog/objectaddress.h"
  17. #include "nodes/execnodes.h"
  18. #include "nodes/parsenodes.h"
  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. #define CALLED_AS_TRIGGER(fcinfo) \
  24. ((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))
  25. typedef uint32 TriggerEvent;
  26. typedef struct TriggerData
  27. {
  28. NodeTag type;
  29. TriggerEvent tg_event;
  30. Relation tg_relation;
  31. HeapTuple tg_trigtuple;
  32. HeapTuple tg_newtuple;
  33. Trigger *tg_trigger;
  34. TupleTableSlot *tg_trigslot;
  35. TupleTableSlot *tg_newslot;
  36. Tuplestorestate *tg_oldtable;
  37. Tuplestorestate *tg_newtable;
  38. const Bitmapset *tg_updatedcols;
  39. } TriggerData;
  40. /*
  41. * The state for capturing old and new tuples into transition tables for a
  42. * single ModifyTable node (or other operation source, e.g. copyfrom.c).
  43. *
  44. * This is per-caller to avoid conflicts in setting
  45. * tcs_original_insert_tuple. Note, however, that the pointed-to
  46. * private data may be shared across multiple callers.
  47. */
  48. struct AfterTriggersTableData; /* private in trigger.c */
  49. typedef struct TransitionCaptureState
  50. {
  51. /*
  52. * Is there at least one trigger specifying each transition relation on
  53. * the relation explicitly named in the DML statement or COPY command?
  54. * Note: in current usage, these flags could be part of the private state,
  55. * but it seems possibly useful to let callers see them.
  56. */
  57. bool tcs_delete_old_table;
  58. bool tcs_update_old_table;
  59. bool tcs_update_new_table;
  60. bool tcs_insert_new_table;
  61. /*
  62. * For INSERT and COPY, it would be wasteful to convert tuples from child
  63. * format to parent format after they have already been converted in the
  64. * opposite direction during routing. In that case we bypass conversion
  65. * and allow the inserting code (copyfrom.c and nodeModifyTable.c) to
  66. * provide a slot containing the original tuple directly.
  67. */
  68. TupleTableSlot *tcs_original_insert_tuple;
  69. /*
  70. * Private data including the tuplestore(s) into which to insert tuples.
  71. */
  72. struct AfterTriggersTableData *tcs_private;
  73. } TransitionCaptureState;
  74. /*
  75. * TriggerEvent bit flags
  76. *
  77. * Note that we assume different event types (INSERT/DELETE/UPDATE/TRUNCATE)
  78. * can't be OR'd together in a single TriggerEvent. This is unlike the
  79. * situation for pg_trigger rows, so pg_trigger.tgtype uses a different
  80. * representation!
  81. */
  82. #define TRIGGER_EVENT_INSERT 0x00000000
  83. #define TRIGGER_EVENT_DELETE 0x00000001
  84. #define TRIGGER_EVENT_UPDATE 0x00000002
  85. #define TRIGGER_EVENT_TRUNCATE 0x00000003
  86. #define TRIGGER_EVENT_OPMASK 0x00000003
  87. #define TRIGGER_EVENT_ROW 0x00000004
  88. #define TRIGGER_EVENT_BEFORE 0x00000008
  89. #define TRIGGER_EVENT_AFTER 0x00000000
  90. #define TRIGGER_EVENT_INSTEAD 0x00000010
  91. #define TRIGGER_EVENT_TIMINGMASK 0x00000018
  92. /* More TriggerEvent flags, used only within trigger.c */
  93. #define AFTER_TRIGGER_DEFERRABLE 0x00000020
  94. #define AFTER_TRIGGER_INITDEFERRED 0x00000040
  95. #define TRIGGER_FIRED_BY_INSERT(event) \
  96. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_INSERT)
  97. #define TRIGGER_FIRED_BY_DELETE(event) \
  98. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_DELETE)
  99. #define TRIGGER_FIRED_BY_UPDATE(event) \
  100. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_UPDATE)
  101. #define TRIGGER_FIRED_BY_TRUNCATE(event) \
  102. (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_TRUNCATE)
  103. #define TRIGGER_FIRED_FOR_ROW(event) \
  104. ((event) & TRIGGER_EVENT_ROW)
  105. #define TRIGGER_FIRED_FOR_STATEMENT(event) \
  106. (!TRIGGER_FIRED_FOR_ROW(event))
  107. #define TRIGGER_FIRED_BEFORE(event) \
  108. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_BEFORE)
  109. #define TRIGGER_FIRED_AFTER(event) \
  110. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_AFTER)
  111. #define TRIGGER_FIRED_INSTEAD(event) \
  112. (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_INSTEAD)
  113. /*
  114. * Definitions for replication role based firing.
  115. */
  116. #define SESSION_REPLICATION_ROLE_ORIGIN 0
  117. #define SESSION_REPLICATION_ROLE_REPLICA 1
  118. #define SESSION_REPLICATION_ROLE_LOCAL 2
  119. extern PGDLLIMPORT int SessionReplicationRole;
  120. /*
  121. * States at which a trigger can be fired. These are the
  122. * possible values for pg_trigger.tgenabled.
  123. */
  124. #define TRIGGER_FIRES_ON_ORIGIN 'O'
  125. #define TRIGGER_FIRES_ALWAYS 'A'
  126. #define TRIGGER_FIRES_ON_REPLICA 'R'
  127. #define TRIGGER_DISABLED 'D'
  128. extern ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
  129. Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid,
  130. Oid funcoid, Oid parentTriggerOid, Node *whenClause,
  131. bool isInternal, bool in_partition);
  132. extern ObjectAddress CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString,
  133. Oid relOid, Oid refRelOid, Oid constraintOid,
  134. Oid indexOid, Oid funcoid, Oid parentTriggerOid,
  135. Node *whenClause, bool isInternal, bool in_partition,
  136. char trigger_fires_when);
  137. extern void TriggerSetParentTrigger(Relation trigRel,
  138. Oid childTrigId,
  139. Oid parentTrigId,
  140. Oid childTableId);
  141. extern void RemoveTriggerById(Oid trigOid);
  142. extern Oid get_trigger_oid(Oid relid, const char *name, bool missing_ok);
  143. extern ObjectAddress renametrig(RenameStmt *stmt);
  144. extern void EnableDisableTriggerNew2(Relation rel, const char *tgname, Oid tgparent,
  145. char fires_when, bool skip_system, bool recurse,
  146. LOCKMODE lockmode);
  147. extern void EnableDisableTriggerNew(Relation rel, const char *tgname,
  148. char fires_when, bool skip_system, bool recurse,
  149. LOCKMODE lockmode);
  150. extern void EnableDisableTrigger(Relation rel, const char *tgname,
  151. char fires_when, bool skip_system, LOCKMODE lockmode);
  152. extern void RelationBuildTriggers(Relation relation);
  153. extern TriggerDesc *CopyTriggerDesc(TriggerDesc *trigdesc);
  154. extern const char *FindTriggerIncompatibleWithInheritance(TriggerDesc *trigdesc);
  155. extern TransitionCaptureState *MakeTransitionCaptureState(TriggerDesc *trigdesc,
  156. Oid relid, CmdType cmdType);
  157. extern void FreeTriggerDesc(TriggerDesc *trigdesc);
  158. extern void ExecBSInsertTriggers(EState *estate,
  159. ResultRelInfo *relinfo);
  160. extern void ExecASInsertTriggers(EState *estate,
  161. ResultRelInfo *relinfo,
  162. TransitionCaptureState *transition_capture);
  163. extern bool ExecBRInsertTriggers(EState *estate,
  164. ResultRelInfo *relinfo,
  165. TupleTableSlot *slot);
  166. extern void ExecARInsertTriggers(EState *estate,
  167. ResultRelInfo *relinfo,
  168. TupleTableSlot *slot,
  169. List *recheckIndexes,
  170. TransitionCaptureState *transition_capture);
  171. extern bool ExecIRInsertTriggers(EState *estate,
  172. ResultRelInfo *relinfo,
  173. TupleTableSlot *slot);
  174. extern void ExecBSDeleteTriggers(EState *estate,
  175. ResultRelInfo *relinfo);
  176. extern void ExecASDeleteTriggers(EState *estate,
  177. ResultRelInfo *relinfo,
  178. TransitionCaptureState *transition_capture);
  179. extern bool ExecBRDeleteTriggersNew(EState *estate,
  180. EPQState *epqstate,
  181. ResultRelInfo *relinfo,
  182. ItemPointer tupleid,
  183. HeapTuple fdw_trigtuple,
  184. TupleTableSlot **epqslot,
  185. TM_Result *tmresult,
  186. TM_FailureData *tmfd);
  187. extern bool ExecBRDeleteTriggers(EState *estate,
  188. EPQState *epqstate,
  189. ResultRelInfo *relinfo,
  190. ItemPointer tupleid,
  191. HeapTuple fdw_trigtuple,
  192. TupleTableSlot **epqslot);
  193. extern void ExecARDeleteTriggers(EState *estate,
  194. ResultRelInfo *relinfo,
  195. ItemPointer tupleid,
  196. HeapTuple fdw_trigtuple,
  197. TransitionCaptureState *transition_capture,
  198. bool is_crosspart_update);
  199. extern bool ExecIRDeleteTriggers(EState *estate,
  200. ResultRelInfo *relinfo,
  201. HeapTuple trigtuple);
  202. extern void ExecBSUpdateTriggers(EState *estate,
  203. ResultRelInfo *relinfo);
  204. extern void ExecASUpdateTriggers(EState *estate,
  205. ResultRelInfo *relinfo,
  206. TransitionCaptureState *transition_capture);
  207. extern bool ExecBRUpdateTriggersNew(EState *estate,
  208. EPQState *epqstate,
  209. ResultRelInfo *relinfo,
  210. ItemPointer tupleid,
  211. HeapTuple fdw_trigtuple,
  212. TupleTableSlot *newslot,
  213. TM_Result *tmresult,
  214. TM_FailureData *tmfd);
  215. extern bool ExecBRUpdateTriggers(EState *estate,
  216. EPQState *epqstate,
  217. ResultRelInfo *relinfo,
  218. ItemPointer tupleid,
  219. HeapTuple fdw_trigtuple,
  220. TupleTableSlot *slot,
  221. TM_FailureData *tmfdp);
  222. extern void ExecARUpdateTriggers(EState *estate,
  223. ResultRelInfo *relinfo,
  224. ResultRelInfo *src_partinfo,
  225. ResultRelInfo *dst_partinfo,
  226. ItemPointer tupleid,
  227. HeapTuple fdw_trigtuple,
  228. TupleTableSlot *slot,
  229. List *recheckIndexes,
  230. TransitionCaptureState *transition_capture,
  231. bool is_crosspart_update);
  232. extern bool ExecIRUpdateTriggers(EState *estate,
  233. ResultRelInfo *relinfo,
  234. HeapTuple trigtuple,
  235. TupleTableSlot *slot);
  236. extern void ExecBSTruncateTriggers(EState *estate,
  237. ResultRelInfo *relinfo);
  238. extern void ExecASTruncateTriggers(EState *estate,
  239. ResultRelInfo *relinfo);
  240. extern void AfterTriggerBeginXact(void);
  241. extern void AfterTriggerBeginQuery(void);
  242. extern void AfterTriggerEndQuery(EState *estate);
  243. extern void AfterTriggerFireDeferred(void);
  244. extern void AfterTriggerEndXact(bool isCommit);
  245. extern void AfterTriggerBeginSubXact(void);
  246. extern void AfterTriggerEndSubXact(bool isCommit);
  247. extern void AfterTriggerSetState(ConstraintsSetStmt *stmt);
  248. extern bool AfterTriggerPendingOnRel(Oid relid);
  249. /*
  250. * in utils/adt/ri_triggers.c
  251. */
  252. extern bool RI_FKey_pk_upd_check_required(Trigger *trigger, Relation pk_rel,
  253. TupleTableSlot *old_slot, TupleTableSlot *new_slot);
  254. extern bool RI_FKey_fk_upd_check_required(Trigger *trigger, Relation fk_rel,
  255. TupleTableSlot *old_slot, TupleTableSlot *new_slot);
  256. extern bool RI_Initial_Check(Trigger *trigger,
  257. Relation fk_rel, Relation pk_rel);
  258. extern void RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel,
  259. Relation pk_rel);
  260. /* result values for RI_FKey_trigger_type: */
  261. #define RI_TRIGGER_PK 1 /* is a trigger on the PK relation */
  262. #define RI_TRIGGER_FK 2 /* is a trigger on the FK relation */
  263. #define RI_TRIGGER_NONE 0 /* is not an RI trigger function */
  264. extern int RI_FKey_trigger_type(Oid tgfoid);
  265. #endif /* TRIGGER_H */