From: Tom Lane Date: Wed, 30 Apr 2008 23:28:37 +0000 (+0000) Subject: Fix nodeTidscan.c to not trigger an error if the block number portion of X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=0eaefa6a21f40c34c41a078ddd68935e70005fb6;p=users%2Fbernd%2Fpostgres.git 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. --- diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c index 42f7254767..7a1f5cdaf7 100644 --- a/src/backend/executor/nodeTidscan.c +++ b/src/backend/executor/nodeTidscan.c @@ -54,11 +54,20 @@ 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 @@ -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; } }