Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita74613f

Browse files
committed
Cleanups.
1 parentb6f348c commita74613f

File tree

4 files changed

+269
-50
lines changed

4 files changed

+269
-50
lines changed

‎src/backend/commands/trigger.c

Lines changed: 207 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include"catalog/pg_trigger.h"
2020
#include"access/genam.h"
2121
#include"access/heapam.h"
22+
#include"access/valid.h"
2223
#include"access/xact.h"
2324
#include"storage/lmgr.h"
2425
#include"storage/bufmgr.h"
@@ -37,13 +38,16 @@ TriggerData *CurrentTriggerData = NULL;
3738
voidRelationBuildTriggers(Relationrelation);
3839
voidFreeTriggerDesc(Relationrelation);
3940

40-
staticvoidDescribeTrigger(TriggerDesc*trigdesc,Trigger*trigger);
41+
staticvoidDescribeTrigger(TriggerDesc*trigdesc,Trigger*trigger);
42+
staticHeapTuple
43+
GetTupleForTrigger(Relationrelation,ItemPointertid,
44+
boolbefore);
4145

42-
externvoidfmgr_info(OidprocedureId,func_ptr*function,int*nargs);
46+
externvoidfmgr_info(OidprocedureId,func_ptr*function,int*nargs);
4347
externGlobalMemoryCacheCxt;
4448

4549
void
46-
CreateTrigger(CreateTrigStmt*stmt)
50+
CreateTrigger(CreateTrigStmt*stmt)
4751
{
4852
int16tgtype;
4953
int16tgattr[8]= {0};
@@ -211,7 +215,7 @@ CreateTrigger(CreateTrigStmt *stmt)
211215
}
212216

213217
void
214-
DropTrigger(DropTrigStmt*stmt)
218+
DropTrigger(DropTrigStmt*stmt)
215219
{
216220
Relationrel;
217221
Relationtgrel;
@@ -481,7 +485,7 @@ FreeTriggerDesc(Relation relation)
481485
}
482486

483487
staticvoid
484-
DescribeTrigger(TriggerDesc*trigdesc,Trigger*trigger)
488+
DescribeTrigger(TriggerDesc*trigdesc,Trigger*trigger)
485489
{
486490
uint16*n;
487491
Trigger***t,
@@ -555,64 +559,249 @@ DescribeTrigger(TriggerDesc *trigdesc, Trigger *trigger)
555559
}
556560

557561
HeapTuple
558-
ExecBRInsertTriggers(Relationrel,HeapTupletuple)
562+
ExecBRInsertTriggers(Relationrel,HeapTupletrigtuple)
559563
{
564+
TriggerData*SaveTriggerData;
560565
intntrigs=rel->trigdesc->n_before_row[TRIGGER_EVENT_INSERT];
561566
Trigger**trigger=rel->trigdesc->tg_before_row[TRIGGER_EVENT_INSERT];
562-
HeapTuplenewtuple=tuple;
567+
HeapTuplenewtuple=trigtuple;
568+
HeapTupleoldtuple;
563569
intnargs;
564570
inti;
565571

566-
CurrentTriggerData= (TriggerData*)palloc(sizeof(TriggerData));
567-
CurrentTriggerData->tg_event=TRIGGER_EVENT_INSERT |TRIGGER_EVENT_ROW;
568-
CurrentTriggerData->tg_relation=rel;
569-
CurrentTriggerData->tg_newtuple=NULL;
572+
SaveTriggerData= (TriggerData*)palloc(sizeof(TriggerData));
573+
SaveTriggerData->tg_event=
574+
TRIGGER_EVENT_INSERT |TRIGGER_EVENT_ROW |TRIGGER_EVENT_BEFORE;
575+
SaveTriggerData->tg_relation=rel;
576+
SaveTriggerData->tg_newtuple=NULL;
570577
for (i=0;i<ntrigs;i++)
571578
{
572-
CurrentTriggerData->tg_trigtuple=newtuple;
579+
CurrentTriggerData=SaveTriggerData;
580+
CurrentTriggerData->tg_trigtuple=oldtuple=newtuple;
573581
CurrentTriggerData->tg_trigger=trigger[i];
574582
if (trigger[i]->tgfunc==NULL)
575583
fmgr_info(trigger[i]->tgfoid,&(trigger[i]->tgfunc),&nargs);
576584
newtuple= (HeapTuple) ((*(trigger[i]->tgfunc)) ());
577585
if (newtuple==NULL)
578586
break;
587+
elseif (oldtuple!=newtuple&&oldtuple!=trigtuple)
588+
pfree(oldtuple);
579589
}
580-
pfree(CurrentTriggerData);
581590
CurrentTriggerData=NULL;
591+
pfree(SaveTriggerData);
582592
return (newtuple);
583593
}
584594

585595
void
586-
ExecARInsertTriggers(Relationrel,HeapTupletuple)
596+
ExecARInsertTriggers(Relationrel,HeapTupletrigtuple)
587597
{
598+
TriggerData*SaveTriggerData;
599+
intntrigs=rel->trigdesc->n_after_row[TRIGGER_EVENT_INSERT];
600+
Trigger**trigger=rel->trigdesc->tg_after_row[TRIGGER_EVENT_INSERT];
601+
intnargs;
602+
inti;
588603

604+
SaveTriggerData= (TriggerData*)palloc(sizeof(TriggerData));
605+
SaveTriggerData->tg_event=TRIGGER_EVENT_INSERT |TRIGGER_EVENT_ROW;
606+
SaveTriggerData->tg_relation=rel;
607+
SaveTriggerData->tg_newtuple=NULL;
608+
for (i=0;i<ntrigs;i++)
609+
{
610+
CurrentTriggerData=SaveTriggerData;
611+
CurrentTriggerData->tg_trigtuple=trigtuple;
612+
CurrentTriggerData->tg_trigger=trigger[i];
613+
if (trigger[i]->tgfunc==NULL)
614+
fmgr_info(trigger[i]->tgfoid,&(trigger[i]->tgfunc),&nargs);
615+
(void) ((*(trigger[i]->tgfunc)) ());
616+
}
617+
CurrentTriggerData=NULL;
618+
pfree(SaveTriggerData);
589619
return;
590620
}
591621

592622
bool
593623
ExecBRDeleteTriggers(Relationrel,ItemPointertupleid)
594624
{
625+
TriggerData*SaveTriggerData;
626+
intntrigs=rel->trigdesc->n_before_row[TRIGGER_EVENT_DELETE];
627+
Trigger**trigger=rel->trigdesc->tg_before_row[TRIGGER_EVENT_DELETE];
628+
HeapTupletrigtuple;
629+
HeapTuplenewtuple=NULL;
630+
intnargs;
631+
inti;
632+
633+
trigtuple=GetTupleForTrigger(rel,tupleid, true);
634+
if (trigtuple==NULL)
635+
return (false);
595636

596-
return (true);
637+
SaveTriggerData= (TriggerData*)palloc(sizeof(TriggerData));
638+
SaveTriggerData->tg_event=
639+
TRIGGER_EVENT_DELETE |TRIGGER_EVENT_ROW |TRIGGER_EVENT_BEFORE;
640+
SaveTriggerData->tg_relation=rel;
641+
SaveTriggerData->tg_newtuple=NULL;
642+
for (i=0;i<ntrigs;i++)
643+
{
644+
CurrentTriggerData=SaveTriggerData;
645+
CurrentTriggerData->tg_trigtuple=trigtuple;
646+
CurrentTriggerData->tg_trigger=trigger[i];
647+
if (trigger[i]->tgfunc==NULL)
648+
fmgr_info(trigger[i]->tgfoid,&(trigger[i]->tgfunc),&nargs);
649+
newtuple= (HeapTuple) ((*(trigger[i]->tgfunc)) ());
650+
if (newtuple==NULL)
651+
break;
652+
}
653+
CurrentTriggerData=NULL;
654+
pfree(SaveTriggerData);
655+
pfree(trigtuple);
656+
657+
return ((newtuple==NULL) ? false : true);
597658
}
598659

599660
void
600661
ExecARDeleteTriggers(Relationrel,ItemPointertupleid)
601662
{
663+
TriggerData*SaveTriggerData;
664+
intntrigs=rel->trigdesc->n_after_row[TRIGGER_EVENT_DELETE];
665+
Trigger**trigger=rel->trigdesc->tg_after_row[TRIGGER_EVENT_DELETE];
666+
HeapTupletrigtuple;
667+
intnargs;
668+
inti;
602669

670+
trigtuple=GetTupleForTrigger(rel,tupleid, false);
671+
Assert(trigtuple!=NULL);
672+
673+
SaveTriggerData= (TriggerData*)palloc(sizeof(TriggerData));
674+
SaveTriggerData->tg_event=
675+
TRIGGER_EVENT_DELETE |TRIGGER_EVENT_ROW;
676+
SaveTriggerData->tg_relation=rel;
677+
SaveTriggerData->tg_newtuple=NULL;
678+
for (i=0;i<ntrigs;i++)
679+
{
680+
CurrentTriggerData=SaveTriggerData;
681+
CurrentTriggerData->tg_trigtuple=trigtuple;
682+
CurrentTriggerData->tg_trigger=trigger[i];
683+
if (trigger[i]->tgfunc==NULL)
684+
fmgr_info(trigger[i]->tgfoid,&(trigger[i]->tgfunc),&nargs);
685+
(void) ((*(trigger[i]->tgfunc)) ());
686+
}
687+
CurrentTriggerData=NULL;
688+
pfree(SaveTriggerData);
689+
pfree(trigtuple);
603690
return;
604691
}
605692

606693
HeapTuple
607-
ExecBRUpdateTriggers(Relationrel,ItemPointertupleid,HeapTupletuple)
694+
ExecBRUpdateTriggers(Relationrel,ItemPointertupleid,HeapTuplenewtuple)
608695
{
696+
TriggerData*SaveTriggerData;
697+
intntrigs=rel->trigdesc->n_before_row[TRIGGER_EVENT_UPDATE];
698+
Trigger**trigger=rel->trigdesc->tg_before_row[TRIGGER_EVENT_UPDATE];
699+
HeapTupletrigtuple;
700+
HeapTupleoldtuple;
701+
HeapTupleintuple=newtuple;
702+
intnargs;
703+
inti;
609704

610-
return (tuple);
705+
trigtuple=GetTupleForTrigger(rel,tupleid, true);
706+
if (trigtuple==NULL)
707+
return (NULL);
708+
709+
SaveTriggerData= (TriggerData*)palloc(sizeof(TriggerData));
710+
SaveTriggerData->tg_event=
711+
TRIGGER_EVENT_UPDATE |TRIGGER_EVENT_ROW |TRIGGER_EVENT_BEFORE;
712+
SaveTriggerData->tg_relation=rel;
713+
for (i=0;i<ntrigs;i++)
714+
{
715+
CurrentTriggerData=SaveTriggerData;
716+
CurrentTriggerData->tg_trigtuple=trigtuple;
717+
CurrentTriggerData->tg_newtuple=oldtuple=newtuple;
718+
CurrentTriggerData->tg_trigger=trigger[i];
719+
if (trigger[i]->tgfunc==NULL)
720+
fmgr_info(trigger[i]->tgfoid,&(trigger[i]->tgfunc),&nargs);
721+
newtuple= (HeapTuple) ((*(trigger[i]->tgfunc)) ());
722+
if (newtuple==NULL)
723+
break;
724+
elseif (oldtuple!=newtuple&&oldtuple!=intuple)
725+
pfree(oldtuple);
726+
}
727+
CurrentTriggerData=NULL;
728+
pfree(SaveTriggerData);
729+
pfree(trigtuple);
730+
return (newtuple);
611731
}
612732

613733
void
614-
ExecARUpdateTriggers(Relationrel,ItemPointertupleid,HeapTupletuple)
734+
ExecARUpdateTriggers(Relationrel,ItemPointertupleid,HeapTuplenewtuple)
615735
{
736+
TriggerData*SaveTriggerData;
737+
intntrigs=rel->trigdesc->n_after_row[TRIGGER_EVENT_UPDATE];
738+
Trigger**trigger=rel->trigdesc->tg_after_row[TRIGGER_EVENT_UPDATE];
739+
HeapTupletrigtuple;
740+
intnargs;
741+
inti;
742+
743+
trigtuple=GetTupleForTrigger(rel,tupleid, false);
744+
Assert(trigtuple!=NULL);
616745

746+
SaveTriggerData= (TriggerData*)palloc(sizeof(TriggerData));
747+
SaveTriggerData->tg_event=
748+
TRIGGER_EVENT_UPDATE |TRIGGER_EVENT_ROW;
749+
SaveTriggerData->tg_relation=rel;
750+
for (i=0;i<ntrigs;i++)
751+
{
752+
CurrentTriggerData=SaveTriggerData;
753+
CurrentTriggerData->tg_trigtuple=trigtuple;
754+
CurrentTriggerData->tg_newtuple=newtuple;
755+
CurrentTriggerData->tg_trigger=trigger[i];
756+
if (trigger[i]->tgfunc==NULL)
757+
fmgr_info(trigger[i]->tgfoid,&(trigger[i]->tgfunc),&nargs);
758+
(void) ((*(trigger[i]->tgfunc)) ());
759+
}
760+
CurrentTriggerData=NULL;
761+
pfree(SaveTriggerData);
762+
pfree(trigtuple);
617763
return;
618764
}
765+
766+
staticHeapTuple
767+
GetTupleForTrigger(Relationrelation,ItemPointertid,boolbefore)
768+
{
769+
ItemIdlp;
770+
HeapTupletuple;
771+
PageHeaderdp;
772+
Bufferb;
773+
774+
b=ReadBuffer(relation,ItemPointerGetBlockNumber(tid));
775+
776+
if (!BufferIsValid(b))
777+
elog(WARN,"GetTupleForTrigger: failed ReadBuffer");
778+
779+
dp= (PageHeader)BufferGetPage(b);
780+
lp=PageGetItemId(dp,ItemPointerGetOffsetNumber(tid));
781+
782+
Assert(ItemIdIsUsed(lp));
783+
784+
tuple= (HeapTuple)PageGetItem((Page)dp,lp);
785+
786+
if (before)
787+
{
788+
if (TupleUpdatedByCurXactAndCmd(tuple))
789+
{
790+
elog(NOTICE,"GetTupleForTrigger: Non-functional delete/update");
791+
ReleaseBuffer(b);
792+
return (NULL);
793+
}
794+
795+
if (!(tuple=heap_tuple_satisfies(lp,relation,b,dp,
796+
NowTimeQual,0, (ScanKey)NULL)))
797+
{
798+
ReleaseBuffer(b);
799+
elog(WARN,"GetTupleForTrigger: (am)invalid tid");
800+
}
801+
}
802+
803+
tuple=heap_copytuple(tuple);
804+
ReleaseBuffer(b);
805+
806+
return (tuple);
807+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp