diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-12-03 05:51:03 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-12-03 05:51:03 +0000 |
commit | a98871b7ac601b4ebe6ba050b1f9cbfdd5d71ded (patch) | |
tree | 14a0b7c6a91cf05fc5556a6dcb00246ff11b0e6a /src/backend/executor/execUtils.c | |
parent | 1cf65140d07527e01c56164caefb5eb0c8106480 (diff) | |
download | postgresql-a98871b7ac601b4ebe6ba050b1f9cbfdd5d71ded.tar.gz postgresql-a98871b7ac601b4ebe6ba050b1f9cbfdd5d71ded.zip |
Tweak indexscan machinery to avoid taking an AccessShareLock on an index
if we already have a stronger lock due to the index's table being the
update target table of the query. Same optimization I applied earlier
at the table level. There doesn't seem to be much interest in the more
radical idea of not locking indexes at all, so do what we can ...
Diffstat (limited to 'src/backend/executor/execUtils.c')
-rw-r--r-- | src/backend/executor/execUtils.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index c814b971472..500ff0f4f27 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.130 2005/12/02 20:03:40 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/executor/execUtils.c,v 1.131 2005/12/03 05:51:01 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -694,6 +694,28 @@ ExecAssignScanTypeFromOuterPlan(ScanState *scanstate) */ /* ---------------------------------------------------------------- + * ExecRelationIsTargetRelation + * + * Detect whether a relation (identified by rangetable index) + * is one of the target relations of the query. + * ---------------------------------------------------------------- + */ +bool +ExecRelationIsTargetRelation(EState *estate, Index scanrelid) +{ + ResultRelInfo *resultRelInfos; + int i; + + resultRelInfos = estate->es_result_relations; + for (i = 0; i < estate->es_num_result_relations; i++) + { + if (resultRelInfos[i].ri_RangeTableIndex == scanrelid) + return true; + } + return false; +} + +/* ---------------------------------------------------------------- * ExecOpenScanRelation * * Open the heap relation to be scanned by a base-level scan plan node. |