diff options
Diffstat (limited to 'src')
-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 | ||||
-rw-r--r-- | src/backend/executor/execMain.c | 7 | ||||
-rw-r--r-- | src/backend/utils/adt/ri_triggers.c | 286 | ||||
-rw-r--r-- | src/backend/utils/adt/tid.c | 4 | ||||
-rw-r--r-- | src/backend/utils/adt/timestamp.c | 10 | ||||
-rw-r--r-- | src/backend/utils/fmgr/fmgr.c | 3 | ||||
-rw-r--r-- | src/include/catalog/catversion.h | 4 | ||||
-rw-r--r-- | src/include/catalog/pg_proc.h | 28 | ||||
-rw-r--r-- | src/include/commands/trigger.h | 17 | ||||
-rw-r--r-- | src/include/commands/user.h | 4 | ||||
-rw-r--r-- | src/include/executor/executor.h | 4 | ||||
-rw-r--r-- | src/include/fmgr.h | 4 | ||||
-rw-r--r-- | src/include/nodes/nodes.h | 10 | ||||
-rw-r--r-- | src/include/utils/builtins.h | 37 | ||||
-rw-r--r-- | src/pl/plperl/plperl.c | 18 | ||||
-rw-r--r-- | src/pl/plpgsql/src/pl_handler.c | 18 | ||||
-rw-r--r-- | src/pl/tcl/pltcl.c | 16 | ||||
-rw-r--r-- | src/test/regress/input/create_function_1.source | 10 | ||||
-rw-r--r-- | src/test/regress/output/create_function_1.source | 10 | ||||
-rw-r--r-- | src/test/regress/regress.c | 63 |
22 files changed, 355 insertions, 382 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); } diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index c879417baf6..f95b24b026b 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -27,7 +27,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.113 2000/04/12 17:15:08 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.114 2000/05/29 01:59:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -46,9 +46,6 @@ #include "utils/builtins.h" #include "utils/syscache.h" -/* XXX no points for style */ -extern TupleTableSlot *EvalPlanQual(EState *estate, Index rti, - ItemPointer tid); /* decls for local routines only used within this module */ static TupleDesc InitPlan(CmdType operation, @@ -1974,7 +1971,7 @@ EvalPlanQual(EState *estate, Index rti, ItemPointer tid) */ *tid = tuple.t_self; - return (EvalPlanQualNext(estate)); + return EvalPlanQualNext(estate); } static TupleTableSlot * diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 79010b53f75..cc8c4cf583d 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -6,7 +6,7 @@ * * 1999 Jan Wieck * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ri_triggers.c,v 1.14 2000/04/12 17:15:51 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ri_triggers.c,v 1.15 2000/05/29 01:59:08 tgl Exp $ * * ---------- */ @@ -20,7 +20,6 @@ */ #include "postgres.h" -#include "fmgr.h" #include "access/heapam.h" #include "catalog/pg_operator.h" @@ -28,10 +27,11 @@ #include "commands/trigger.h" #include "executor/spi.h" #include "executor/spi_priv.h" +#include "fmgr.h" +#include "lib/hasht.h" #include "utils/builtins.h" #include "utils/mcxt.h" #include "utils/syscache.h" -#include "lib/hasht.h" /* ---------- @@ -105,7 +105,6 @@ typedef struct RI_QueryHashEntry typedef struct RI_OpreqHashEntry { Oid typeid; - Oid oprfnid; FmgrInfo oprfmgrinfo; } RI_OpreqHashEntry; @@ -147,13 +146,13 @@ static void ri_HashPreparedPlan(RI_QueryKey *key, void *plan); /* ---------- * RI_FKey_check - * - * Check foreign key existance (combined for INSERT and UPDATE). + * Check foreign key existence (combined for INSERT and UPDATE). * ---------- */ -static HeapTuple -RI_FKey_check(FmgrInfo *proinfo) +static Datum +RI_FKey_check(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -168,15 +167,13 @@ RI_FKey_check(FmgrInfo *proinfo) int i; int match_type; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_check() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -275,7 +272,7 @@ RI_FKey_check(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_check()"); - return NULL; + return PointerGetDatum(NULL); } @@ -284,7 +281,7 @@ RI_FKey_check(FmgrInfo *proinfo) if (match_type == RI_MATCH_TYPE_PARTIAL) { elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } ri_BuildQueryKeyFull(&qkey, trigdata->tg_trigger->tgoid, @@ -303,7 +300,7 @@ RI_FKey_check(FmgrInfo *proinfo) * ---------- */ heap_close(pk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_SOME_NULL: /* ---------- @@ -324,7 +321,7 @@ RI_FKey_check(FmgrInfo *proinfo) "and NON-NULL key values", tgargs[RI_CONSTRAINT_NAME_ARGNO]); heap_close(pk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_MATCH_TYPE_UNSPECIFIED: /* ---------- @@ -333,7 +330,7 @@ RI_FKey_check(FmgrInfo *proinfo) * ---------- */ heap_close(pk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_MATCH_TYPE_PARTIAL: /* ---------- @@ -345,7 +342,7 @@ RI_FKey_check(FmgrInfo *proinfo) */ elog(ERROR, "MATCH PARTIAL not yet implemented"); heap_close(pk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); } case RI_KEYS_NONE_NULL: @@ -459,40 +456,40 @@ RI_FKey_check(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_check()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Never reached * ---------- */ elog(ERROR, "internal error #1 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- * RI_FKey_check_ins - * - * Check foreign key existance at insert event on FK table. + * Check foreign key existence at insert event on FK table. * ---------- */ -HeapTuple -RI_FKey_check_ins(FmgrInfo *proinfo) +Datum +RI_FKey_check_ins(PG_FUNCTION_ARGS) { - return RI_FKey_check(proinfo); + return RI_FKey_check(fcinfo); } /* ---------- * RI_FKey_check_upd - * - * Check foreign key existance at update event on FK table. + * Check foreign key existence at update event on FK table. * ---------- */ -HeapTuple -RI_FKey_check_upd(FmgrInfo *proinfo) +Datum +RI_FKey_check_upd(PG_FUNCTION_ARGS) { - return RI_FKey_check(proinfo); + return RI_FKey_check(fcinfo); } @@ -504,10 +501,10 @@ RI_FKey_check_upd(FmgrInfo *proinfo) * integrity constraint. * ---------- */ -HeapTuple -RI_FKey_noaction_del(FmgrInfo *proinfo) +Datum +RI_FKey_noaction_del(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -520,15 +517,13 @@ RI_FKey_noaction_del(FmgrInfo *proinfo) bool isnull; int i; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_noaction_del() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -553,7 +548,7 @@ RI_FKey_noaction_del(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -590,7 +585,7 @@ RI_FKey_noaction_del(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -685,7 +680,7 @@ RI_FKey_noaction_del(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_noaction_del()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL restrict delete. @@ -693,7 +688,7 @@ RI_FKey_noaction_del(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -701,7 +696,7 @@ RI_FKey_noaction_del(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #2 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -713,10 +708,10 @@ RI_FKey_noaction_del(FmgrInfo *proinfo) * integrity constraint. * ---------- */ -HeapTuple -RI_FKey_noaction_upd(FmgrInfo *proinfo) +Datum +RI_FKey_noaction_upd(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -730,15 +725,13 @@ RI_FKey_noaction_upd(FmgrInfo *proinfo) bool isnull; int i; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_noaction_upd() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -763,7 +756,7 @@ RI_FKey_noaction_upd(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -801,7 +794,7 @@ RI_FKey_noaction_upd(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -818,7 +811,7 @@ RI_FKey_noaction_upd(FmgrInfo *proinfo) */ if (ri_KeysEqual(pk_rel, old_row, new_row, &qkey, RI_KEYPAIR_PK_IDX)) - return NULL; + return PointerGetDatum(NULL); if (SPI_connect() != SPI_OK_CONNECT) elog(NOTICE, "SPI_connect() failed in RI_FKey_noaction_upd()"); @@ -904,7 +897,7 @@ RI_FKey_noaction_upd(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_noaction_upd()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL noaction update. @@ -912,7 +905,7 @@ RI_FKey_noaction_upd(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -920,7 +913,7 @@ RI_FKey_noaction_upd(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #3 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -930,10 +923,10 @@ RI_FKey_noaction_upd(FmgrInfo *proinfo) * Cascaded delete foreign key references at delete event on PK table. * ---------- */ -HeapTuple -RI_FKey_cascade_del(FmgrInfo *proinfo) +Datum +RI_FKey_cascade_del(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -946,15 +939,13 @@ RI_FKey_cascade_del(FmgrInfo *proinfo) bool isnull; int i; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_cascade_del() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -979,7 +970,7 @@ RI_FKey_cascade_del(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -1016,7 +1007,7 @@ RI_FKey_cascade_del(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -1100,7 +1091,7 @@ RI_FKey_cascade_del(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_cascade_del()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL cascaded delete. @@ -1108,7 +1099,7 @@ RI_FKey_cascade_del(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -1116,7 +1107,7 @@ RI_FKey_cascade_del(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #4 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -1126,10 +1117,10 @@ RI_FKey_cascade_del(FmgrInfo *proinfo) * Cascaded update/delete foreign key references at update event on PK table. * ---------- */ -HeapTuple -RI_FKey_cascade_upd(FmgrInfo *proinfo) +Datum +RI_FKey_cascade_upd(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -1144,15 +1135,13 @@ RI_FKey_cascade_upd(FmgrInfo *proinfo) int i; int j; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_cascade_upd() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -1177,7 +1166,7 @@ RI_FKey_cascade_upd(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -1215,7 +1204,7 @@ RI_FKey_cascade_upd(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -1232,7 +1221,7 @@ RI_FKey_cascade_upd(FmgrInfo *proinfo) */ if (ri_KeysEqual(pk_rel, old_row, new_row, &qkey, RI_KEYPAIR_PK_IDX)) - return NULL; + return PointerGetDatum(NULL); if (SPI_connect() != SPI_OK_CONNECT) elog(NOTICE, "SPI_connect() failed in RI_FKey_cascade_upd()"); @@ -1328,7 +1317,7 @@ RI_FKey_cascade_upd(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_cascade_upd()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL cascade update. @@ -1336,7 +1325,7 @@ RI_FKey_cascade_upd(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -1344,7 +1333,7 @@ RI_FKey_cascade_upd(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #5 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -1361,10 +1350,10 @@ RI_FKey_cascade_upd(FmgrInfo *proinfo) * equivalent. * ---------- */ -HeapTuple -RI_FKey_restrict_del(FmgrInfo *proinfo) +Datum +RI_FKey_restrict_del(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -1377,15 +1366,13 @@ RI_FKey_restrict_del(FmgrInfo *proinfo) bool isnull; int i; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_restrict_del() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -1410,7 +1397,7 @@ RI_FKey_restrict_del(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -1447,7 +1434,7 @@ RI_FKey_restrict_del(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -1542,7 +1529,7 @@ RI_FKey_restrict_del(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_restrict_del()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL restrict delete. @@ -1550,7 +1537,7 @@ RI_FKey_restrict_del(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -1558,7 +1545,7 @@ RI_FKey_restrict_del(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #6 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -1575,10 +1562,10 @@ RI_FKey_restrict_del(FmgrInfo *proinfo) * equivalent. * ---------- */ -HeapTuple -RI_FKey_restrict_upd(FmgrInfo *proinfo) +Datum +RI_FKey_restrict_upd(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -1592,15 +1579,13 @@ RI_FKey_restrict_upd(FmgrInfo *proinfo) bool isnull; int i; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_restrict_upd() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -1625,7 +1610,7 @@ RI_FKey_restrict_upd(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -1663,7 +1648,7 @@ RI_FKey_restrict_upd(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -1680,7 +1665,7 @@ RI_FKey_restrict_upd(FmgrInfo *proinfo) */ if (ri_KeysEqual(pk_rel, old_row, new_row, &qkey, RI_KEYPAIR_PK_IDX)) - return NULL; + return PointerGetDatum(NULL); if (SPI_connect() != SPI_OK_CONNECT) elog(NOTICE, "SPI_connect() failed in RI_FKey_restrict_upd()"); @@ -1766,7 +1751,7 @@ RI_FKey_restrict_upd(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_restrict_upd()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL restrict update. @@ -1774,7 +1759,7 @@ RI_FKey_restrict_upd(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -1782,7 +1767,7 @@ RI_FKey_restrict_upd(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #7 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -1792,10 +1777,10 @@ RI_FKey_restrict_upd(FmgrInfo *proinfo) * Set foreign key references to NULL values at delete event on PK table. * ---------- */ -HeapTuple -RI_FKey_setnull_del(FmgrInfo *proinfo) +Datum +RI_FKey_setnull_del(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -1808,15 +1793,13 @@ RI_FKey_setnull_del(FmgrInfo *proinfo) bool isnull; int i; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_setnull_del() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -1841,7 +1824,7 @@ RI_FKey_setnull_del(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -1878,7 +1861,7 @@ RI_FKey_setnull_del(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -1973,7 +1956,7 @@ RI_FKey_setnull_del(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_setnull_del()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL set null delete. @@ -1981,7 +1964,7 @@ RI_FKey_setnull_del(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -1989,7 +1972,7 @@ RI_FKey_setnull_del(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #8 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -1999,10 +1982,10 @@ RI_FKey_setnull_del(FmgrInfo *proinfo) * Set foreign key references to NULL at update event on PK table. * ---------- */ -HeapTuple -RI_FKey_setnull_upd(FmgrInfo *proinfo) +Datum +RI_FKey_setnull_upd(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -2018,15 +2001,13 @@ RI_FKey_setnull_upd(FmgrInfo *proinfo) int match_type; bool use_cached_query; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_setnull_upd() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -2051,7 +2032,7 @@ RI_FKey_setnull_upd(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -2090,7 +2071,7 @@ RI_FKey_setnull_upd(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -2108,7 +2089,7 @@ RI_FKey_setnull_upd(FmgrInfo *proinfo) */ if (ri_KeysEqual(pk_rel, old_row, new_row, &qkey, RI_KEYPAIR_PK_IDX)) - return NULL; + return PointerGetDatum(NULL); if (SPI_connect() != SPI_OK_CONNECT) elog(NOTICE, "SPI_connect() failed in RI_FKey_setnull_upd()"); @@ -2231,7 +2212,7 @@ RI_FKey_setnull_upd(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_setnull_upd()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL set null update. @@ -2239,7 +2220,7 @@ RI_FKey_setnull_upd(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -2247,7 +2228,7 @@ RI_FKey_setnull_upd(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #9 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -2257,10 +2238,10 @@ RI_FKey_setnull_upd(FmgrInfo *proinfo) * Set foreign key references to defaults at delete event on PK table. * ---------- */ -HeapTuple -RI_FKey_setdefault_del(FmgrInfo *proinfo) +Datum +RI_FKey_setdefault_del(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -2273,15 +2254,13 @@ RI_FKey_setdefault_del(FmgrInfo *proinfo) bool isnull; int i; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_setdefault_del() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -2306,7 +2285,7 @@ RI_FKey_setdefault_del(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -2343,7 +2322,7 @@ RI_FKey_setdefault_del(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -2485,7 +2464,7 @@ RI_FKey_setdefault_del(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_setdefault_del()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL set null delete. @@ -2493,7 +2472,7 @@ RI_FKey_setdefault_del(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -2501,7 +2480,7 @@ RI_FKey_setdefault_del(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #10 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -2511,10 +2490,10 @@ RI_FKey_setdefault_del(FmgrInfo *proinfo) * Set foreign key references to defaults at update event on PK table. * ---------- */ -HeapTuple -RI_FKey_setdefault_upd(FmgrInfo *proinfo) +Datum +RI_FKey_setdefault_upd(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; int tgnargs; char **tgargs; Relation fk_rel; @@ -2529,15 +2508,13 @@ RI_FKey_setdefault_upd(FmgrInfo *proinfo) int i; int match_type; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; ReferentialIntegritySnapshotOverride = true; /* ---------- * Check that this is a valid trigger call on the right time and event. * ---------- */ - if (trigdata == NULL) + if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "RI_FKey_setdefault_upd() not fired by trigger manager"); if (!TRIGGER_FIRED_AFTER(trigdata->tg_event) || !TRIGGER_FIRED_FOR_ROW(trigdata->tg_event)) @@ -2562,7 +2539,7 @@ RI_FKey_setdefault_upd(FmgrInfo *proinfo) * ---------- */ if (tgnargs == 4) - return NULL; + return PointerGetDatum(NULL); /* ---------- * Get the relation descriptors of the FK and PK tables and @@ -2602,7 +2579,7 @@ RI_FKey_setdefault_upd(FmgrInfo *proinfo) * ---------- */ heap_close(fk_rel, NoLock); - return NULL; + return PointerGetDatum(NULL); case RI_KEYS_NONE_NULL: /* ---------- @@ -2619,7 +2596,7 @@ RI_FKey_setdefault_upd(FmgrInfo *proinfo) */ if (ri_KeysEqual(pk_rel, old_row, new_row, &qkey, RI_KEYPAIR_PK_IDX)) - return NULL; + return PointerGetDatum(NULL); if (SPI_connect() != SPI_OK_CONNECT) elog(NOTICE, "SPI_connect() failed in RI_FKey_setdefault_upd()"); @@ -2769,7 +2746,7 @@ RI_FKey_setdefault_upd(FmgrInfo *proinfo) if (SPI_finish() != SPI_OK_FINISH) elog(NOTICE, "SPI_finish() failed in RI_FKey_setdefault_upd()"); - return NULL; + return PointerGetDatum(NULL); /* ---------- * Handle MATCH PARTIAL set null delete. @@ -2777,7 +2754,7 @@ RI_FKey_setdefault_upd(FmgrInfo *proinfo) */ case RI_MATCH_TYPE_PARTIAL: elog(ERROR, "MATCH PARTIAL not yet supported"); - return NULL; + return PointerGetDatum(NULL); } /* ---------- @@ -2785,7 +2762,7 @@ RI_FKey_setdefault_upd(FmgrInfo *proinfo) * ---------- */ elog(ERROR, "internal error #11 in ri_triggers.c"); - return NULL; + return PointerGetDatum(NULL); } @@ -2794,14 +2771,13 @@ RI_FKey_setdefault_upd(FmgrInfo *proinfo) * * Check if we have a key change on update. * - * This is no real trigger procedure. It is used by the deferred + * This is not a real trigger procedure. It is used by the deferred * trigger queue manager to detect "triggered data change violation". * ---------- */ bool -RI_FKey_keyequal_upd(void) +RI_FKey_keyequal_upd(TriggerData *trigdata) { - TriggerData *trigdata; int tgnargs; char **tgargs; Relation fk_rel; @@ -2810,9 +2786,6 @@ RI_FKey_keyequal_upd(void) HeapTuple old_row; RI_QueryKey qkey; - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; - /* ---------- * Check for the correct # of call arguments * ---------- @@ -3262,8 +3235,10 @@ ri_OneKeyEqual(Relation rel, int column, HeapTuple oldtup, HeapTuple newtup, /* ---------- * ri_AttributesEqual - * - * Call the type specific '=' operator comparision function + * Call the type specific '=' operator comparison function * for two values. + * + * NB: we have already checked that neither value is null. * ---------- */ static bool @@ -3271,7 +3246,6 @@ ri_AttributesEqual(Oid typeid, Datum oldvalue, Datum newvalue) { RI_OpreqHashEntry *entry; bool found; - Datum result; /* ---------- * On the first call initialize the hashtable @@ -3291,6 +3265,7 @@ ri_AttributesEqual(Oid typeid, Datum oldvalue, Datum newvalue) /* ---------- * If not found, lookup the OPERNAME system cache for it + * to get the func OID, then do the function manager lookup, * and remember that info. * ---------- */ @@ -3307,7 +3282,7 @@ ri_AttributesEqual(Oid typeid, Datum oldvalue, Datum newvalue) if (!HeapTupleIsValid(opr_tup)) elog(ERROR, "ri_AttributesEqual(): cannot find '=' operator " - "for type %d", typeid); + "for type %u", typeid); opr_struct = (Form_pg_operator) GETSTRUCT(opr_tup); entry = (RI_OpreqHashEntry *) hash_search(ri_opreq_cache, @@ -3315,15 +3290,14 @@ ri_AttributesEqual(Oid typeid, Datum oldvalue, Datum newvalue) if (entry == NULL) elog(FATAL, "can't insert into RI operator cache"); - entry->oprfnid = opr_struct->oprcode; - memset(&(entry->oprfmgrinfo), 0, sizeof(FmgrInfo)); + entry->typeid = typeid; + fmgr_info(opr_struct->oprcode, &(entry->oprfmgrinfo)); } /* ---------- * Call the type specific '=' function * ---------- */ - fmgr_info(entry->oprfnid, &(entry->oprfmgrinfo)); - result = (Datum) (*fmgr_faddr(&(entry->oprfmgrinfo))) (oldvalue, newvalue); - return (bool) result; + return DatumGetBool(FunctionCall2(&(entry->oprfmgrinfo), + oldvalue, newvalue)); } diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c index 070cb05018d..7b96fb36547 100644 --- a/src/backend/utils/adt/tid.c +++ b/src/backend/utils/adt/tid.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.16 2000/04/12 17:15:51 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.17 2000/05/29 01:59:08 tgl Exp $ * * NOTES * input routine largely stolen from boxin(). @@ -17,6 +17,8 @@ */ #include "postgres.h" + +#include "access/heapam.h" #include "utils/builtins.h" #define LDELIM '(' diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 56ab2f10bb6..2bcb33cbcc2 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -8,16 +8,17 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.26 2000/04/14 15:22:10 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.27 2000/05/29 01:59:08 tgl Exp $ * *------------------------------------------------------------------------- */ + +#include "postgres.h" + #include <ctype.h> #include <math.h> -#include <sys/types.h> #include <errno.h> - -#include "postgres.h" +#include <sys/types.h> #ifdef HAVE_FLOAT_H #include <float.h> #endif @@ -28,6 +29,7 @@ #include <sys/timeb.h> #endif +#include "access/xact.h" #include "miscadmin.h" #include "utils/builtins.h" diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c index 793497834fd..41483792257 100644 --- a/src/backend/utils/fmgr/fmgr.c +++ b/src/backend/utils/fmgr/fmgr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.40 2000/05/28 17:56:07 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/fmgr/fmgr.c,v 1.41 2000/05/29 01:59:09 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -17,7 +17,6 @@ #include "catalog/pg_language.h" #include "catalog/pg_proc.h" -#include "commands/trigger.h" /* TEMPORARY: for CurrentTriggerData */ #include "utils/builtins.h" #include "utils/fmgrtab.h" #include "utils/syscache.h" diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index e8717ddb05c..74b712dca96 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -37,7 +37,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: catversion.h,v 1.22 2000/05/28 17:56:16 tgl Exp $ + * $Id: catversion.h,v 1.23 2000/05/29 01:59:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 200005281 +#define CATALOG_VERSION_NO 200005282 #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 2a787f1f37a..76f52eef690 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pg_proc.h,v 1.134 2000/05/28 17:56:16 tgl Exp $ + * $Id: pg_proc.h,v 1.135 2000/05/29 01:59:10 tgl Exp $ * * NOTES * The script catalog/genbki.sh reads this file and generates .bki @@ -2103,7 +2103,7 @@ DESCR("less-than"); DATA(insert OID = 1656 ( lztext_le PGUID 11 f t t t 2 f 16 "1625 1625" 100 0 1 0 lztext_le - )); DESCR("less-than-or-equal"); -DATA(insert OID = 1689 ( update_pg_pwd PGUID 11 f t f t 0 f 0 "" 100 0 0 100 update_pg_pwd - )); +DATA(insert OID = 1689 ( update_pg_pwd PGUID 12 f t f t 0 f 0 "" 100 0 0 100 update_pg_pwd - )); DESCR("update pg_pwd file"); /* Oracle Compatibility Related Functions - By Edmund Mergl <E.Mergl@bawue.de> */ @@ -2163,29 +2163,29 @@ DATA(insert OID = 1643 ( pg_get_indexdef PGUID 11 f t f t 1 f 25 "26" 100 0 DESCR("index description"); /* Generic referential integrity constraint triggers */ -DATA(insert OID = 1644 ( RI_FKey_check_ins PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_check_ins - )); +DATA(insert OID = 1644 ( RI_FKey_check_ins PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_check_ins - )); DESCR("referential integrity FOREIGN KEY ... REFERENCES"); -DATA(insert OID = 1645 ( RI_FKey_check_upd PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_check_upd - )); +DATA(insert OID = 1645 ( RI_FKey_check_upd PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_check_upd - )); DESCR("referential integrity FOREIGN KEY ... REFERENCES"); -DATA(insert OID = 1646 ( RI_FKey_cascade_del PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_cascade_del - )); +DATA(insert OID = 1646 ( RI_FKey_cascade_del PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_cascade_del - )); DESCR("referential integrity ON DELETE CASCADE"); -DATA(insert OID = 1647 ( RI_FKey_cascade_upd PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_cascade_upd - )); +DATA(insert OID = 1647 ( RI_FKey_cascade_upd PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_cascade_upd - )); DESCR("referential integrity ON UPDATE CASCADE"); -DATA(insert OID = 1648 ( RI_FKey_restrict_del PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_restrict_del - )); +DATA(insert OID = 1648 ( RI_FKey_restrict_del PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_restrict_del - )); DESCR("referential integrity ON DELETE RESTRICT"); -DATA(insert OID = 1649 ( RI_FKey_restrict_upd PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_restrict_upd - )); +DATA(insert OID = 1649 ( RI_FKey_restrict_upd PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_restrict_upd - )); DESCR("referential integrity ON UPDATE RESTRICT"); -DATA(insert OID = 1650 ( RI_FKey_setnull_del PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_setnull_del - )); +DATA(insert OID = 1650 ( RI_FKey_setnull_del PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_setnull_del - )); DESCR("referential integrity ON DELETE SET NULL"); -DATA(insert OID = 1651 ( RI_FKey_setnull_upd PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_setnull_upd - )); +DATA(insert OID = 1651 ( RI_FKey_setnull_upd PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_setnull_upd - )); DESCR("referential integrity ON UPDATE SET NULL"); -DATA(insert OID = 1652 ( RI_FKey_setdefault_del PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_setdefault_del - )); +DATA(insert OID = 1652 ( RI_FKey_setdefault_del PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_setdefault_del - )); DESCR("referential integrity ON DELETE SET DEFAULT"); -DATA(insert OID = 1653 ( RI_FKey_setdefault_upd PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_setdefault_upd - )); +DATA(insert OID = 1653 ( RI_FKey_setdefault_upd PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_setdefault_upd - )); DESCR("referential integrity ON UPDATE SET DEFAULT"); -DATA(insert OID = 1654 ( RI_FKey_noaction_del PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_noaction_del - )); +DATA(insert OID = 1654 ( RI_FKey_noaction_del PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_noaction_del - )); DESCR("referential integrity ON DELETE NO ACTION"); -DATA(insert OID = 1655 ( RI_FKey_noaction_upd PGUID 11 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_noaction_upd - )); +DATA(insert OID = 1655 ( RI_FKey_noaction_upd PGUID 12 f t f t 0 f 0 "" 100 0 0 100 RI_FKey_noaction_upd - )); DESCR("referential integrity ON UPDATE NO ACTION"); DATA(insert OID = 1666 ( varbiteq PGUID 11 f t t t 2 f 16 "1562 1562" 100 0 1 0 varbiteq - )); diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h index 3b735546ea5..c6d5b5413c4 100644 --- a/src/include/commands/trigger.h +++ b/src/include/commands/trigger.h @@ -1,12 +1,12 @@ /*------------------------------------------------------------------------- * * trigger.h - * prototypes for trigger.c. + * Declarations for trigger handling. * * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: trigger.h,v 1.19 2000/04/12 17:16:32 momjian Exp $ + * $Id: trigger.h,v 1.20 2000/05/29 01:59:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -16,10 +16,19 @@ #include "nodes/execnodes.h" #include "nodes/parsenodes.h" +/* + * 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)) + typedef uint32 TriggerEvent; typedef struct TriggerData { + NodeTag type; TriggerEvent tg_event; Relation tg_relation; HeapTuple tg_trigtuple; @@ -27,7 +36,7 @@ typedef struct TriggerData Trigger *tg_trigger; } TriggerData; -extern DLLIMPORT TriggerData *CurrentTriggerData; +/* TriggerEvent bit flags */ #define TRIGGER_EVENT_INSERT 0x00000000 #define TRIGGER_EVENT_DELETE 0x00000001 @@ -136,6 +145,6 @@ extern void DeferredTriggerSaveEvent(Relation rel, int event, * in utils/adt/ri_triggers.c * */ -extern bool RI_FKey_keyequal_upd(void); +extern bool RI_FKey_keyequal_upd(TriggerData *trigdata); #endif /* TRIGGER_H */ diff --git a/src/include/commands/user.h b/src/include/commands/user.h index f250a1c3da8..d985d72d023 100644 --- a/src/include/commands/user.h +++ b/src/include/commands/user.h @@ -3,7 +3,7 @@ * user.h * * - * + * $Id: user.h,v 1.12 2000/05/29 01:59:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -21,6 +21,6 @@ extern void CreateGroup(CreateGroupStmt *stmt); extern void AlterGroup(AlterGroupStmt *stmt, const char *tag); extern void DropGroup(DropGroupStmt *stmt); -extern HeapTuple update_pg_pwd(void); +extern Datum update_pg_pwd(PG_FUNCTION_ARGS); #endif /* USER_H */ diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index bed2c57ec57..3c85762dfaf 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: executor.h,v 1.42 2000/01/26 05:58:05 momjian Exp $ + * $Id: executor.h,v 1.43 2000/05/29 01:59:11 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -59,6 +59,8 @@ extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc, EState *estate, extern void ExecutorEnd(QueryDesc *queryDesc, EState *estate); extern void ExecConstraints(char *caller, Relation rel, HeapTuple tuple, EState *estate); +extern TupleTableSlot *EvalPlanQual(EState *estate, Index rti, + ItemPointer tid); /* * prototypes from functions in execProcnode.c diff --git a/src/include/fmgr.h b/src/include/fmgr.h index 18b01f7fad1..ce6b06bf8d4 100644 --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -11,7 +11,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: fmgr.h,v 1.1 2000/05/28 17:56:12 tgl Exp $ + * $Id: fmgr.h,v 1.2 2000/05/29 01:59:09 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -107,6 +107,7 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo); #define PG_GETARG_BOOL(n) DatumGetBool(fcinfo->arg[n]) #define PG_GETARG_OID(n) DatumGetObjectId(fcinfo->arg[n]) #define PG_GETARG_POINTER(n) DatumGetPointer(fcinfo->arg[n]) +#define PG_GETARG_NAME(n) DatumGetName(fcinfo->arg[n]) /* these macros hide the pass-by-reference-ness of the datatype: */ #define PG_GETARG_FLOAT4(n) DatumGetFloat4(fcinfo->arg[n]) #define PG_GETARG_FLOAT8(n) DatumGetFloat8(fcinfo->arg[n]) @@ -133,6 +134,7 @@ extern void fmgr_info(Oid functionId, FmgrInfo *finfo); #define PG_RETURN_BOOL(x) return BoolGetDatum(x) #define PG_RETURN_OID(x) return ObjectIdGetDatum(x) #define PG_RETURN_POINTER(x) return PointerGetDatum(x) +#define PG_RETURN_NAME(x) return NameGetDatum(x) /* these macros hide the pass-by-reference-ness of the datatype: */ #define PG_RETURN_FLOAT4(x) return Float4GetDatum(x) #define PG_RETURN_FLOAT8(x) return Float8GetDatum(x) diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index a8fe032ba51..5d049dadfb2 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: nodes.h,v 1.67 2000/04/12 17:16:40 momjian Exp $ + * $Id: nodes.h,v 1.68 2000/05/29 01:59:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -223,7 +223,13 @@ typedef enum NodeTag T_CaseExpr, T_CaseWhen, T_RowMark, - T_FkConstraint + T_FkConstraint, + + /*--------------------- + * TAGS FOR FUNCTION-CALL CONTEXT AND RESULTINFO NODES (cf. fmgr.h) + *--------------------- + */ + T_TriggerData = 800 /* in commands/trigger.h */ } NodeTag; /* diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 16bff65054d..051a155a83d 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -7,23 +7,14 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: builtins.h,v 1.111 2000/04/16 04:41:03 tgl Exp $ - * - * NOTES - * This should normally only be included by fmgr.h. - * Under no circumstances should it ever be included before - * including fmgr.h! - * fmgr.h does not seem to include this file, so don't know where this - * comment came from. Backend code must include this stuff explicitly - * as far as I can tell... - * - thomas 1998-06-08 + * $Id: builtins.h,v 1.112 2000/05/29 01:59:13 tgl Exp $ * *------------------------------------------------------------------------- */ #ifndef BUILTINS_H #define BUILTINS_H -#include "access/heapam.h" /* for HeapTuple */ +#include "fmgr.h" #include "nodes/relation.h" /* for amcostestimate parameters */ #include "storage/itemptr.h" #include "utils/array.h" @@ -648,17 +639,17 @@ bool lztext_lt(lztext *lz1, lztext *lz2); bool lztext_le(lztext *lz1, lztext *lz2); /* ri_triggers.c */ -extern HeapTuple RI_FKey_check_ins(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_check_upd(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_noaction_del(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_noaction_upd(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_cascade_del(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_cascade_upd(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_restrict_del(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_restrict_upd(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_setnull_del(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_setnull_upd(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_setdefault_del(FmgrInfo *proinfo); -extern HeapTuple RI_FKey_setdefault_upd(FmgrInfo *proinfo); +extern Datum RI_FKey_check_ins(PG_FUNCTION_ARGS); +extern Datum RI_FKey_check_upd(PG_FUNCTION_ARGS); +extern Datum RI_FKey_noaction_del(PG_FUNCTION_ARGS); +extern Datum RI_FKey_noaction_upd(PG_FUNCTION_ARGS); +extern Datum RI_FKey_cascade_del(PG_FUNCTION_ARGS); +extern Datum RI_FKey_cascade_upd(PG_FUNCTION_ARGS); +extern Datum RI_FKey_restrict_del(PG_FUNCTION_ARGS); +extern Datum RI_FKey_restrict_upd(PG_FUNCTION_ARGS); +extern Datum RI_FKey_setnull_del(PG_FUNCTION_ARGS); +extern Datum RI_FKey_setnull_upd(PG_FUNCTION_ARGS); +extern Datum RI_FKey_setdefault_del(PG_FUNCTION_ARGS); +extern Datum RI_FKey_setdefault_upd(PG_FUNCTION_ARGS); #endif /* BUILTINS_H */ diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index b440be12de8..278a5709ef0 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -33,7 +33,7 @@ * ENHANCEMENTS, OR MODIFICATIONS. * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plperl/plperl.c,v 1.7 2000/05/28 17:56:26 tgl Exp $ + * $Header: /cvsroot/pgsql/src/pl/plperl/plperl.c,v 1.8 2000/05/29 01:59:13 tgl Exp $ * **********************************************************************/ @@ -283,18 +283,18 @@ plperl_call_handler(PG_FUNCTION_ARGS) * Determine if called as function or trigger and * call appropriate subhandler ************************************************************/ - if (CurrentTriggerData == NULL) - retval = plperl_func_handler(fcinfo); - else + if (CALLED_AS_TRIGGER(fcinfo)) { elog(ERROR, "plperl: can't use perl in triggers yet."); /* - * retval = (Datum) plperl_trigger_handler(fcinfo); + * retval = PointerGetDatum(plperl_trigger_handler(fcinfo)); */ /* make the compiler happy */ retval = (Datum) 0; } + else + retval = plperl_func_handler(fcinfo); plperl_call_level--; @@ -687,7 +687,7 @@ plperl_func_handler(PG_FUNCTION_ARGS) static HeapTuple plperl_trigger_handler(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; char internal_proname[512]; char *stroid; Tcl_HashEntry *hashent; @@ -711,12 +711,6 @@ plperl_trigger_handler(PG_FUNCTION_ARGS) sigjmp_buf save_restart; /************************************************************ - * Save the current trigger data local - ************************************************************/ - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; - - /************************************************************ * Build our internal proc name from the functions Oid ************************************************************/ sprintf(internal_proname, "__PLPerl_proc_%u", fcinfo->flinfo->fn_oid); diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c index 54ecb1f4e89..31788b07061 100644 --- a/src/pl/plpgsql/src/pl_handler.c +++ b/src/pl/plpgsql/src/pl_handler.c @@ -3,7 +3,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_handler.c,v 1.4 2000/05/28 17:56:28 tgl Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_handler.c,v 1.5 2000/05/29 01:59:14 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -69,22 +69,11 @@ static PLpgSQL_function *compiled_functions = NULL; Datum plpgsql_call_handler(PG_FUNCTION_ARGS) { - TriggerData *trigdata; - bool isTrigger; + bool isTrigger = CALLED_AS_TRIGGER(fcinfo); PLpgSQL_function *func; Datum retval; /* ---------- - * Save the current trigger data local - * - * XXX this should go away in favor of using fcinfo->context - * ---------- - */ - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; - isTrigger = (trigdata != NULL); - - /* ---------- * Connect to SPI manager * ---------- */ @@ -136,7 +125,8 @@ plpgsql_call_handler(PG_FUNCTION_ARGS) * ---------- */ if (isTrigger) - retval = PointerGetDatum(plpgsql_exec_trigger(func, trigdata)); + retval = PointerGetDatum(plpgsql_exec_trigger(func, + (TriggerData *) fcinfo->context)); else retval = plpgsql_exec_function(func, fcinfo); diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index c968471ed94..201bbdf092d 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -31,7 +31,7 @@ * ENHANCEMENTS, OR MODIFICATIONS. * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.23 2000/05/28 17:56:29 tgl Exp $ + * $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.24 2000/05/29 01:59:15 tgl Exp $ * **********************************************************************/ @@ -390,10 +390,10 @@ pltcl_call_handler(PG_FUNCTION_ARGS) * Determine if called as function or trigger and * call appropriate subhandler ************************************************************/ - if (CurrentTriggerData == NULL) - retval = pltcl_func_handler(fcinfo); + if (CALLED_AS_TRIGGER(fcinfo)) + retval = PointerGetDatum(pltcl_trigger_handler(fcinfo)); else - retval = (Datum) pltcl_trigger_handler(fcinfo); + retval = pltcl_func_handler(fcinfo); pltcl_call_level--; @@ -734,7 +734,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS) static HeapTuple pltcl_trigger_handler(PG_FUNCTION_ARGS) { - TriggerData *trigdata; + TriggerData *trigdata = (TriggerData *) fcinfo->context; char internal_proname[512]; char *stroid; Tcl_HashEntry *hashent; @@ -758,12 +758,6 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS) sigjmp_buf save_restart; /************************************************************ - * Save the current trigger data local - ************************************************************/ - trigdata = CurrentTriggerData; - CurrentTriggerData = NULL; - - /************************************************************ * Build our internal proc name from the functions Oid ************************************************************/ sprintf(internal_proname, "__PLTcl_proc_%u", fcinfo->flinfo->fn_oid); diff --git a/src/test/regress/input/create_function_1.source b/src/test/regress/input/create_function_1.source index 52b1c22e13b..e3c1d22c1db 100644 --- a/src/test/regress/input/create_function_1.source +++ b/src/test/regress/input/create_function_1.source @@ -15,27 +15,27 @@ CREATE FUNCTION widget_out(opaque) CREATE FUNCTION check_primary_key () RETURNS opaque AS '_OBJWD_/../../../contrib/spi/refint_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION check_foreign_key () RETURNS opaque AS '_OBJWD_/../../../contrib/spi/refint_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION autoinc () RETURNS opaque AS '_OBJWD_/../../../contrib/spi/autoinc_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION funny_dup17 () RETURNS opaque AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION ttdummy () RETURNS opaque AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION set_ttdummy (int4) RETURNS int4 diff --git a/src/test/regress/output/create_function_1.source b/src/test/regress/output/create_function_1.source index 64fad7a8785..9eb0ce6e61a 100644 --- a/src/test/regress/output/create_function_1.source +++ b/src/test/regress/output/create_function_1.source @@ -13,23 +13,23 @@ CREATE FUNCTION widget_out(opaque) CREATE FUNCTION check_primary_key () RETURNS opaque AS '_OBJWD_/../../../contrib/spi/refint_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION check_foreign_key () RETURNS opaque AS '_OBJWD_/../../../contrib/spi/refint_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION autoinc () RETURNS opaque AS '_OBJWD_/../../../contrib/spi/autoinc_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION funny_dup17 () RETURNS opaque AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION ttdummy () RETURNS opaque AS '_OBJWD_/regress_DLSUFFIX_' - LANGUAGE 'c'; + LANGUAGE 'newC'; CREATE FUNCTION set_ttdummy (int4) RETURNS int4 AS '_OBJWD_/regress_DLSUFFIX_' diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index b388f2f977b..f58b0d9d8cf 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -1,5 +1,5 @@ /* - * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.36 2000/04/12 17:17:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.37 2000/05/29 01:59:15 tgl Exp $ */ #include <float.h> /* faked on sunos */ @@ -306,11 +306,12 @@ static int fd17b_level = 0; static int fd17a_level = 0; static bool fd17b_recursion = true; static bool fd17a_recursion = true; -HeapTuple funny_dup17(void); +extern Datum funny_dup17(PG_FUNCTION_ARGS); -HeapTuple /* have to return HeapTuple to Executor */ -funny_dup17() +Datum +funny_dup17(PG_FUNCTION_ARGS) { + TriggerData *trigdata = (TriggerData *) fcinfo->context; TransactionId *xid; int *level; bool *recursion; @@ -325,10 +326,13 @@ funny_dup17() int selected = 0; int ret; - tuple = CurrentTriggerData->tg_trigtuple; - rel = CurrentTriggerData->tg_relation; + if (!CALLED_AS_TRIGGER(fcinfo)) + elog(ERROR, "funny_dup17: not fired by trigger manager"); + + tuple = trigdata->tg_trigtuple; + rel = trigdata->tg_relation; tupdesc = rel->rd_att; - if (TRIGGER_FIRED_BEFORE(CurrentTriggerData->tg_event)) + if (TRIGGER_FIRED_BEFORE(trigdata->tg_event)) { xid = &fd17b_xid; level = &fd17b_level; @@ -343,8 +347,6 @@ funny_dup17() when = "AFTER "; } - CurrentTriggerData = NULL; - if (!TransactionIdIsCurrentTransactionId(*xid)) { *xid = GetCurrentTransactionId(); @@ -355,11 +357,11 @@ funny_dup17() if (*level == 17) { *recursion = false; - return tuple; + return PointerGetDatum(tuple); } if (!(*recursion)) - return tuple; + return PointerGetDatum(tuple); (*level)++; @@ -412,10 +414,10 @@ funny_dup17() if (*level == 0) *xid = InvalidTransactionId; - return tuple; + return PointerGetDatum(tuple); } -HeapTuple ttdummy(void); +extern Datum ttdummy(PG_FUNCTION_ARGS); int32 set_ttdummy(int32 on); extern int4 nextval(struct varlena * seqin); @@ -425,9 +427,10 @@ extern int4 nextval(struct varlena * seqin); static void *splan = NULL; static bool ttoff = false; -HeapTuple -ttdummy() +Datum +ttdummy(PG_FUNCTION_ARGS) { + TriggerData *trigdata = (TriggerData *) fcinfo->context; Trigger *trigger; /* to get trigger name */ char **args; /* arguments */ int attnum[2]; /* fnumbers of start/stop columns */ @@ -448,30 +451,30 @@ ttdummy() int ret; int i; - if (!CurrentTriggerData) - elog(ERROR, "ttdummy: triggers are not initialized"); - if (TRIGGER_FIRED_FOR_STATEMENT(CurrentTriggerData->tg_event)) + if (!CALLED_AS_TRIGGER(fcinfo)) + elog(ERROR, "ttdummy: not fired by trigger manager"); + if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event)) elog(ERROR, "ttdummy: can't process STATEMENT events"); - if (TRIGGER_FIRED_AFTER(CurrentTriggerData->tg_event)) + if (TRIGGER_FIRED_AFTER(trigdata->tg_event)) elog(ERROR, "ttdummy: must be fired before event"); - if (TRIGGER_FIRED_BY_INSERT(CurrentTriggerData->tg_event)) + if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event)) elog(ERROR, "ttdummy: can't process INSERT event"); - if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event)) - newtuple = CurrentTriggerData->tg_newtuple; + if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) + newtuple = trigdata->tg_newtuple; - trigtuple = CurrentTriggerData->tg_trigtuple; + trigtuple = trigdata->tg_trigtuple; - rel = CurrentTriggerData->tg_relation; + rel = trigdata->tg_relation; relname = SPI_getrelname(rel); /* check if TT is OFF for this relation */ if (ttoff) /* OFF - nothing to do */ { pfree(relname); - return (newtuple != NULL) ? newtuple : trigtuple; + return PointerGetDatum((newtuple != NULL) ? newtuple : trigtuple); } - trigger = CurrentTriggerData->tg_trigger; + trigger = trigdata->tg_trigger; if (trigger->tgnargs != 2) elog(ERROR, "ttdummy (%s): invalid (!= 2) number of arguments %d", @@ -481,8 +484,6 @@ ttdummy() tupdesc = rel->rd_att; natts = tupdesc->natts; - CurrentTriggerData = NULL; - for (i = 0; i < 2; i++) { attnum[i] = SPI_fnumber(tupdesc, args[i]); @@ -517,13 +518,13 @@ ttdummy() if (newoff != TTDUMMY_INFINITY) { pfree(relname); /* allocated in upper executor context */ - return NULL; + return PointerGetDatum(NULL); } } else if (oldoff != TTDUMMY_INFINITY) /* DELETE */ { pfree(relname); - return NULL; + return PointerGetDatum(NULL); } { @@ -618,7 +619,7 @@ ttdummy() pfree(relname); - return rettuple; + return PointerGetDatum(rettuple); } int32 |