aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/catalog/indexing.h36
-rw-r--r--src/include/catalog/pg_attribute.h15
-rw-r--r--src/include/catalog/pg_class.h4
-rw-r--r--src/include/catalog/pg_trigger.h21
-rw-r--r--src/include/commands/trigger.h49
-rw-r--r--src/include/nodes/nodes.h3
-rw-r--r--src/include/nodes/parsenodes.h22
-rw-r--r--src/include/utils/rel.h7
-rw-r--r--src/include/utils/tqual.h24
9 files changed, 143 insertions, 38 deletions
diff --git a/src/include/catalog/indexing.h b/src/include/catalog/indexing.h
index 698342d0815..39bc8193da2 100644
--- a/src/include/catalog/indexing.h
+++ b/src/include/catalog/indexing.h
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: indexing.h,v 1.23 1999/07/20 17:14:07 momjian Exp $
+ * $Id: indexing.h,v 1.24 1999/09/29 16:06:14 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -25,27 +25,29 @@
#define Num_pg_class_indices 2
#define Num_pg_attrdef_indices 1
#define Num_pg_relcheck_indices 1
-#define Num_pg_trigger_indices 1
+#define Num_pg_trigger_indices 3
#define Num_pg_description_indices 1
/*
* Names of indices on system catalogs
*/
-#define AttributeNameIndex "pg_attribute_relid_attnam_index"
-#define AttributeNumIndex "pg_attribute_relid_attnum_index"
-#define AttributeRelidIndex "pg_attribute_attrelid_index"
-#define ProcedureOidIndex "pg_proc_oid_index"
-#define ProcedureNameIndex "pg_proc_proname_narg_type_index"
-#define ProcedureSrcIndex "pg_proc_prosrc_index"
-#define TypeOidIndex "pg_type_oid_index"
-#define TypeNameIndex "pg_type_typname_index"
-#define ClassOidIndex "pg_class_oid_index"
-#define ClassNameIndex "pg_class_relname_index"
-#define AttrDefaultIndex "pg_attrdef_adrelid_index"
-#define RelCheckIndex "pg_relcheck_rcrelid_index"
-#define TriggerRelidIndex "pg_trigger_tgrelid_index"
-#define DescriptionObjIndex "pg_description_objoid_index"
+#define AttributeNameIndex "pg_attribute_relid_attnam_index"
+#define AttributeNumIndex "pg_attribute_relid_attnum_index"
+#define AttributeRelidIndex "pg_attribute_attrelid_index"
+#define ProcedureOidIndex "pg_proc_oid_index"
+#define ProcedureNameIndex "pg_proc_proname_narg_type_index"
+#define ProcedureSrcIndex "pg_proc_prosrc_index"
+#define TypeOidIndex "pg_type_oid_index"
+#define TypeNameIndex "pg_type_typname_index"
+#define ClassOidIndex "pg_class_oid_index"
+#define ClassNameIndex "pg_class_relname_index"
+#define AttrDefaultIndex "pg_attrdef_adrelid_index"
+#define RelCheckIndex "pg_relcheck_rcrelid_index"
+#define TriggerRelidIndex "pg_trigger_tgrelid_index"
+#define TriggerConstrNameIndex "pg_trigger_tgconstrname_index"
+#define TriggerConstrRelidIndex "pg_trigger_tgconstrrelid_index"
+#define DescriptionObjIndex "pg_description_objoid_index"
extern char *Name_pg_attr_indices[];
extern char *Name_pg_proc_indices[];
@@ -114,6 +116,8 @@ DECLARE_INDEX(pg_attrdef_adrelid_index on pg_attrdef using btree(adrelid oid_ops
DECLARE_INDEX(pg_relcheck_rcrelid_index on pg_relcheck using btree(rcrelid oid_ops));
DECLARE_INDEX(pg_trigger_tgrelid_index on pg_trigger using btree(tgrelid oid_ops));
+DECLARE_INDEX(pg_trigger_tgconstrname_index on pg_trigger using btree(tgconstrname name_ops));
+DECLARE_INDEX(pg_trigger_tgconstrrelid_index on pg_trigger using btree(tgconstrrelid oid_ops));
DECLARE_INDEX(pg_description_objoid_index on pg_description using btree(objoid oid_ops));
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index a02cc200336..ae2067988da 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_attribute.h,v 1.49 1999/08/09 02:45:56 tgl Exp $
+ * $Id: pg_attribute.h,v 1.50 1999/09/29 16:06:16 wieck Exp $
*
* NOTES
* the genbki.sh script reads this file and generates .bki
@@ -447,9 +447,16 @@ DATA(insert OID = 0 ( 1219 tgrelid 26 0 4 1 0 -1 -1 t f i f f));
DATA(insert OID = 0 ( 1219 tgname 19 0 NAMEDATALEN 2 0 -1 -1 f f i f f));
DATA(insert OID = 0 ( 1219 tgfoid 26 0 4 3 0 -1 -1 t f i f f));
DATA(insert OID = 0 ( 1219 tgtype 21 0 2 4 0 -1 -1 t f s f f));
-DATA(insert OID = 0 ( 1219 tgnargs 21 0 2 5 0 -1 -1 t f s f f));
-DATA(insert OID = 0 ( 1219 tgattr 22 0 16 6 0 -1 -1 f f i f f));
-DATA(insert OID = 0 ( 1219 tgargs 17 0 -1 7 0 -1 -1 f f i f f));
+DATA(insert OID = 0 ( 1219 tgenabled 16 0 1 5 0 -1 -1 t f c f f));
+DATA(insert OID = 0 ( 1219 tgisconstraint 16 0 1 6 0 -1 -1 t f c f f));
+DATA(insert OID = 0 ( 1219 tgconstrname 19 0 NAMEDATALEN 7 0 -1 -1 f f i f f));
+DATA(insert OID = 0 ( 1219 tgconstrrelid 26 0 4 8 0 -1 -1 t f i f f));
+
+DATA(insert OID = 0 ( 1219 tgdeferrable 16 0 1 9 0 -1 -1 t f c f f));
+DATA(insert OID = 0 ( 1219 tginitdeferred 16 0 1 10 0 -1 -1 t f c f f));
+DATA(insert OID = 0 ( 1219 tgnargs 21 0 2 11 0 -1 -1 t f s f f));
+DATA(insert OID = 0 ( 1219 tgattr 22 0 16 12 0 -1 -1 f f i f f));
+DATA(insert OID = 0 ( 1219 tgargs 17 0 -1 13 0 -1 -1 f f i f f));
DATA(insert OID = 0 ( 1219 ctid 27 0 6 -1 0 -1 -1 f f i f f));
DATA(insert OID = 0 ( 1219 oid 26 0 4 -2 0 -1 -1 t f i f f));
DATA(insert OID = 0 ( 1219 xmin 28 0 4 -3 0 -1 -1 t f i f f));
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 5647707a204..7bf6929d6ce 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: pg_class.h,v 1.29 1999/05/25 16:13:44 momjian Exp $
+ * $Id: pg_class.h,v 1.30 1999/09/29 16:06:16 wieck Exp $
*
* NOTES
* ``pg_relation'' is being replaced by ``pg_class''. currently
@@ -150,7 +150,7 @@ DATA(insert OID = 1215 ( pg_attrdef 109 PGUID 0 0 0 t t r 4 0 0 0 0 0 f f _n
DESCR("");
DATA(insert OID = 1216 ( pg_relcheck 110 PGUID 0 0 0 t t r 4 0 0 0 0 0 f f _null_ ));
DESCR("");
-DATA(insert OID = 1219 ( pg_trigger 111 PGUID 0 0 0 t t r 7 0 0 0 0 0 f f _null_ ));
+DATA(insert OID = 1219 ( pg_trigger 111 PGUID 0 0 0 t t r 13 0 0 0 0 0 f f _null_ ));
DESCR("");
#define RelOid_pg_type 1247
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index 2d12e73da5f..be0633eb985 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -33,6 +33,13 @@ CATALOG(pg_trigger) BOOTSTRAP
Oid tgfoid; /* OID of function to be called */
int2 tgtype; /* BEFORE/AFTER UPDATE/DELETE/INSERT
* ROW/STATEMENT */
+ bool tgenabled; /* trigger is enabled/disabled */
+ bool tgisconstraint; /* trigger is a RI constraint */
+ NameData tgconstrname; /* RI constraint name */
+ Oid tgconstrrelid; /* RI table of foreign key definition */
+ /* in the case of ON DELETE or ON UPDATE */
+ bool tgdeferrable; /* RI trigger is deferrable */
+ bool tginitdeferred; /* RI trigger is deferred initially */
int2 tgnargs; /* # of extra arguments in tgargs */
int28 tgattr; /* UPDATE of attr1, attr2 ... (NI) */
bytea tgargs; /* first\000second\000tgnargs\000 */
@@ -49,14 +56,20 @@ typedef FormData_pg_trigger *Form_pg_trigger;
* compiler constants for pg_trigger
* ----------------
*/
-#define Natts_pg_trigger 7
+#define Natts_pg_trigger 13
#define Anum_pg_trigger_tgrelid 1
#define Anum_pg_trigger_tgname 2
#define Anum_pg_trigger_tgfoid 3
#define Anum_pg_trigger_tgtype 4
-#define Anum_pg_trigger_tgnargs 5
-#define Anum_pg_trigger_tgattr 6
-#define Anum_pg_trigger_tgargs 7
+#define Anum_pg_trigger_tgenabled 5
+#define Anum_pg_trigger_tgisconstraint 6
+#define Anum_pg_trigger_tgconstrname 7
+#define Anum_pg_trigger_tgconstrrelid 8
+#define Anum_pg_trigger_tgdeferrable 9
+#define Anum_pg_trigger_tginitdeferred 10
+#define Anum_pg_trigger_tgnargs 11
+#define Anum_pg_trigger_tgattr 12
+#define Anum_pg_trigger_tgargs 13
#define TRIGGER_TYPE_ROW (1 << 0)
#define TRIGGER_TYPE_BEFORE (1 << 1)
diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h
index 99350d55d13..8ab4342fa7a 100644
--- a/src/include/commands/trigger.h
+++ b/src/include/commands/trigger.h
@@ -32,6 +32,13 @@ extern DLLIMPORT TriggerData *CurrentTriggerData;
#define TRIGGER_EVENT_ROW 0x00000004
#define TRIGGER_EVENT_BEFORE 0x00000008
+#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
+#define TRIGGER_DEFERRED_MASK 0x000001F0
+
#define TRIGGER_FIRED_BY_INSERT(event) \
(((TriggerEvent) (event) & TRIGGER_EVENT_OPMASK) == \
TRIGGER_EVENT_INSERT)
@@ -68,4 +75,46 @@ extern void ExecARDeleteTriggers(EState *estate, ItemPointer tupleid);
extern HeapTuple ExecBRUpdateTriggers(EState *estate, ItemPointer tupleid, HeapTuple tuple);
extern void ExecARUpdateTriggers(EState *estate, ItemPointer tupleid, HeapTuple tuple);
+
+
+/* ----------
+ * Deferred trigger stuff
+ * ----------
+ */
+typedef struct DeferredTriggerStatusData {
+ Oid dts_tgoid;
+ bool dts_tgisdeferred;
+} DeferredTriggerStatusData;
+typedef struct DeferredTriggerStatusData *DeferredTriggerStatus;
+
+
+typedef struct DeferredTriggerEventItem {
+ Oid dti_tgoid;
+ int32 dti_state;
+} DeferredTriggerEventItem;
+
+
+typedef struct DeferredTriggerEventData {
+ int32 dte_event;
+ Oid dte_relid;
+ ItemPointerData dte_oldctid;
+ ItemPointerData dte_newctid;
+ int32 dte_n_items;
+ DeferredTriggerEventItem dte_item[1];
+} DeferredTriggerEventData;
+typedef struct DeferredTriggerEventData *DeferredTriggerEvent;
+
+
+extern int DeferredTriggerInit(void);
+extern void DeferredTriggerBeginXact(void);
+extern void DeferredTriggerEndQuery(void);
+extern void DeferredTriggerEndXact(void);
+extern void DeferredTriggerAbortXact(void);
+
+extern void DeferredTriggerSetState(ConstraintsSetStmt *stmt);
+
+extern void DeferredTriggerSaveEvent(Relation rel, int event,
+ HeapTuple oldtup, HeapTuple newtup);
+
+
#endif /* TRIGGER_H */
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index da8a06af423..68d82473244 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: nodes.h,v 1.52 1999/09/23 17:03:21 momjian Exp $
+ * $Id: nodes.h,v 1.53 1999/09/29 16:06:23 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -184,6 +184,7 @@ typedef enum NodeTag
T_AlterUserStmt,
T_DropUserStmt,
T_LockStmt,
+ T_ConstraintsSetStmt,
T_A_Expr = 700,
T_Attr,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 4bf879137ac..a736c1af67e 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: parsenodes.h,v 1.80 1999/09/28 04:34:50 momjian Exp $
+ * $Id: parsenodes.h,v 1.81 1999/09/29 16:06:23 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -180,6 +180,13 @@ typedef struct CreateTrigStmt
char *text; /* AS 'text' */
List *attr; /* UPDATE OF a, b,... (NI) or NULL */
char *when; /* WHEN 'a > 10 ...' (NI) or NULL */
+
+ /* The following are used for referential */
+ /* integrity constraint triggers */
+ bool isconstraint; /* This is an RI trigger */
+ bool deferrable; /* [NOT] DEFERRABLE */
+ bool initdeferred; /* INITIALLY {DEFERRED|IMMEDIATE} */
+ char *constrrelname; /* opposite relation */
} CreateTrigStmt;
typedef struct DropTrigStmt
@@ -602,6 +609,19 @@ typedef struct LockStmt
int mode; /* lock mode */
} LockStmt;
+
+/* ----------------------
+ * SET CONSTRAINTS Statement
+ * ----------------------
+ */
+typedef struct ConstraintsSetStmt
+{
+ NodeTag type;
+ List *constraints;
+ bool deferred;
+} ConstraintsSetStmt;
+
+
/*****************************************************************************
* Optimizable Statements
*****************************************************************************/
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index f2789b39e09..308f9a6d645 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -6,7 +6,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: rel.h,v 1.26 1999/09/18 19:08:25 tgl Exp $
+ * $Id: rel.h,v 1.27 1999/09/29 16:06:28 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -42,10 +42,15 @@ typedef LockInfoData *LockInfo;
typedef struct Trigger
{
+ Oid tgoid;
char *tgname;
Oid tgfoid;
FmgrInfo tgfunc;
int16 tgtype;
+ bool tgenabled;
+ bool tgisconstraint;
+ bool tgdeferrable;
+ bool tginitdeferred;
int16 tgnargs;
int16 tgattr[8];
char **tgargs;
diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h
index 4cb685968b1..d8aa6638f6a 100644
--- a/src/include/utils/tqual.h
+++ b/src/include/utils/tqual.h
@@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: tqual.h,v 1.24 1999/07/15 23:04:24 momjian Exp $
+ * $Id: tqual.h,v 1.25 1999/09/29 16:06:28 wieck Exp $
*
*-------------------------------------------------------------------------
*/
@@ -30,6 +30,7 @@ typedef SnapshotData *Snapshot;
#define SnapshotNow ((Snapshot) 0x0)
#define SnapshotSelf ((Snapshot) 0x1)
+#define SnapshotAny ((Snapshot) 0x2)
extern Snapshot SnapshotDirty;
extern Snapshot QuerySnapshot;
@@ -37,6 +38,7 @@ extern Snapshot SerializableSnapshot;
#define IsSnapshotNow(snapshot) ((Snapshot) snapshot == SnapshotNow)
#define IsSnapshotSelf(snapshot) ((Snapshot) snapshot == SnapshotSelf)
+#define IsSnapshotAny(snapshot) ((Snapshot) snapshot == SnapshotAny)
#define IsSnapshotDirty(snapshot) ((Snapshot) snapshot == SnapshotDirty)
extern TransactionId HeapSpecialTransactionId;
@@ -55,18 +57,22 @@ extern CommandId HeapSpecialCommandId;
false \
: \
( \
- (IsSnapshotSelf(snapshot) || heapisoverride()) ? \
- HeapTupleSatisfiesItself((tuple)->t_data) \
+ (IsSnapshotAny(snapshot) || heapisoverride()) ? \
+ true \
: \
- ((IsSnapshotDirty(snapshot)) ? \
- HeapTupleSatisfiesDirty((tuple)->t_data) \
+ ((IsSnapshotSelf(snapshot) || heapisoverride()) ? \
+ HeapTupleSatisfiesItself((tuple)->t_data) \
: \
- ((IsSnapshotNow(snapshot)) ? \
- HeapTupleSatisfiesNow((tuple)->t_data) \
+ ((IsSnapshotDirty(snapshot)) ? \
+ HeapTupleSatisfiesDirty((tuple)->t_data) \
: \
- HeapTupleSatisfiesSnapshot((tuple)->t_data, snapshot) \
- ) \
+ ((IsSnapshotNow(snapshot)) ? \
+ HeapTupleSatisfiesNow((tuple)->t_data) \
+ : \
+ HeapTupleSatisfiesSnapshot((tuple)->t_data, snapshot) \
+ ) \
) \
+ ) \
) \
)