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)
|
blbeginscan(Relation r, int nkeys, int norderbys)
|
||||||
{
|
{
|
||||||
IndexScanDesc scan;
|
IndexScanDesc scan;
|
||||||
|
BloomScanOpaque so;
|
||||||
|
|
||||||
scan = RelationGetIndexScan(r, nkeys, norderbys);
|
scan = RelationGetIndexScan(r, nkeys, norderbys);
|
||||||
|
|
||||||
|
so = (BloomScanOpaque) palloc(sizeof(BloomScanOpaqueData));
|
||||||
|
initBloomState(&so->state, scan->indexRelation);
|
||||||
|
so->sign = NULL;
|
||||||
|
|
||||||
|
scan->opaque = so;
|
||||||
|
|
||||||
return scan;
|
return scan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,23 +49,10 @@ void
|
||||||
blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
|
blrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys,
|
||||||
ScanKey orderbys, int norderbys)
|
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)
|
if (so->sign)
|
||||||
pfree(so->sign);
|
pfree(so->sign);
|
||||||
}
|
|
||||||
so->sign = NULL;
|
so->sign = NULL;
|
||||||
|
|
||||||
if (scankey && scan->numberOfKeys > 0)
|
if (scankey && scan->numberOfKeys > 0)
|
||||||
|
|
Loading…
Reference in New Issue