trigger.h 4.5 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * trigger.h
4
 *	  Declarations for trigger handling.
5
 *
6
 * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
7 8
 * Portions Copyright (c) 1994, Regents of the University of California
 *
9
 * $Id: trigger.h,v 1.27 2001/06/01 02:41:36 tgl Exp $
10 11 12 13 14 15
 *
 *-------------------------------------------------------------------------
 */
#ifndef TRIGGER_H
#define TRIGGER_H

Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
16
#include "nodes/execnodes.h"
Bruce Momjian's avatar
Bruce Momjian committed
17
#include "nodes/parsenodes.h"
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
18

19 20 21 22 23 24 25 26
/*
 * TriggerData is the node type that is passed as fmgr "context" info
 * when a function is called by the trigger manager.
 */

#define CALLED_AS_TRIGGER(fcinfo) \
	((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))

27
typedef uint32 TriggerEvent;
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
28

29 30
typedef struct TriggerData
{
31
	NodeTag		type;
32 33 34 35 36
	TriggerEvent tg_event;
	Relation	tg_relation;
	HeapTuple	tg_trigtuple;
	HeapTuple	tg_newtuple;
	Trigger    *tg_trigger;
37
} TriggerData;
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
38

39
/* TriggerEvent bit flags */
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
40

41 42 43 44 45 46
#define TRIGGER_EVENT_INSERT			0x00000000
#define TRIGGER_EVENT_DELETE			0x00000001
#define TRIGGER_EVENT_UPDATE			0x00000002
#define TRIGGER_EVENT_OPMASK			0x00000003
#define TRIGGER_EVENT_ROW				0x00000004
#define TRIGGER_EVENT_BEFORE			0x00000008
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
47

48 49 50 51 52
#define TRIGGER_DEFERRED_DONE			0x00000010
#define TRIGGER_DEFERRED_CANCELED		0x00000020
#define TRIGGER_DEFERRED_DEFERRABLE		0x00000040
#define TRIGGER_DEFERRED_INITDEFERRED	0x00000080
#define TRIGGER_DEFERRED_HAS_BEFORE		0x00000100
53 54 55
#define TRIGGER_DEFERRED_ROW_INSERTED	0x00000200
#define TRIGGER_DEFERRED_KEY_CHANGED	0x00000400
#define TRIGGER_DEFERRED_MASK			0x000007F0
56

57
#define TRIGGER_FIRED_BY_INSERT(event)	\
58 59
		(((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
												TRIGGER_EVENT_INSERT)
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
60

61
#define TRIGGER_FIRED_BY_DELETE(event)	\
62 63
		(((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
												TRIGGER_EVENT_DELETE)
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
64

65
#define TRIGGER_FIRED_BY_UPDATE(event)	\
66 67
		(((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
												TRIGGER_EVENT_UPDATE)
68

69 70
#define TRIGGER_FIRED_FOR_ROW(event)			\
		((TriggerEvent) (event) & TRIGGER_EVENT_ROW)
71

72 73
#define TRIGGER_FIRED_FOR_STATEMENT(event)		\
		(!TRIGGER_FIRED_FOR_ROW (event))
74

75 76
#define TRIGGER_FIRED_BEFORE(event)				\
		((TriggerEvent) (event) & TRIGGER_EVENT_BEFORE)
77

78 79
#define TRIGGER_FIRED_AFTER(event)				\
		(!TRIGGER_FIRED_BEFORE (event))
Vadim B. Mikheev's avatar
Vadim B. Mikheev committed
80 81


82 83
extern void CreateTrigger(CreateTrigStmt *stmt);
extern void DropTrigger(DropTrigStmt *stmt);
84
extern void RelationRemoveTriggers(Relation rel);
85

86 87 88 89 90 91
extern void RelationBuildTriggers(Relation relation);

extern void FreeTriggerDesc(TriggerDesc *trigdesc);

extern bool equalTriggerDescs(TriggerDesc *trigdesc1, TriggerDesc *trigdesc2);

92
extern HeapTuple ExecBRInsertTriggers(EState *estate,
93 94
									  ResultRelInfo *relinfo,
									  HeapTuple trigtuple);
95
extern void ExecARInsertTriggers(EState *estate,
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
								 ResultRelInfo *relinfo,
								 HeapTuple trigtuple);
extern bool ExecBRDeleteTriggers(EState *estate,
								 ResultRelInfo *relinfo,
								 ItemPointer tupleid);
extern void ExecARDeleteTriggers(EState *estate,
								 ResultRelInfo *relinfo,
								 ItemPointer tupleid);
extern HeapTuple ExecBRUpdateTriggers(EState *estate,
									  ResultRelInfo *relinfo,
									  ItemPointer tupleid,
									  HeapTuple newtuple);
extern void ExecARUpdateTriggers(EState *estate,
								 ResultRelInfo *relinfo,
								 ItemPointer tupleid,
								 HeapTuple newtuple);
112 113 114 115 116 117


/* ----------
 * Deferred trigger stuff
 * ----------
 */
118 119 120 121
typedef struct DeferredTriggerStatusData
{
	Oid			dts_tgoid;
	bool		dts_tgisdeferred;
122
} DeferredTriggerStatusData;
123

124 125 126
typedef struct DeferredTriggerStatusData *DeferredTriggerStatus;


127 128 129 130
typedef struct DeferredTriggerEventItem
{
	Oid			dti_tgoid;
	int32		dti_state;
131 132 133
} DeferredTriggerEventItem;


134 135
typedef struct DeferredTriggerEventData *DeferredTriggerEvent;

136 137
typedef struct DeferredTriggerEventData
{
138
	DeferredTriggerEvent dte_next;		/* list link */
139 140 141 142 143
	int32		dte_event;
	Oid			dte_relid;
	ItemPointerData dte_oldctid;
	ItemPointerData dte_newctid;
	int32		dte_n_items;
144
	/* dte_item is actually a variable-size array, of length dte_n_items */
145
	DeferredTriggerEventItem dte_item[1];
146 147 148
} DeferredTriggerEventData;


149
extern void DeferredTriggerInit(void);
150 151 152 153 154 155 156 157
extern void DeferredTriggerBeginXact(void);
extern void DeferredTriggerEndQuery(void);
extern void DeferredTriggerEndXact(void);
extern void DeferredTriggerAbortXact(void);

extern void DeferredTriggerSetState(ConstraintsSetStmt *stmt);


158 159 160 161
/*
 * in utils/adt/ri_triggers.c
 *
 */
162
extern bool RI_FKey_keyequal_upd(TriggerData *trigdata);
163

164
#endif	 /* TRIGGER_H */