Avoid possible crash in contrib/bloom's blendscan().
It's possible to begin and end an indexscan without ever calling amrescan. contrib/bloom, unlike every other index AM, allocated its "scan->opaque" storage at amrescan time, and thus would crash in amendscan if amrescan hadn't been called. We could fix this by putting in a null-pointer check in blendscan, but I see no very good reason why contrib/bloom should march to its own drummer in this respect. Let's move that initialization to blbeginscan instead. Per report from Jeff Janes.
This commit is contained in:
parent
7c979c95a3
commit
e13ac5586c
|
@ -29,9 +29,16 @@ IndexScanDesc
|
|||
blbeginscan(Relation r, int nkeys, int norderbys)
|
||||
{
|
||||
IndexScanDesc scan;
|
||||
BloomScanOpaque so;
|
||||
|
||||
scan = RelationGetIndexScan(r, nkeys, norderbys);
|
||||
|
||||
so = (BloomScanOpaque) palloc(sizeof(BloomScanOpaqueData));
|
||||
initBloomState(&so->state, scan->indexRelation);
|
||||
so->sign = NULL;
|
||||
|
||||
scan->opaque = so;
|
||||
|
||||
return scan;
|
||||
}
|
||||
|
||||
|
@ -42,23 +49,10 @@ void
|
|||
blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
|
||||
ScanKey orderbys, int norderbys)
|
||||
{
|
||||
BloomScanOpaque so;
|
||||
BloomScanOpaque so = (BloomScanOpaque) scan->opaque;
|
||||
|
||||
so = (BloomScanOpaque) scan->opaque;
|
||||
|
||||
if (so == NULL)
|
||||
{
|
||||
/* if called from blbeginscan */
|
||||
so = (BloomScanOpaque) palloc(sizeof(BloomScanOpaqueData));
|
||||
initBloomState(&so->state, scan->indexRelation);
|
||||
scan->opaque = so;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (so->sign)
|
||||
pfree(so->sign);
|
||||
}
|
||||
if (so->sign)
|
||||
pfree(so->sign);
|
||||
so->sign = NULL;
|
||||
|
||||
if (scankey && scan->numberOfKeys > 0)
|
||||
|
|
Loading…
Reference in New Issue