diff options
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/command.c | 25 | ||||
-rw-r--r-- | src/backend/commands/trigger.c | 145 | ||||
-rw-r--r-- | src/backend/commands/user.c | 14 |
3 files changed, 97 insertions, 87 deletions
diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c index 4fb184b7f6d..22ae1547691 100644 --- a/src/backend/commands/command.c +++ b/src/backend/commands/command.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.72 2000/05/28 17:55:54 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.73 2000/05/29 01:59:06 tgl Exp $ * * NOTES * The PortalExecutorHeapMemory crap needs to be eliminated @@ -1159,19 +1159,24 @@ AlterTableAddConstraint(const char *relationName, while (HeapTupleIsValid(tuple = heap_getnext(scan, 0))) { - TriggerData newtrigdata; + /* Make a call to the check function */ + /* No parameters are passed, but we do set a context */ + FunctionCallInfoData fcinfo; + TriggerData trigdata; - newtrigdata.tg_event = TRIGGER_EVENT_INSERT | TRIGGER_EVENT_ROW; - newtrigdata.tg_relation = rel; - newtrigdata.tg_trigtuple = tuple; - newtrigdata.tg_newtuple = NULL; - newtrigdata.tg_trigger = &trig; + MemSet(&fcinfo, 0, sizeof(fcinfo)); + /* We assume RI_FKey_check_ins won't look at flinfo... */ - CurrentTriggerData = &newtrigdata; + trigdata.type = T_TriggerData; + trigdata.tg_event = TRIGGER_EVENT_INSERT | TRIGGER_EVENT_ROW; + trigdata.tg_relation = rel; + trigdata.tg_trigtuple = tuple; + trigdata.tg_newtuple = NULL; + trigdata.tg_trigger = &trig; - RI_FKey_check_ins(NULL); + fcinfo.context = (Node *) &trigdata; - /* Make a call to the check function */ + RI_FKey_check_ins(&fcinfo); } heap_endscan(scan); heap_close(rel, NoLock); /* close rel but keep diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 4deb7554047..2f522f2f7d1 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.66 2000/05/28 20:34:50 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.67 2000/05/29 01:59:06 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -32,14 +32,12 @@ #include "utils/syscache.h" #include "utils/tqual.h" -DLLIMPORT TriggerData *CurrentTriggerData = NULL; - -/* XXX no points for style */ -extern TupleTableSlot *EvalPlanQual(EState *estate, Index rti, ItemPointer tid); static void DescribeTrigger(TriggerDesc *trigdesc, Trigger *trigger); static HeapTuple GetTupleForTrigger(EState *estate, ItemPointer tid, TupleTableSlot **newSlot); +static HeapTuple ExecCallTriggerFunc(Trigger *trigger, + TriggerData *trigdata); void @@ -507,7 +505,7 @@ RelationBuildTriggers(Relation relation) build->tgoid = htup->t_data->t_oid; build->tgname = nameout(&pg_trigger->tgname); build->tgfoid = pg_trigger->tgfoid; - build->tgfunc.fn_addr = NULL; + build->tgfunc.fn_oid = InvalidOid; /* mark FmgrInfo as uninitialized */ build->tgtype = pg_trigger->tgtype; build->tgenabled = pg_trigger->tgenabled; build->tgisconstraint = pg_trigger->tgisconstraint; @@ -757,45 +755,66 @@ equalTriggerDescs(TriggerDesc *trigdesc1, TriggerDesc *trigdesc2) return true; } - static HeapTuple -ExecCallTriggerFunc(Trigger *trigger) +ExecCallTriggerFunc(Trigger *trigger, TriggerData *trigdata) { - if (trigger->tgfunc.fn_addr == NULL) + FunctionCallInfoData fcinfo; + Datum result; + + /* + * Fmgr lookup info is cached in the Trigger structure, + * so that we need not repeat the lookup on every call. + */ + if (trigger->tgfunc.fn_oid == InvalidOid) fmgr_info(trigger->tgfoid, &trigger->tgfunc); - return (HeapTuple) ((*fmgr_faddr(&trigger->tgfunc)) ()); + /* + * Call the function, passing no arguments but setting a context. + */ + MemSet(&fcinfo, 0, sizeof(fcinfo)); + + fcinfo.flinfo = &trigger->tgfunc; + fcinfo.context = (Node *) trigdata; + + result = FunctionCallInvoke(&fcinfo); + + /* + * Trigger protocol allows function to return a null pointer, + * but NOT to set the isnull result flag. + */ + if (fcinfo.isnull) + elog(ERROR, "ExecCallTriggerFunc: function %u returned NULL", + fcinfo.flinfo->fn_oid); + + return (HeapTuple) DatumGetPointer(result); } HeapTuple ExecBRInsertTriggers(Relation rel, HeapTuple trigtuple) { - TriggerData *SaveTriggerData; int ntrigs = rel->trigdesc->n_before_row[TRIGGER_EVENT_INSERT]; Trigger **trigger = rel->trigdesc->tg_before_row[TRIGGER_EVENT_INSERT]; HeapTuple newtuple = trigtuple; HeapTuple oldtuple; + TriggerData LocTriggerData; int i; - SaveTriggerData = (TriggerData *) palloc(sizeof(TriggerData)); - SaveTriggerData->tg_event = TRIGGER_EVENT_INSERT | TRIGGER_EVENT_ROW | TRIGGER_EVENT_BEFORE; - SaveTriggerData->tg_relation = rel; - SaveTriggerData->tg_newtuple = NULL; + LocTriggerData.type = T_TriggerData; + LocTriggerData.tg_event = TRIGGER_EVENT_INSERT | TRIGGER_EVENT_ROW | TRIGGER_EVENT_BEFORE; + LocTriggerData.tg_relation = rel; + LocTriggerData.tg_newtuple = NULL; for (i = 0; i < ntrigs; i++) { if (!trigger[i]->tgenabled) continue; - CurrentTriggerData = SaveTriggerData; - CurrentTriggerData->tg_trigtuple = oldtuple = newtuple; - CurrentTriggerData->tg_trigger = trigger[i]; - newtuple = ExecCallTriggerFunc(trigger[i]); + LocTriggerData.tg_trigtuple = oldtuple = newtuple; + LocTriggerData.tg_trigger = trigger[i]; + newtuple = ExecCallTriggerFunc(trigger[i], &LocTriggerData); if (newtuple == NULL) break; else if (oldtuple != newtuple && oldtuple != trigtuple) heap_freetuple(oldtuple); } - CurrentTriggerData = NULL; - pfree(SaveTriggerData); return newtuple; } @@ -810,9 +829,9 @@ bool ExecBRDeleteTriggers(EState *estate, ItemPointer tupleid) { Relation rel = estate->es_result_relation_info->ri_RelationDesc; - TriggerData *SaveTriggerData; int ntrigs = rel->trigdesc->n_before_row[TRIGGER_EVENT_DELETE]; Trigger **trigger = rel->trigdesc->tg_before_row[TRIGGER_EVENT_DELETE]; + TriggerData LocTriggerData; HeapTuple trigtuple; HeapTuple newtuple = NULL; TupleTableSlot *newSlot; @@ -822,25 +841,22 @@ ExecBRDeleteTriggers(EState *estate, ItemPointer tupleid) if (trigtuple == NULL) return false; - SaveTriggerData = (TriggerData *) palloc(sizeof(TriggerData)); - SaveTriggerData->tg_event = TRIGGER_EVENT_DELETE | TRIGGER_EVENT_ROW | TRIGGER_EVENT_BEFORE; - SaveTriggerData->tg_relation = rel; - SaveTriggerData->tg_newtuple = NULL; + LocTriggerData.type = T_TriggerData; + LocTriggerData.tg_event = TRIGGER_EVENT_DELETE | TRIGGER_EVENT_ROW | TRIGGER_EVENT_BEFORE; + LocTriggerData.tg_relation = rel; + LocTriggerData.tg_newtuple = NULL; for (i = 0; i < ntrigs; i++) { if (!trigger[i]->tgenabled) continue; - CurrentTriggerData = SaveTriggerData; - CurrentTriggerData->tg_trigtuple = trigtuple; - CurrentTriggerData->tg_trigger = trigger[i]; - newtuple = ExecCallTriggerFunc(trigger[i]); + LocTriggerData.tg_trigtuple = trigtuple; + LocTriggerData.tg_trigger = trigger[i]; + newtuple = ExecCallTriggerFunc(trigger[i], &LocTriggerData); if (newtuple == NULL) break; if (newtuple != trigtuple) heap_freetuple(newtuple); } - CurrentTriggerData = NULL; - pfree(SaveTriggerData); heap_freetuple(trigtuple); return (newtuple == NULL) ? false : true; @@ -860,9 +876,9 @@ HeapTuple ExecBRUpdateTriggers(EState *estate, ItemPointer tupleid, HeapTuple newtuple) { Relation rel = estate->es_result_relation_info->ri_RelationDesc; - TriggerData *SaveTriggerData; int ntrigs = rel->trigdesc->n_before_row[TRIGGER_EVENT_UPDATE]; Trigger **trigger = rel->trigdesc->tg_before_row[TRIGGER_EVENT_UPDATE]; + TriggerData LocTriggerData; HeapTuple trigtuple; HeapTuple oldtuple; HeapTuple intuple = newtuple; @@ -880,25 +896,22 @@ ExecBRUpdateTriggers(EState *estate, ItemPointer tupleid, HeapTuple newtuple) if (newSlot != NULL) intuple = newtuple = ExecRemoveJunk(estate->es_junkFilter, newSlot); - SaveTriggerData = (TriggerData *) palloc(sizeof(TriggerData)); - SaveTriggerData->tg_event = TRIGGER_EVENT_UPDATE | TRIGGER_EVENT_ROW | TRIGGER_EVENT_BEFORE; - SaveTriggerData->tg_relation = rel; + LocTriggerData.type = T_TriggerData; + LocTriggerData.tg_event = TRIGGER_EVENT_UPDATE | TRIGGER_EVENT_ROW | TRIGGER_EVENT_BEFORE; + LocTriggerData.tg_relation = rel; for (i = 0; i < ntrigs; i++) { if (!trigger[i]->tgenabled) continue; - CurrentTriggerData = SaveTriggerData; - CurrentTriggerData->tg_trigtuple = trigtuple; - CurrentTriggerData->tg_newtuple = oldtuple = newtuple; - CurrentTriggerData->tg_trigger = trigger[i]; - newtuple = ExecCallTriggerFunc(trigger[i]); + LocTriggerData.tg_trigtuple = trigtuple; + LocTriggerData.tg_newtuple = oldtuple = newtuple; + LocTriggerData.tg_trigger = trigger[i]; + newtuple = ExecCallTriggerFunc(trigger[i], &LocTriggerData); if (newtuple == NULL) break; else if (oldtuple != newtuple && oldtuple != intuple) heap_freetuple(oldtuple); } - CurrentTriggerData = NULL; - pfree(SaveTriggerData); heap_freetuple(trigtuple); return newtuple; } @@ -1167,7 +1180,7 @@ static void deferredTriggerExecute(DeferredTriggerEvent event, int itemno) { Relation rel; - TriggerData SaveTriggerData; + TriggerData LocTriggerData; HeapTupleData oldtuple; HeapTupleData newtuple; HeapTuple rettuple; @@ -1200,30 +1213,31 @@ deferredTriggerExecute(DeferredTriggerEvent event, int itemno) * Setup the trigger information * ---------- */ - SaveTriggerData.tg_event = (event->dte_event & TRIGGER_EVENT_OPMASK) | + LocTriggerData.type = T_TriggerData; + LocTriggerData.tg_event = (event->dte_event & TRIGGER_EVENT_OPMASK) | TRIGGER_EVENT_ROW; - SaveTriggerData.tg_relation = rel; + LocTriggerData.tg_relation = rel; switch (event->dte_event & TRIGGER_EVENT_OPMASK) { case TRIGGER_EVENT_INSERT: - SaveTriggerData.tg_trigtuple = &newtuple; - SaveTriggerData.tg_newtuple = NULL; - SaveTriggerData.tg_trigger = + LocTriggerData.tg_trigtuple = &newtuple; + LocTriggerData.tg_newtuple = NULL; + LocTriggerData.tg_trigger = rel->trigdesc->tg_after_row[TRIGGER_EVENT_INSERT][itemno]; break; case TRIGGER_EVENT_UPDATE: - SaveTriggerData.tg_trigtuple = &oldtuple; - SaveTriggerData.tg_newtuple = &newtuple; - SaveTriggerData.tg_trigger = + LocTriggerData.tg_trigtuple = &oldtuple; + LocTriggerData.tg_newtuple = &newtuple; + LocTriggerData.tg_trigger = rel->trigdesc->tg_after_row[TRIGGER_EVENT_UPDATE][itemno]; break; case TRIGGER_EVENT_DELETE: - SaveTriggerData.tg_trigtuple = &oldtuple; - SaveTriggerData.tg_newtuple = NULL; - SaveTriggerData.tg_trigger = + LocTriggerData.tg_trigtuple = &oldtuple; + LocTriggerData.tg_newtuple = NULL; + LocTriggerData.tg_trigger = rel->trigdesc->tg_after_row[TRIGGER_EVENT_DELETE][itemno]; break; } @@ -1233,9 +1247,7 @@ deferredTriggerExecute(DeferredTriggerEvent event, int itemno) * updated tuple. * ---------- */ - CurrentTriggerData = &SaveTriggerData; - rettuple = ExecCallTriggerFunc(SaveTriggerData.tg_trigger); - CurrentTriggerData = NULL; + rettuple = ExecCallTriggerFunc(LocTriggerData.tg_trigger, &LocTriggerData); if (rettuple != NULL && rettuple != &oldtuple && rettuple != &newtuple) heap_freetuple(rettuple); @@ -1778,7 +1790,7 @@ DeferredTriggerSaveEvent(Relation rel, int event, Trigger **triggers; ItemPointerData oldctid; ItemPointerData newctid; - TriggerData SaveTriggerData; + TriggerData LocTriggerData; if (deftrig_cxt == NULL) elog(ERROR, @@ -1891,15 +1903,14 @@ DeferredTriggerSaveEvent(Relation rel, int event, if (!is_ri_trigger) continue; - SaveTriggerData.tg_event = TRIGGER_EVENT_UPDATE; - SaveTriggerData.tg_relation = rel; - SaveTriggerData.tg_trigtuple = oldtup; - SaveTriggerData.tg_newtuple = newtup; - SaveTriggerData.tg_trigger = triggers[i]; + LocTriggerData.type = T_TriggerData; + LocTriggerData.tg_event = TRIGGER_EVENT_UPDATE; + LocTriggerData.tg_relation = rel; + LocTriggerData.tg_trigtuple = oldtup; + LocTriggerData.tg_newtuple = newtup; + LocTriggerData.tg_trigger = triggers[i]; - CurrentTriggerData = &SaveTriggerData; - key_unchanged = RI_FKey_keyequal_upd(); - CurrentTriggerData = NULL; + key_unchanged = RI_FKey_keyequal_upd(&LocTriggerData); if (key_unchanged) { diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index ea5f457448f..40987329a3d 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: user.c,v 1.54 2000/05/28 17:55:55 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/user.c,v 1.55 2000/05/29 01:59:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -168,20 +168,14 @@ write_password_file(Relation rel) /* This is the wrapper for triggers. */ -HeapTuple -update_pg_pwd(void) +Datum +update_pg_pwd(PG_FUNCTION_ARGS) { Relation rel = heap_openr(ShadowRelationName, AccessExclusiveLock); write_password_file(rel); heap_close(rel, AccessExclusiveLock); - - /* - * This is a trigger, so clean out the information provided by the - * trigger manager. - */ - CurrentTriggerData = NULL; - return NULL; + return PointerGetDatum(NULL); } |