diff options
author | Tom Lane | 2008-04-30 23:28:32 +0000 |
---|---|---|
committer | Tom Lane | 2008-04-30 23:28:32 +0000 |
commit | 772f63dd6a4d57bc082d701fab4f9cca281efdc1 (patch) | |
tree | 69a673c70457ae028c34b64fea01f44d0b2b661d /src/backend/executor/nodeTidscan.c | |
parent | ca0aecfdefbca04f2a6ed05044f9cafc3605389f (diff) |
Fix nodeTidscan.c to not trigger an error if the block number portion of
a user-supplied TID is out of range for the relation. This is needed to
preserve compatibility with our pre-8.3 behavior, and it is sensible anyway
since if the query were implemented by brute force rather than optimized
into a TidScan, the behavior for a non-existent TID would be zero rows out,
never an error. Per gripe from Gurjeet Singh.
Diffstat (limited to 'src/backend/executor/nodeTidscan.c')
-rw-r--r-- | src/backend/executor/nodeTidscan.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c index 1a126afc92f..a3bc45dfb7f 100644 --- a/src/backend/executor/nodeTidscan.c +++ b/src/backend/executor/nodeTidscan.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/nodeTidscan.c,v 1.58 2008/01/01 19:45:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/nodeTidscan.c,v 1.59 2008/04/30 23:28:32 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -54,12 +54,21 @@ TidListCreate(TidScanState *tidstate) { List *evalList = tidstate->tss_tidquals; ExprContext *econtext = tidstate->ss.ps.ps_ExprContext; + BlockNumber nblocks; ItemPointerData *tidList; int numAllocTids; int numTids; ListCell *l; /* + * We silently discard any TIDs that are out of range at the time of + * scan start. (Since we hold at least AccessShareLock on the table, + * it won't be possible for someone to truncate away the blocks we + * intend to visit.) + */ + nblocks = RelationGetNumberOfBlocks(tidstate->ss.ss_currentRelation); + + /* * We initialize the array with enough slots for the case that all quals * are simple OpExprs or CurrentOfExprs. If there are any * ScalarArrayOpExprs, we may have to enlarge the array. @@ -97,7 +106,9 @@ TidListCreate(TidScanState *tidstate) econtext, &isNull, NULL)); - if (!isNull && ItemPointerIsValid(itemptr)) + if (!isNull && + ItemPointerIsValid(itemptr) && + ItemPointerGetBlockNumber(itemptr) < nblocks) { if (numTids >= numAllocTids) { @@ -142,7 +153,8 @@ TidListCreate(TidScanState *tidstate) if (!ipnulls[i]) { itemptr = (ItemPointer) DatumGetPointer(ipdatums[i]); - if (ItemPointerIsValid(itemptr)) + if (ItemPointerIsValid(itemptr) && + ItemPointerGetBlockNumber(itemptr) < nblocks) tidList[numTids++] = *itemptr; } } |