1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-28 23:42:10 +03:00

Second round of fmgr changes: triggers are now invoked in new style,

CurrentTriggerData is history.
This commit is contained in:
Tom Lane
2000-05-29 01:59:17 +00:00
parent 147ccf5c80
commit 18952f6744
41 changed files with 666 additions and 674 deletions

View File

@ -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;
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;
CurrentTriggerData = &newtrigdata;
RI_FKey_check_ins(NULL);
/* Make a call to the check function */
/* No parameters are passed, but we do set a context */
FunctionCallInfoData fcinfo;
TriggerData trigdata;
MemSet(&fcinfo, 0, sizeof(fcinfo));
/* We assume RI_FKey_check_ins won't look at flinfo... */
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;
fcinfo.context = (Node *) &trigdata;
RI_FKey_check_ins(&fcinfo);
}
heap_endscan(scan);
heap_close(rel, NoLock); /* close rel but keep

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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 *

View File

@ -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));
}

View File

@ -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 '('

View File

@ -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 <ctype.h>
#include <math.h>
#include <sys/types.h>
#include <errno.h>
#include "postgres.h"
#include <ctype.h>
#include <math.h>
#include <errno.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"

View File

@ -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"

View File

@ -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

View File

@ -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 - ));

View File

@ -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 */

View File

@ -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 */

View File

@ -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

View File

@ -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)

View File

@ -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;
/*

View File

@ -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 */

View File

@ -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;
@ -710,12 +710,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
************************************************************/

View File

@ -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,21 +69,10 @@ 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);

View File

@ -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;
@ -757,12 +757,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
************************************************************/

View File

@ -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

View File

@ -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_'

View File

@ -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