diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/catalog/indexing.h | 36 | ||||
-rw-r--r-- | src/include/catalog/pg_attribute.h | 15 | ||||
-rw-r--r-- | src/include/catalog/pg_class.h | 4 | ||||
-rw-r--r-- | src/include/catalog/pg_trigger.h | 21 | ||||
-rw-r--r-- | src/include/commands/trigger.h | 49 | ||||
-rw-r--r-- | src/include/nodes/nodes.h | 3 | ||||
-rw-r--r-- | src/include/nodes/parsenodes.h | 22 | ||||
-rw-r--r-- | src/include/utils/rel.h | 7 | ||||
-rw-r--r-- | src/include/utils/tqual.h | 24 |
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) \ + ) \ ) \ + ) \ ) \ ) |