|
26 | 26 | *
|
27 | 27 | *
|
28 | 28 | * IDENTIFICATION
|
29 |
| - * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.269 2006/03/05 15:58:25 momjian Exp $ |
| 29 | + * $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.270 2006/04/30 18:30:38 tgl Exp $ |
30 | 30 | *
|
31 | 31 | *-------------------------------------------------------------------------
|
32 | 32 | */
|
@@ -452,6 +452,7 @@ InitPlan(QueryDesc *queryDesc, int eflags)
|
452 | 452 | Relation intoRelationDesc;
|
453 | 453 | bool do_select_into;
|
454 | 454 | TupleDesc tupType;
|
| 455 | + ListCell *l; |
455 | 456 |
|
456 | 457 | /*
|
457 | 458 | * Do permissions checks. It's sufficient to examine the query's top
|
@@ -486,7 +487,6 @@ InitPlan(QueryDesc *queryDesc, int eflags)
|
486 | 487 | * parseTree->resultRelations identifies them all
|
487 | 488 | */
|
488 | 489 | ResultRelInfo *resultRelInfo;
|
489 |
| - ListCell *l; |
490 | 490 |
|
491 | 491 | numResultRelations = list_length(resultRelations);
|
492 | 492 | resultRelInfos = (ResultRelInfo *)
|
@@ -549,26 +549,21 @@ InitPlan(QueryDesc *queryDesc, int eflags)
|
549 | 549 | * Have to lock relations selected FOR UPDATE/FOR SHARE
|
550 | 550 | */
|
551 | 551 | estate->es_rowMarks = NIL;
|
552 |
| - estate->es_forUpdate = parseTree->forUpdate; |
553 |
| - estate->es_rowNoWait = parseTree->rowNoWait; |
554 |
| - if (parseTree->rowMarks != NIL) |
| 552 | + foreach(l, parseTree->rowMarks) |
555 | 553 | {
|
556 |
| - ListCell *l; |
557 |
| - |
558 |
| - foreach(l, parseTree->rowMarks) |
559 |
| - { |
560 |
| - Index rti = lfirst_int(l); |
561 |
| - Oid relid = getrelid(rti, rangeTable); |
562 |
| - Relation relation; |
563 |
| - ExecRowMark *erm; |
564 |
| - |
565 |
| - relation = heap_open(relid, RowShareLock); |
566 |
| - erm = (ExecRowMark *) palloc(sizeof(ExecRowMark)); |
567 |
| - erm->relation = relation; |
568 |
| - erm->rti = rti; |
569 |
| - snprintf(erm->resname, sizeof(erm->resname), "ctid%u", rti); |
570 |
| - estate->es_rowMarks = lappend(estate->es_rowMarks, erm); |
571 |
| - } |
| 554 | + RowMarkClause *rc = (RowMarkClause *) lfirst(l); |
| 555 | + Oid relid = getrelid(rc->rti, rangeTable); |
| 556 | + Relation relation; |
| 557 | + ExecRowMark *erm; |
| 558 | + |
| 559 | + relation = heap_open(relid, RowShareLock); |
| 560 | + erm = (ExecRowMark *) palloc(sizeof(ExecRowMark)); |
| 561 | + erm->relation = relation; |
| 562 | + erm->rti = rc->rti; |
| 563 | + erm->forUpdate = rc->forUpdate; |
| 564 | + erm->noWait = rc->noWait; |
| 565 | + snprintf(erm->resname, sizeof(erm->resname), "ctid%u", rc->rti); |
| 566 | + estate->es_rowMarks = lappend(estate->es_rowMarks, erm); |
572 | 567 | }
|
573 | 568 |
|
574 | 569 | /*
|
@@ -1222,15 +1217,15 @@ lnext: ;
|
1222 | 1217 |
|
1223 | 1218 | tuple.t_self = *((ItemPointer) DatumGetPointer(datum));
|
1224 | 1219 |
|
1225 |
| - if (estate->es_forUpdate) |
| 1220 | + if (erm->forUpdate) |
1226 | 1221 | lockmode = LockTupleExclusive;
|
1227 | 1222 | else
|
1228 | 1223 | lockmode = LockTupleShared;
|
1229 | 1224 |
|
1230 | 1225 | test = heap_lock_tuple(erm->relation, &tuple, &buffer,
|
1231 | 1226 | &update_ctid, &update_xmax,
|
1232 | 1227 | estate->es_snapshot->curcid,
|
1233 |
| - lockmode, estate->es_rowNoWait); |
| 1228 | + lockmode, erm->noWait); |
1234 | 1229 | ReleaseBuffer(buffer);
|
1235 | 1230 | switch (test)
|
1236 | 1231 | {
|
@@ -2258,8 +2253,6 @@ EvalPlanQualStart(evalPlanQual *epq, EState *estate, evalPlanQual *priorepq)
|
2258 | 2253 | epqstate->es_param_exec_vals = (ParamExecData *)
|
2259 | 2254 | palloc0(estate->es_topPlan->nParamExec * sizeof(ParamExecData));
|
2260 | 2255 | epqstate->es_rowMarks = estate->es_rowMarks;
|
2261 |
| - epqstate->es_forUpdate = estate->es_forUpdate; |
2262 |
| - epqstate->es_rowNoWait = estate->es_rowNoWait; |
2263 | 2256 | epqstate->es_instrument = estate->es_instrument;
|
2264 | 2257 | epqstate->es_select_into = estate->es_select_into;
|
2265 | 2258 | epqstate->es_into_oids = estate->es_into_oids;
|
|
0 commit comments