|
27 | 27 | * |
28 | 28 | * |
29 | 29 | * IDENTIFICATION |
30 | | - * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.107 2000/01/26 05:56:21 momjian Exp $ |
| 30 | + * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.108 2000/02/03 00:02:58 tgl Exp $ |
31 | 31 | * |
32 | 32 | *------------------------------------------------------------------------- |
33 | 33 | */ |
@@ -596,19 +596,19 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate) |
596 | 596 | estate->es_rowMark=NULL; |
597 | 597 | if (parseTree->rowMark!=NULL) |
598 | 598 | { |
599 | | -Relationrelation; |
600 | | -Oidrelid; |
601 | | -RowMark*rm; |
602 | 599 | List*l; |
603 | | -execRowMark*erm; |
604 | 600 |
|
605 | 601 | foreach(l,parseTree->rowMark) |
606 | 602 | { |
607 | | -rm=lfirst(l); |
608 | | -relid=rt_fetch(rm->rti,rangeTable)->relid; |
609 | | -relation=heap_open(relid,RowShareLock); |
| 603 | +RowMark*rm=lfirst(l); |
| 604 | +Oidrelid; |
| 605 | +Relationrelation; |
| 606 | +execRowMark*erm; |
| 607 | + |
610 | 608 | if (!(rm->info&ROW_MARK_FOR_UPDATE)) |
611 | 609 | continue; |
| 610 | +relid=rt_fetch(rm->rti,rangeTable)->relid; |
| 611 | +relation=heap_open(relid,RowShareLock); |
612 | 612 | erm= (execRowMark*)palloc(sizeof(execRowMark)); |
613 | 613 | erm->relation=relation; |
614 | 614 | erm->rti=rm->rti; |
@@ -756,6 +756,7 @@ EndPlan(Plan *plan, EState *estate) |
756 | 756 | { |
757 | 757 | RelationInfo*resultRelationInfo; |
758 | 758 | RelationintoRelationDesc; |
| 759 | +List*l; |
759 | 760 |
|
760 | 761 | /* |
761 | 762 | * get information from state |
@@ -796,10 +797,20 @@ EndPlan(Plan *plan, EState *estate) |
796 | 797 | } |
797 | 798 |
|
798 | 799 | /* |
799 | | - * close the "into" relation if necessary |
| 800 | + * close the "into" relation if necessary, again keeping lock |
800 | 801 | */ |
801 | 802 | if (intoRelationDesc!=NULL) |
802 | 803 | heap_close(intoRelationDesc,NoLock); |
| 804 | + |
| 805 | +/* |
| 806 | + * close any relations selected FOR UPDATE, again keeping locks |
| 807 | + */ |
| 808 | +foreach(l,estate->es_rowMark) |
| 809 | +{ |
| 810 | +execRowMark*erm=lfirst(l); |
| 811 | + |
| 812 | +heap_close(erm->relation,NoLock); |
| 813 | +} |
803 | 814 | } |
804 | 815 |
|
805 | 816 | /* ---------------------------------------------------------------- |
@@ -926,16 +937,16 @@ lnext:; |
926 | 937 | elseif (estate->es_rowMark!=NULL) |
927 | 938 | { |
928 | 939 | List*l; |
929 | | -execRowMark*erm; |
930 | | -Bufferbuffer; |
931 | | -HeapTupleDatatuple; |
932 | | -TupleTableSlot*newSlot; |
933 | | -inttest; |
934 | 940 |
|
935 | 941 | lmark:; |
936 | 942 | foreach(l,estate->es_rowMark) |
937 | 943 | { |
938 | | -erm=lfirst(l); |
| 944 | +execRowMark*erm=lfirst(l); |
| 945 | +Bufferbuffer; |
| 946 | +HeapTupleDatatuple; |
| 947 | +TupleTableSlot*newSlot; |
| 948 | +inttest; |
| 949 | + |
939 | 950 | if (!ExecGetJunkAttribute(junkfilter, |
940 | 951 | slot, |
941 | 952 | erm->resname, |
|