*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.107 2000/01/26 05:56:21 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.108 2000/02/03 00:02:58 tgl Exp $
*
*-------------------------------------------------------------------------
*/
estate->es_rowMark = NULL;
if (parseTree->rowMark != NULL)
{
- Relation relation;
- Oid relid;
- RowMark *rm;
List *l;
- execRowMark *erm;
foreach(l, parseTree->rowMark)
{
- rm = lfirst(l);
- relid = rt_fetch(rm->rti, rangeTable)->relid;
- relation = heap_open(relid, RowShareLock);
+ RowMark *rm = lfirst(l);
+ Oid relid;
+ Relation relation;
+ execRowMark *erm;
+
if (!(rm->info & ROW_MARK_FOR_UPDATE))
continue;
+ relid = rt_fetch(rm->rti, rangeTable)->relid;
+ relation = heap_open(relid, RowShareLock);
erm = (execRowMark *) palloc(sizeof(execRowMark));
erm->relation = relation;
erm->rti = rm->rti;
{
RelationInfo *resultRelationInfo;
Relation intoRelationDesc;
+ List *l;
/*
* get information from state
}
/*
- * close the "into" relation if necessary
+ * close the "into" relation if necessary, again keeping lock
*/
if (intoRelationDesc != NULL)
heap_close(intoRelationDesc, NoLock);
+
+ /*
+ * close any relations selected FOR UPDATE, again keeping locks
+ */
+ foreach(l, estate->es_rowMark)
+ {
+ execRowMark *erm = lfirst(l);
+
+ heap_close(erm->relation, NoLock);
+ }
}
/* ----------------------------------------------------------------
else if (estate->es_rowMark != NULL)
{
List *l;
- execRowMark *erm;
- Buffer buffer;
- HeapTupleData tuple;
- TupleTableSlot *newSlot;
- int test;
lmark: ;
foreach(l, estate->es_rowMark)
{
- erm = lfirst(l);
+ execRowMark *erm = lfirst(l);
+ Buffer buffer;
+ HeapTupleData tuple;
+ TupleTableSlot *newSlot;
+ int test;
+
if (!ExecGetJunkAttribute(junkfilter,
slot,
erm->resname,