|
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